Identity and Privacy
Identity graph architecture: how to build a first-party identity graph
Published · Last updated
Next scheduled review:
An identity graph is a store of identifiers, such as emails, logins, device IDs and cookies, linked to the person or household they belong to. A first-party identity graph builds those links from your own consented data, then translates them into IDs partners accept, such as UID2, EUID, RampID and ID5. This page shows the architecture, step by step.
Contents
Key facts
- The bid request now says how an ID was matched. OpenRTB 2.6 gives each extended ID an
inserter, amatcherand a match methodmm, where 3 means authenticated, 4 observed first-party and 5 inferred (OpenRTB 2.6, section 3.2.27; AdCOM 1.0, List: ID Match Methods). The latest release is 2.6-202606, published on 11 June 2026 (openrtb2.x releases). - Hashing rules decide whether IDs match. UID2 requires you to normalise an email, hash it with SHA-256 and Base64-encode the raw bytes before sending it; done out of order, the result cannot be matched (UID2 docs, updated 5 November 2026).
- The largest deterministic graph changed owner. Publicis Groupe completed its acquisition of LiveRamp, owner of RampID, on 2 November 2026 (Publicis Groupe, 2 November 2026). A proposed FTC consent order requires LiveRamp to stay neutral toward rival agencies' clients (PPC Land, 2 November 2026).
- Consent frameworks name the graph functions. The IAB Europe Global Vendor List, version 184 of 5 November 2026, lists "Match and combine data from other data sources" and "Link different devices" as features vendors must disclose (GVL v3, 5 November 2026).
- Chrome's Topics API is being removed in stages. Chrome replaced Topics with a stub in Chrome 152, reached 1% of Stable users on Chrome 153 by 24 September 2026, and asked to reach 100% after 15 October 2026 (blink-dev thread).
Definition
Identity graph: a data structure whose nodes are identifiers and whose edges record evidence that two identifiers belong to the same person, device or household. Each edge carries its source, method, time, confidence and permitted uses. The process that builds it is identity resolution, a form of entity resolution applied to people.
A first-party graph differs from a vendor graph in one way that matters. You decide which evidence counts and which uses are allowed, and you can prove it. A vendor graph gives you an answer, while your own graph also gives you the reason.
What an identity graph stores: nodes, edges and clusters
Think of three layers. Nodes are identifiers you have observed. Edges are claims that two nodes belong together. Clusters are the groups of nodes you treat as one person or one household. Most mistakes come from storing clusters without the edges that justify them.
7 of 7 rows
SHA-256 of a normalised address | Login, newsletter, checkout | Long | Normalise before hashing, per the UID2 rules below | |
Phone hash | SHA-256 of an E.164 number | Loyalty, SMS opt-in | Long | Same discipline as email |
Customer or account ID | CRM key | Your own systems | Long | The strongest first-party anchor |
First-party cookie or local ID | Publisher cookie, SharedID | Site visits | Weeks to months | Browser-scoped |
Mobile or CTV ad ID | IFA from the device OS | Apps | Resettable |
|
Partner ID | UID2, EUID, RampID, ID5 ID | Partner calls | Varies by provider | Store as a node with its own consent state |
Household | Derived cluster | Graph output | Recomputed | See household graph |
- Example
SHA-256 of a normalised address
- Typical source
Login, newsletter, checkout
- Lifetime
Long
- Notes
Normalise before hashing, per the UID2 rules below
Phone hash
- Example
SHA-256 of an E.164 number
- Typical source
Loyalty, SMS opt-in
- Lifetime
Long
- Notes
Same discipline as email
Customer or account ID
- Example
CRM key
- Typical source
Your own systems
- Lifetime
Long
- Notes
The strongest first-party anchor
First-party cookie or local ID
- Example
Publisher cookie, SharedID
- Typical source
Site visits
- Lifetime
Weeks to months
- Notes
Browser-scoped
Mobile or CTV ad ID
- Example
IFA from the device OS
- Typical source
Apps
- Lifetime
Resettable
- Notes
device.ifain OpenRTB
Partner ID
- Example
UID2, EUID, RampID, ID5 ID
- Typical source
Partner calls
- Lifetime
Varies by provider
- Notes
Store as a node with its own consent state
Household
- Example
Derived cluster
- Typical source
Graph output
- Lifetime
Recomputed
- Notes
See household graph
Table by AdSovereign, CC BY 4.0.
Each edge should be a row you can audit. The record below is our recommended minimum, not a standard format. It shows a deterministic link between a login and a hashed email, created under consent, with a review date.
{
"edge_id": "e-000184",
"from_node": "crm:customer:58210",
"to_node": "hem:sha256:tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=",
"method": "deterministic",
"evidence": "authenticated_login",
"openrtb_mm": 3,
"confidence": 1.0,
"observed_at": "2026-11-02T14:05:00Z",
"expires_at": "2027-11-02T00:00:00Z",
"jurisdiction": "EU",
"legal_basis": "consent",
"allowed_uses": ["measurement", "personalised_ads"],
"consent_ref": "tcf:v2:cmp-312:2026-11-02",
"source_system": "web-login"
}The hash in to_node is the UID2 documentation's own worked value for user@example.com, which we reproduced locally (UID2 normalisation and encoding). The openrtb_mm field copies the AdCOM code, so the same edge can explain a bid request later.
Deterministic vs probabilistic matching
Deterministic matching links two identifiers only when they share an exact key, such as a login or a normalised email hash. Probabilistic matching scores the likelihood that two records belong to the same person from weaker signals, such as name, postcode, IP address and timing. Both are legitimate. They answer different questions and carry different risks.
6 of 6 rows
Evidence | Shared login, hashed email or phone, customer ID | Scored agreement on several weak fields |
Precision | High, if inputs are clean | Depends on the threshold you choose |
Reach | Limited to authenticated users | Wider, including logged-out traffic |
OpenRTB | 3, authenticated | 5, inference |
Main failure | Shared or typo-ridden emails | Over-merging people who share a network |
Typical use | Activation, suppression, measurement | Reach extension, frequency capping |
Evidence
- Deterministic
Shared login, hashed email or phone, customer ID
- Probabilistic
Scored agreement on several weak fields
Precision
- Deterministic
High, if inputs are clean
- Probabilistic
Depends on the threshold you choose
Reach
- Deterministic
Limited to authenticated users
- Probabilistic
Wider, including logged-out traffic
OpenRTB mm value
- Deterministic
3, authenticated
- Probabilistic
5, inference
Main failure
- Deterministic
Shared or typo-ridden emails
- Probabilistic
Over-merging people who share a network
Typical use
- Deterministic
Activation, suppression, measurement
- Probabilistic
Reach extension, frequency capping
Table by AdSovereign, CC BY 4.0.
The trade-off is public. LiveRamp's documentation says its graph favours "accuracy and precision over reach" and that probabilistic graphs "may produce higher reach" with more false positives (LiveRamp, RampID methodology). ID5 says it uses machine learning on consented signals to link identifiers to people and households (company claim) (ID5 technology page, accessed 9 November 2026).
A worked probabilistic score
The standard model for scoring record pairs dates from Fellegi and Sunter in 1969 (Journal of the American Statistical Association, 1969). For each field you estimate two probabilities. The m value is the chance the field agrees when the records are a true match. The u value is the chance it agrees by coincidence. Agreement adds log2(m/u) to the score, and disagreement adds log2((1-m)/(1-u)).
3 of 3 rows
Last name | 0.95 | 0.01 | +6.57 | -4.31 |
Postcode | 0.90 | 0.02 | +5.49 | -3.29 |
Same IP /24 within 7 days | 0.60 | 0.001 | +9.23 | -1.32 |
Last name
- m
0.95
- u
0.01
- Weight if agree
+6.57
- Weight if disagree
-4.31
Postcode
- m
0.90
- u
0.02
- Weight if agree
+5.49
- Weight if disagree
-3.29
Same IP /24 within 7 days
- m
0.60
- u
0.001
- Weight if agree
+9.23
- Weight if disagree
-1.32
Table by AdSovereign, CC BY 4.0.
Pair A agrees on last name and postcode but not on IP, so it scores 6.57 + 5.49 - 1.32 = 10.74. Pair B shares only an IP range, so it scores -4.31 - 3.29 + 9.23 = 1.63. With a link threshold of 8, Pair A becomes an inferred edge with mm 5 and Pair B does not.
The m and u values here are illustrative; in production you estimate them from your own data. The open-source Splink library, maintained by the UK Ministry of Justice, implements this model and reached version 5.0.0 on 18 September 2026 (Splink on GitHub).
The ID resolution pipeline, step by step
A first-party resolution pipeline runs the same eight steps whether you build it or buy it. Managed services such as AWS Entity Resolution offer rule-based, machine-learning and data-provider matching, and normalise inputs by default (AWS Entity Resolution user guide).
- Ingest with consent attached. Each record arrives with its consent string or opt-out flag and its jurisdiction. Records without a usable permission go to a quarantine table, not into the graph.
- Normalise. Trim spaces, lowercase emails, apply provider rules such as removing dots and plus suffixes in gmail.com addresses, and format phones in E.164 (UID2 normalisation rules).
- Pseudonymise. Hash direct identifiers at the edge of your system and keep raw values in a separate, locked store. Under GDPR Article 4(5), pseudonymised data is still personal data if the extra information to re-identify it exists (GDPR, EUR-Lex).
- Block. Generate candidate pairs only within blocks, such as the same hashed email or the same postcode and surname initial. Comparing every record with every other does not scale.
- Score. Apply deterministic rules first, then the probabilistic model to the remaining candidates.
- Cluster with guardrails. Build connected components from accepted edges, but cap component size and refuse merges that rely only on network signals. One shared IP can join thousands of devices.
- Assign a stable person ID. Keep the ID of the largest prior cluster when clusters merge or split, so downstream systems do not see a new person every night.
- Translate and publish. Generate partner IDs (UID2 tokens, EUID tokens, RampIDs, ID5 IDs) for the nodes allowed to carry them, and publish to activation, measurement and the clean room.
Graph storage: what to choose
Identity graphs have two very different workloads. Building the graph is a batch job over every edge. Serving it is a lookup that must answer in milliseconds inside a bid or a page load. Most teams separate the two.
5 of 5 rows
Edge store (system of record) | Relational or lakehouse table of edges, partitioned by date | Audit, deletion, recomputation | Needs a batch job to build clusters |
Cluster build | Connected components in Spark or SQL; or a managed service | Nightly or hourly rebuilds | Giant components from shared IPs or shared emails |
Graph database | Property graph store | Exploring paths, debugging merges | Not needed on the bid path |
Serving store | Key-value lookup from node to person ID and partner IDs | Real-time enrichment | Must expire and delete in step with the edge store |
Managed resolution | AWS Entity Resolution, with up to 20 data inputs per workflow | Teams without a matching team | Data and rules sit inside the provider's service (AWS user guide) |
Edge store (system of record)
- Option
Relational or lakehouse table of edges, partitioned by date
- Good for
Audit, deletion, recomputation
- Watch out for
Needs a batch job to build clusters
Cluster build
- Option
Connected components in Spark or SQL; or a managed service
- Good for
Nightly or hourly rebuilds
- Watch out for
Giant components from shared IPs or shared emails
Graph database
- Option
Property graph store
- Good for
Exploring paths, debugging merges
- Watch out for
Not needed on the bid path
Serving store
- Option
Key-value lookup from node to person ID and partner IDs
- Good for
Real-time enrichment
- Watch out for
Must expire and delete in step with the edge store
Managed resolution
- Option
AWS Entity Resolution, with up to 20 data inputs per workflow
- Good for
Teams without a matching team
- Watch out for
Data and rules sit inside the provider's service (AWS user guide)
Table by AdSovereign, CC BY 4.0.
Keep the edge table as the source of truth. Clusters and serving keys are derived data, so you can rebuild them after a model change or a deletion. A retailer with a loyalty programme, for example, can rebuild its households nightly from login and address edges while its ad server reads a cache that is at most one day old.
Consent propagation: every edge carries its permissions
Consent belongs on the edge, not on the profile. A person can agree to measurement on one site and refuse personalised ads on another. If you store a single flag per person, you will either over-use or under-use data.
The consent standards name the graph operations directly. The TCF Global Vendor List defines three features that vendors must disclose: "Match and combine data from other data sources", "Link different devices" and "Identify devices based on information transmitted automatically". They are Features 1, 2 and 3 in version 184 of 5 November 2026 (GVL v3). In the US, the GPP string carries state opt-outs instead. The field-level details are in GPP and TCF implementation for engineers.
Client-side tools enforce some of this for you. With Prebid's User ID module and a TCF consent module, nothing is written to cookies or local storage if consent for Purpose 1 is missing. A change in consent data refreshes every ID submodule (Prebid.org, User ID module). Prebid's activity controls can also block enrichEids, which adds IDs to requests, and transmitEids, which sends them to a bidder (Prebid.org, activity controls).
Opt-outs must flow the other way too. When a person opts out of UID2, publishers calling the token endpoints get an opt-out response, DSPs receive opt-outs through a webhook, and advertisers see them through the identity map endpoint (UID2 user opt-out). Your graph needs the same path. Mark the node, drop it from partner translation, and delete the edges that relied on it.
Interoperability with UID2, EUID, RampID and ID5
Your person ID stays internal. Partners see an ID they recognise, and each one is built differently. The table summarises what each provider documents; capability claims are the providers' own.
6 of 6 rows
Input | Email or phone (UID2) | Email or phone (EUID) | PII and devices matched to people (LiveRamp) | Consented signals linked by machine learning (ID5) |
Method | Deterministic | Deterministic | Deterministic (company description) | Deterministic and probabilistic (company description) |
Consent basis | Local rules such as CCPA and CPRA | GDPR and the TCF | Per LiveRamp contracts | Per ID5 contracts and the TCF |
EID |
|
|
|
|
How it changes | Secret salts rotate across over a million buckets (UID2 glossary) | Same model as UID2 | RampIDs can change when PII is added; no old-to-new mapping is provided | n/d |
Owner on 9 Nov 2026 | Open-source framework | Open-source framework | Publicis Groupe | ID5 |
Input
Method
- UID2
Deterministic
- EUID
Deterministic
- RampID
Deterministic (company description)
- ID5 ID
Deterministic and probabilistic (company description)
Consent basis
- UID2
Local rules such as CCPA and CPRA
- EUID
GDPR and the TCF
- RampID
Per LiveRamp contracts
- ID5 ID
Per ID5 contracts and the TCF
EID source in Prebid
- UID2
uidapi.com- EUID
euid.eu- RampID
liveramp.com- ID5 ID
id5-sync.com
How it changes
- UID2
Secret salts rotate across over a million buckets (UID2 glossary)
- EUID
Same model as UID2
- RampID
RampIDs can change when PII is added; no old-to-new mapping is provided
- ID5 ID
n/d
Owner on 9 Nov 2026
- UID2
Open-source framework
- EUID
Open-source framework
- RampID
Publicis Groupe
- ID5 ID
ID5
Table by AdSovereign, CC BY 4.0.
EID sources are those listed by Prebid's User ID module (Prebid.org). Scale claims differ in kind. LiveRamp says it maintains PII on 245 million individuals in the US (company claim) (LiveRamp). ID5 says its graph covers over 1.3 billion individuals and 770 million households (company claim) (ID5, accessed 9 November 2026). Neither figure is independently audited.
RampID has four types, shown by its first two letters: maintained (XY), derived (Xi), placeholder (Xc or Xm) and household (hY) (LiveRamp). Store the type with the node, because a derived RampID may later become a maintained one. LiveRamp's advice is to overwrite the old value and keep the data you attached to the device. The LiveRamp clean room profile covers its collaboration products.
When the IDs reach a bid request, they travel in user.eids. The example below shows one authenticated ID per provider. The inserter is the publisher, and the mm values follow AdCOM. IDs are placeholders.
{
"user": {
"eids": [
{
"source": "uidapi.com",
"inserter": "publisher.example",
"matcher": "publisher.example",
"mm": 3,
"uids": [{ "id": "AgAAAAVacu1uAxgAxH+HJ8+nWlS2H4uVqr6i", "atype": 3 }]
},
{
"source": "liveramp.com",
"inserter": "publisher.example",
"matcher": "liveramp.com",
"mm": 3,
"uids": [{ "id": "XY1000placeholderRampID", "atype": 3 }]
},
{
"source": "id5-sync.com",
"inserter": "publisher.example",
"matcher": "id5-sync.com",
"mm": 5,
"uids": [{ "id": "ID5*placeholder", "atype": 1 }]
}
]
}
}One rule from the implementation guide matters most. An ID that arrived with mm 3, 4 or 5 keeps that match method when you forward it. This holds even if your own link came from a cookie sync (OpenRTB implementation guide, section 7.12). Cookie sync mechanics are covered in Prebid Server cookie sync, and the rest of the bid request in OpenRTB 2.6 explained.
Privacy controls that belong in the architecture
Privacy controls are cheaper to design in than to bolt on. These are the ones we would not ship without.
- Separate keys from data. Raw emails and phones sit in a vault with its own access list. The graph only ever sees hashes. UID2 applies the same idea with secret salts kept in its core service (UID2 glossary).
- Purpose on every edge. Store allowed uses on each edge and check them at read time, not only at ingest.
- Expiry by design. Edges from cookies and device IDs expire. LiveRamp keeps devices for 90 days (LiveRamp); choose and document your own windows.
- Minimum audience size. Release audience counts and segments only above a threshold, the idea behind k-anonymity.
- Deletion that reaches derived data. A deletion removes edges, rebuilds the affected cluster, refreshes the serving store and stops partner translation.
- Access logs. Log who read which cluster and why. This is your evidence when a regulator or a partner asks.
Regulators are still refining the rules on hashing. The European Data Protection Board consulted on Guidelines 01/2025 on pseudonymisation until 14 March 2025 (EDPB). Treat a hashed email as personal data unless your counsel says otherwise.
What changed in Chrome, and what did not
Third-party cookies remain in Chrome, but the Privacy Sandbox APIs are on their way out. For the Topics API, the removal plan moved. The owners first planned removal in Chrome 150. In June 2026 they proposed a stub in Chrome 152 and a staged rollout of the removal. On 24 September 2026 they reported that removal had reached 1% of Chrome 153 Stable users with no breakage. They asked to reach 100% after 15 October 2026 (blink-dev, "Intent to Deprecate and Remove: Topics API"). We could not confirm full rollout on 9 November 2026.
Our page on identity after Privacy Sandbox still shows the earlier Chrome 150 target for the Topics API; treat that milestone as out of date until the page is revised. The practical lesson is the same either way. A first-party graph does not depend on a browser API, which is why the identity and privacy hub treats it as the base layer, with partner IDs on top.
Common mistakes
- Hashing before normalising.
User@Example.comanduser@example.comproduce different hashes. Normalise first, every time. - Base64-encoding the hex string. UID2 expects Base64 of the 32 raw bytes, a 44-character string. Encoding the 64-character hex text gives an invalid value (UID2).
- Treating IP as a deterministic key. Shared networks join strangers. Use IP only as one weighted field, and label the result
mm5. - Unbounded transitive closure. If A links to B and B links to C, you may not want A linked to C. Cap cluster size and review the largest clusters weekly.
- Dropping the match method on the way out. Forward the incoming
mm, as the OpenRTB guidance requires. - One consent flag per person. Consent varies by site, purpose and law; store it per edge.
- Opt-outs that stop at the CRM. Push them to the serving store and to partner translation the same day.
- Treating a new RampID as a new person. LiveRamp may re-key a device; overwrite the ID and keep the history.
The RTB architecture hub links the bidder and bid request pages that consume these IDs, and first-party data strategy for publishers covers how to collect the inputs.
FAQ
What is an identity graph?
What is the difference between deterministic and probabilistic identity resolution?
Can I build an identity graph without third-party cookies?
How do UID2 and RampID differ?
How do I handle opt-outs in an identity graph?
How this works on owned infrastructure
The hard part of an identity graph is not the matching algorithm. It is proving, edge by edge, which evidence linked two records and which uses that person allowed. When resolution runs inside a vendor's graph, you receive the cluster but not the evidence. AdSovereign is an enterprise RTB stack (DSP, SSP, exchange, DMP and clean room) designed to run on infrastructure you control. Its DMP is built to keep the edge table, the consent references and the partner ID translations in your own environment, so a deletion or an opt-out can be traced through to the bidstream. The architecture page shows where the DMP and clean room sit, and the security page describes how keys and hashes are separated.
Sources
- IAB Tech Lab, OpenRTB 2.6 specification, sections 3.2.27 (EID) and 3.2.28 (UID) (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md
- IAB Tech Lab, openrtb2.x releases, 2.6-202606 (11 June 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/releases
- IAB Tech Lab, OpenRTB 2.x implementation guide, section 7.12 "ID Match Method Guidance" (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/implementation.md
- IAB Tech Lab, AdCOM 1.0, "List: ID Match Methods" and "List: Agent Types" (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md
- Unified ID 2.0, "Normalization and encoding" (updated 5 November 2026). https://unifiedid.com/docs/getting-started/gs-normalization-encoding
- Unified ID 2.0, "How the UID2 token is created" (updated 5 November 2026). https://unifiedid.com/docs/ref-info/ref-how-uid-is-created
- Unified ID 2.0, "Glossary" (salt, salt bucket) (accessed 9 November 2026). https://unifiedid.com/docs/ref-info/glossary-uid
- Unified ID 2.0, "User opt-out" (updated 5 November 2026). https://unifiedid.com/docs/getting-started/gs-opt-out
- Unified ID 2.0, "Unified ID 2.0 overview" (updated 5 November 2026). https://unifiedid.com/docs/intro
- European Unified ID, "EUID overview" (updated 2 November 2026). https://euid.eu/docs/intro
More sources (14)
- LiveRamp, "Interpreting RampID, LiveRamp's People-Based Identifier" (accessed 9 November 2026). https://docs.liveramp.com/identity/en/interpreting-rampid,-liveramp-s-people-based-identifier.html
- LiveRamp, "RampID Methodology" (accessed 9 November 2026). https://docs.liveramp.com/identity/en/rampid-methodology.html
- ID5, "Your Adaptive Identity Engine" technology page (accessed 9 November 2026). https://id5.io/technology/
- Prebid.org, "User ID Module" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/modules/userId.html
- Prebid.org, "Activity Controls" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/activity-controls.html
- IAB Europe, Global Vendor List v3, version 184 (5 November 2026). https://vendor-list.consensu.org/v3/vendor-list.json
- I. P. Fellegi and A. B. Sunter, "A Theory for Record Linkage", Journal of the American Statistical Association 64 (1969). https://doi.org/10.1080/01621459.1969.10501049
- UK Ministry of Justice, Splink repository, release v5.0.0 (18 September 2026). https://github.com/moj-analytical-services/splink
- Amazon Web Services, "What is AWS Entity Resolution?" (accessed 9 November 2026). https://docs.aws.amazon.com/entityresolution/latest/userguide/what-is-service.html
- Publicis Groupe, "Publicis Groupe completes LiveRamp acquisition" (2 November 2026). https://www.publicisgroupe.com/en/news/press-releases/publicis-groupe-completes-liveramp-acquisition-launches-the-industry-s-first-plug-and-play-ai-growth-engine-that-clients-fully-own-and-control
- PPC Land, "Publicis acquires LiveRamp, the data hub its agency rivals rely on" (2 November 2026). https://ppc.land/publicis-acquires-liveramp-the-data-hub-its-agency-rivals-rely-on/
- Chromium blink-dev, "Intent to Deprecate and Remove: Topics API" (thread from 7 November 2025; updates 11 June, 24 September and 30 September 2026). https://groups.google.com/a/chromium.org/g/blink-dev/c/_R85yctz4Rs
- Regulation (EU) 2016/679 (GDPR), Article 4(5), EUR-Lex. https://eur-lex.europa.eu/eli/reg/2016/679/oj
- European Data Protection Board, "Guidelines 01/2025 on Pseudonymisation", public consultation (comments until 14 March 2025). https://www.edpb.europa.eu/our-work-tools/documents/public-consultations/2025/guidelines-012025-pseudonymisation_en