TMP for CTV
Connected TV apps compose ad pods — sequences of ads that fill commercial breaks during streaming content. Pod composition means activating multiple packages simultaneously while respecting competitive separation, frequency limits, and duration constraints. TMP handles package activation and identity eligibility; the broadcaster’s ad server handles pod assembly.How It Works Today
Broadcasters manage CTV deals through their ad server (FreeWheel, Google Ad Manager, SpringServe). Each deal is configured with targeting rules, competitive separation constraints, and creative rotation logic. Pod composition is handled by the ad server’s pod optimization engine. There is no standard way for buyer agents to provide real-time input on which packages to activate or which creative variants to prefer for a specific pod.The Four Messages
A CTV ad break involves four TMP messages: a context match request and response (what content is playing, which packages match), then an identity match request and response (is this household eligible). The publisher joins the results locally to compose the pod.Context Match Request
When a pod break approaches, the broadcaster sends a context match request. Theplacement_id identifies the ad break position (e.g., pre_roll, mid_roll_1, pod_break_2). The artifact_refs reference the show and episode, which buyer agents use for content-level targeting. No package list is sent — the provider uses its synced package set for this placement.
- Artifacts reference show and episode by industry ID. The buyer agent can match on the show (“The Night Kitchen” is a cooking drama, good fit for food brands) via its Gracenote ID, the specific episode via its EIDR, or both.
- No package list is sent per request. The provider evaluates all eligible packages for this placement using its synced package set from media buy setup. The same packages are evaluated for every household — filtering by household happens in identity match.
- Creative support is declared on the product’s
trusted_matchconfig. When a product’s config includes creative response types, buyer agents return creative manifests so the broadcaster can render directly.
Context Match Response
Each buyer agent evaluates the content context and responds with offers for packages it wants to activate. The router merges all responses. Here two buyers activated:creative_manifest typically references a VAST URL rather than including the creative inline. Video assets are large; the manifest points to the external asset and the broadcaster’s ad server fetches it at render time.
Identity Match Request
Separately, the broadcaster sends an identity match request with a household token. Thepackage_ids list includes ALL active packages for each buyer — not just the ones in this pod break. This prevents a buyer from correlating the identity request with a specific context request by comparing package sets.
Identity Match Response
Each buyer agent evaluates the household token against its own data (frequency caps, audience membership, purchase history) and returns the IDs of eligible packages plus a TTL. The buyer does not disclose the reasons — the publisher only needs to know whether the household qualifies.ttl_sec: 90 covers the duration of the ad break — the router uses cached eligibility to fill all pod slots without re-querying. The publisher extracts only the package IDs relevant to the current pod.
Pod Composition
The broadcaster now has two sets of results and composes the pod locally:- Filter by context activation. Only packages with offers from context match are candidates: Sparklean (30s) and Greenleaf (15s). Vaultline and Driftmoto did not activate.
- Filter by identity eligibility. Of the context-activated packages, check household eligibility: Sparklean is eligible, Greenleaf is eligible. Both pass.
- Rank eligible offers. Use the ad server’s own priority and pacing rules to rank the eligible offers.
- Apply competitive separation. The broadcaster’s ad server enforces competitive separation rules — two brands in the same advertiser category cannot appear in the same pod. Sparklean (cleaning) and Greenleaf (grocery) are in different categories, so no conflict.
- Assemble the pod. Fill the available duration. A typical mid-roll pod might be 60 seconds:
- Slot 1 (30s): Sparklean — context match, household eligible
- Slot 2 (15s): Greenleaf — context match, household eligible
- Remaining 15s: filled by other demand sources (programmatic, house ads)
SSAI Integration
Server-side ad insertion (SSAI) is the dominant CTV delivery model. The TMP Router runs server-side alongside the SSAI engine, keeping the entire activation flow off the client device.- Flow. The SSAI engine receives a pod break signal from the content stream, queries the TMP Router for context and identity matches, receives offers, and stitches VAST creatives into the stream before delivery.
- Creative delivery. The
creative_manifestin Context Match responses includes VAST URLs that the SSAI engine can fetch and splice directly. No client-side ad loading is required. - Latency budget. The SSAI engine’s overall ad insertion budget is typically 200-500ms (larger than client-side insertion), since stitching happens before stream delivery. The TMP Router still targets sub-50ms for its portion; the extra budget gives the SSAI engine time for VAST fetching and stream stitching.
- Companion ads. If the VAST response includes companion creatives, the SSAI engine can pass them to the CTV app’s display layer for rendering alongside the video content.
Show and Episode Artifact Refs
CTV artifacts typically reference both a show and a specific episode using industry-standard identifiers:- Show-level targeting. “Activate on any episode of The Night Kitchen” — the agent checks whether the Gracenote show ID is in its targeting rules.
- Episode-level targeting. “Activate only on the season premiere” — the agent checks the specific EIDR episode ID.
- Genre or topic targeting. The agent resolves genre and topic metadata from its cached artifact data. This works for broad category targeting without hard-coding specific show IDs in targeting rules.