TMP for Buyer Agents
As a buyer agent, you receive Context Match and Identity Match requests from TMP Routers and respond with offers and eligibility decisions. You never send requests — publishers initiate every interaction through their router.What You Build
A buyer agent exposes a single HTTP/2 endpoint. The router sends JSON POST requests with atype field that distinguishes message types:
| Message type | Receives | Returns |
|---|---|---|
context_match_request | Page/content signals, placement, geo | Offers with creative manifests |
identity_match_request | Opaque user token, all active package IDs | Eligible package IDs + TTL |
type field. Both message types must respond in under 50ms. The router enforces this budget and will skip slow providers.
The adcp-go SDK provides Go types, request parsing, and response builders for both endpoints.
Prerequisites
Before TMP requests arrive, your packages must exist. A media buy contains one or more packages — TMP operates at the package level.- Create media buys via
create_media_buywith the publisher’s sales agent - Sync creatives via
sync_creativesso the publisher has your creative assets - Register as a TMP provider so the publisher’s router knows your endpoints
Responding to Context Match
The router sends you page context. You evaluate your active packages against that context and return offers for packages that match.- Look up your active packages for this
property_ridandplacement_id - Evaluate each package’s targeting against the context signals, geo, and artifact refs
- Return offers for packages that match, each with a creative manifest
Responding to Identity Match
The router sends you an opaque user token and a list of ALL your active package IDs for this publisher. You check each package’s eligibility rules against the token.- Resolve the opaque token against your identity graph (if you have one)
- Check frequency caps: has this user exceeded the package’s impression limit?
- Check audience rules: is this user in the target audience?
- Check suppression lists: should this user be excluded?
- Return eligibility for each package
ttl_sec tells the router how long to cache this response — during that window, the router returns cached eligibility without re-querying you. The publisher uses cached eligibility to allocate across whatever placements exist. Set the TTL based on how quickly your eligibility state changes (frequency caps, audience updates, etc.).
What you never receive in Identity Match: page URLs, content topics, keywords, article text, or any content signal. You cannot determine what the user is looking at.
Why you receive ALL packages, not just the ones that matched in Context Match: this prevents you from inferring what content the user is viewing. If you only received packages that matched the hiking article, you’d know the user was reading about hiking. Receiving all packages preserves structural separation.
The Join Happens Publisher-Side
You never see the combined result. The publisher’s router:- Intersects your Context Match offers with your Identity Match
eligible_package_ids - Only activates packages that appear in both responses
- Sets ad server targeting key-values for matched packages
- The ad server makes the final rendering decision
Frequency Cap Management
Cross-publisher frequency capping is the primary use case for Identity Match. Your agent maintains frequency state per user token:- Count impressions by user token + package ID
- Track recency — when was the last impression for this token?
- Apply caps from the media buy:
max_impressionsperwindow, minimumrecencybetween exposures - Exclude the package from
eligible_package_idswhen a cap is hit - Set
ttl_secto reflect how long this eligibility is valid — a shorter TTL means the router re-checks sooner, which is useful when a cap is close to being reached
Provider Registration
Provider registration is an out-of-band process. After establishing a media buy viacreate_media_buy, coordinate with the publisher to provide your TMP endpoint URL. This typically involves a commercial agreement and may require legal review, since the publisher will be sending content signals and identity tokens to your endpoint. The publisher then configures your provider entry in their router (see router deployment).
Error Handling
When your agent cannot evaluate a request, return an error response:- No matching packages: Return an empty
offersarray (not an error). This is the normal case when your packages don’t match the content. - Internal failure: Return an error response. The router skips your provider and proceeds with other providers.
- Timeout: If you can’t respond within the latency budget, the router skips you. No error response needed — the router handles this.
The TTL Caching Contract
Thettl_sec field on Identity Match responses is a caching contract between the buyer and the router:
- The router caches the response for
ttl_secseconds, keyed by{user_token, provider_id, hash(package_ids)} - During that window, the router returns cached eligibility without re-querying the buyer
- The publisher uses cached eligibility to allocate across whatever placements exist — a single pre-roll, a CTV ad pod, or a web page with multiple ad units
- The buyer doesn’t need to know how many placements exist or how the publisher allocates
Performance Requirements
| Metric | Target |
|---|---|
| Agent-side processing | < 30ms p95 |
| End-to-end (publisher → router → agent → router → publisher) | < 50ms p95 |
| Availability | 99.9% |
| Error rate | < 0.1% |
Measurement
The publisher reports delivery viaget_media_buy_delivery. Your agent queries delivery data to reconcile impressions, track pacing, and update frequency state.
TMP does not define an impression callback — the buyer learns about impressions through delivery reporting, not real-time pixel fires. Update your exposure store from delivery reports to keep cross-publisher frequency caps current.
What’s Different from OpenRTB
| OpenRTB | TMP | |
|---|---|---|
| You receive | Full bid request (user + content + device) | Either content OR identity, never both |
| You return | Bid price | Offer (creative manifest) or eligible package IDs + TTL |
| Auction | Exchange runs auction | No auction — publisher joins locally |
| Frequency | Per-DSP only | Cross-publisher via Identity Match |
| Integration | Per-exchange SSP adapter | Single endpoint, any surface |