Context Match and Identity Match
TMP defines two operations. They are independent by design — processed in separate infrastructure, carrying different data, answering different questions. The publisher joins their results to make the final activation decision. This page walks through both operations and the join using a concrete example.The Scenario
A retail publisher has three active AdCP media buys from a buyer agent. Each media buy contains packages:- Package A: Sponsored products — coffee brands, carousel format, available on search and category pages
- Package B: Homepage takeover — premium display, available on the homepage only
- Package C: Seasonal promotion — iced beverages, native format, available site-wide during summer
Context Match
The publisher sends a Context Match request to the TMP Router, which fans out to each buyer’s agent. The request contains the page context. It contains no user identity and no package list — the buyer agent uses its synced package set for this placement.What the publisher sends
What the buyer responds
The buyer agent evaluates each package against the context. Package B is homepage-only, so it does not match a search results page. Packages A and C match. The buyer returns an offer for each.package_id and optionally a brand, price, summary, creative_manifest, and macros. The summary gives the publisher enough to judge relevance. When the creative manifest is present inline, the publisher has everything needed to render. For large creatives (e.g., VAST video), the manifest references external assets via URLs rather than embedding them. The response also includes enrichment signals — audience segments and targeting key-values — that the publisher can pass to their ad server.
What Context Match never carries
- User IDs (hashed or otherwise)
- Device identifiers
- Session tokens
- IP addresses
- Any data that could identify a specific user
Identity Match
Separately — and with a random time delay — the publisher sends an Identity Match request to the TMP Router, which fans out to each buyer’s agent. The request contains an opaque user token and the list of packages to evaluate. It contains no page context.What the publisher sends
user_token comes from an existing identity provider (ID5, LiveRamp, UID2) or is generated by the publisher. The uid_type tells the buyer which identity graph to resolve against, avoiding trial-and-error matching. The consent object carries the user’s consent signal — buyers in regulated jurisdictions MUST NOT process the token without it. The token is opaque to the buyer — the buyer can map it to their own identity graph (if they have a match), but cannot reverse it to PII or correlate it with any page context.
Note what is absent: no URL, no search query, no content signals, no topic IDs. The buyer agent evaluates this request based purely on user identity and package eligibility.
What the buyer responds
ttl_sec: 60 tells the router: “Cache this for 60 seconds.” The router uses this cached eligibility to fill whatever placements exist — a single slot, a CTV ad pod, or a page with multiple ad units — without re-querying the buyer. The publisher decides how to allocate across placements.
What Identity Match never carries
- Page URLs
- Content hashes
- Search queries
- Topic IDs
- Content ratings
- Any data that could identify what the user is looking at
The Publisher-Side Join
The publisher now has two independent responses. They join them on their own infrastructure — neither the buyer agents nor the router see the joined result.The Offer Model
TMP’s response model is the offer. An offer carries apackage_id (required) and optional fields: brand, price, summary, creative_manifest, and macros (a key-value map for dynamic values).
Simple case (GAM/Prebid): The offer carries package_id. The publisher flows package_id via targeting_kvs signals to GAM for line item matching. The macros map carries dynamic values (e.g., sponsor labels, promo text) that GAM can insert into the creative at render time.
Rich case (AI assistants, dynamic retail): The offer includes a summary (“50% off cold brew — recipe integration”) so the publisher can judge relevance, and an inline creative_manifest with everything needed to render. For large creatives (e.g., VAST video), the manifest references external assets via URLs rather than embedding the full payload.
Dynamic brands: When the product supports dynamic_brands, the buyer can include a brand on the offer, selecting from their portfolio at match time rather than being locked to a pre-configured package brand.
Variable pricing: When the product supports variable pricing, the buyer can include a price on the offer.
The creative manifest carries catalog items, text, images, and everything else needed for rendering. This reuses the existing CreativeManifest schema.
Attribution tracking happens via delivery reporting or clean room integration, not via a real-time tracking token. The publisher reports which packages were delivered; attribution is reconciled out-of-band.
Enrichment Signals
Context Match responses can include enrichment signals alongside package activation:- Segments: Audience or contextual segments (e.g., “coffee_enthusiast”, “high_purchase_intent”) that flow into the publisher’s ad server as targeting signals.
- Targeting key-values: Arbitrary key-value pairs (e.g.,
category_affinity=beverages) that the publisher can use for line item targeting, reporting breakdowns, or real-time decisioning.
Package List Management
Identity Match sends ALL active package IDs for a given buyer — not just those that matched in Context Match. This is intentional: it prevents the buyer from correlating which packages matched the page content. If the buyer only received packages that matched a hiking article, they’d know the user was reading about hiking. Package lists update when new media buys are created viacreate_media_buy. The router maintains the active package list per buyer, derived from the buyer’s media buy history with the publisher.
In Context Match, the optional package_ids field can narrow evaluation when the publisher has a specific reason — for example, CTV pod composition where only video packages apply. This does not affect Identity Match, which always sends ALL active packages.
Stale packages from expired or cancelled media buys should be removed from the active list within 1 hour. The router is responsible for this cleanup.