- Publisher properties — WHERE the ad runs (youtube.com, spotify.com)
- Collections / installments — WHAT CONTENT the ad runs in or around (a specific series and its installments)
- Placements — WHAT POSITION the ad appears in (pre-roll, mid-roll, host read)
Channel mapping
The collection/installment model maps to familiar concepts across media channels:
The
kind field on each collection indicates how to interpret it and its installments.
The collection object
A collection is a persistent, publisher-controlled content program that produces installments over time. It is not a social “collection ad,” user conversation, session, prompt, turn, or inferred topic cluster. Collections work like properties — publishers declare them in theiradagents.json, and products reference them via collections selectors with publisher_domain and collection_ids.
Programmed channels and owner-sold carriage
FAST describes a channel’s carriage and monetization model, not a distinct kind of inventory. AdCP represents the underlying programmed audio or video stream as achannel collection. The same structure applies to FAST, virtual linear,
and syndicated audio channels. This preserves three independent inventory axes:
- the host CTV app is the property where the ad runs;
- the programmed channel is the collection whose content surrounds the ad;
- pre-roll, mid-roll, or another avail is the placement within the product.
adagents.json.
Each distribution entry can name both the host properties carrying the
channel and identifiers used by the host or an independent metadata system:
platform_channel_id is the generic fallback for a host-assigned channel
identifier. Its namespace is the enclosing publisher_domain; the stable
identity is therefore (publisher_domain, value). Because the tuple is what
identifies the channel, this type is only meaningful inside a distribution
entry: it MUST NOT appear in bare {type, value} identifier lists
(distribution_ids sources, exclude_distribution_ids filters), where a
value like 1005 would silently collide across hosts. Use the platform’s
stable catalog identifier, not an EPG position number — hosts renumber
lineups. Use a more specific identifier type when one exists.
A distribution entry carries property_ids, identifiers, or both.
Distributions SHOULD include identifiers whenever the host assigns one, and
consumers MUST NOT assume identifiers is present — a property-only entry is
valid, and is the shape an owner ships when the host has not yet published
identifiers to cite.
The owner’s distribution declaration is a discoverability claim, not sales
authorization. For verified owner-sold carriage, the host’s adagents.json
authorizes the owner’s sales agent for the host property and narrows that grant
to the owner’s canonical collection:
seller_inline, so the host does not have to enumerate
the channel owner’s avail definitions:
authorized_agents entry matching the host property scope and the owner’s
collection selector. Missing host authorization fails closed. Dangling
references fail closed the same way: a distribution[].property_ids value that
does not resolve to a property in the host’s adagents.json MUST be treated as
unverified carriage.
A host that carries many of one owner’s channels does not need to track the
owner’s collection IDs. A collection selector without collection_ids is a
bulk grant: it scopes the authorization to every collection declared in
that publisher’s adagents.json. This matches how carriage deals are
structured — the host’s contract is with the owner, not with each channel —
and avoids a cross-company ID-sync dependency that would silently break the
supply path when the owner renames a collection:
placement_ids
and placement_tags resolve against placements published in the host’s own
adagents.json; they never match a seller’s seller_inline placements, which
live in the owner’s namespace. A host that must constrain positions therefore
publishes those placement definitions itself, and owner products MUST reference
them via kind: "publisher_ref" into the host namespace. seller_inline
placements and host placement narrowing are mutually exclusive on the same
supply path — owner-sold carriage without position constraints is the shape
that keeps hosts out of the owner’s avail definitions.
Verification states
The host attestation will roll out unevenly — channel owners have a direct incentive to publish; hosts publish on their own schedule. Buyer agents SHOULD distinguish three states rather than inventing their own interim policy:- Verified owner-sold. The host’s
adagents.jsonauthorizes the seller for the host property, narrowed by the owner’s collection selector (exact or bulk grant). Full supply-path verification; suitable for enforcement. - Host-delegated. The host has not published a collection-narrowed
adagents.jsonentry, but itsapp-ads.txt(orads.txt) names the owner viainventorypartnerdomain=, and the owner’s ownadagents.jsonnames the sales agent and the channel collection. Theinventorypartnerdomainline is host-authored, so it is genuine host-side evidence that the owner sells some of this property’s inventory — but it binds neither the agent URL nor the collection, so it MUST NOT be treated as equivalent to the collection-narrowed entry. Buyers MAY accept this state under their own policy, the way DSPs ran ads.txt grace periods. - Owner-attested. Only the owner’s
distribution[]entry asserts carriage. This is discovery data with no host-side corroboration; buyers MUST NOT treat it as sales authorization.
inventorypartnerdomain line they typically already publish.
Two verified paths can legitimately overlap. In a revenue-share deal the
host’s agent and the owner’s agent may both offer avails on the same property
and collection; in an inventory-split deal they sell disjoint avails.
Verification implies neither exclusivity nor disjointness — buyers dedup at
delivery and measurement, as with any multi-path supply. A host that wants the
split machine-readable can tag its retained avails with placement_tags.
Multiple parties with sales rights do not require a new concurrency primitive.
The host publishes one authorized_agents[] entry per sales path and narrows
each entry to the relevant collection. A technology provider does not become a
rights-holder merely by operating the path. If it supplies software behind the
owner’s endpoint, the path may remain direct; if it operates the sales
endpoint on the owner’s behalf, the host names that endpoint and marks the path
delegated.
Syndication chains with an aggregator in the middle (owner → playout/ad-tech
aggregator → host, common for FAST outside the owner’s home market) collapse
to the same shape: the host attests each terminal sales path directly. When
the aggregator holds the sales rights for its inventory share, the host
authorizes the aggregator’s agent — delegated, narrowed to the owner’s
collection (the bulk-grant selector fits here, since the host may know the
owner only through the aggregator). There is no transitive attestation: a host
entry naming the aggregator does not authorize agents the aggregator engages
downstream; each selling endpoint the buyer can transact with needs its own
host entry. The aggregator, holding both contracts, is the natural broker of
the collection selector values.
Internal allocation terms such as revenue shares, buyback rights, and backfill
priority are not discovery or authorization data. Each seller applies those
terms when constructing and pricing its products; buyers see the resulting
offer, not how the participating parties divide the proceeds.
The installment object
An installment is a specific installment of a collection. Not all installments will be known in advance — a weekly podcast may only have next week’s installment scheduled, and some installments may be tentative (a playoff Game 7 depends on Game 6).Episode status lifecycle
Expected transitions:
scheduled or tentative → live → aired or published. A scheduled installment may become postponed (delayed) or cancelled. A postponed installment returns to scheduled when rescheduled. A tentative installment resolves to scheduled, cancelled, or postponed.
Inheritance from collections
Episodes inherit collection-level fields they do not override:content_rating: Episode value overrides collection baseline. When absent, the collection’s rating applies.special: Episode value overrides collection-level special. When absent, the collection’s special applies. A regular collection can have event-anchored installments (e.g., a daily news collection with an election night special).guest_talent: Additive to the collection’s recurringtalent— does not replace it.topics: Additive context for brand safety, not a replacement for the collection’sgenre.
Installment deadlines
Episodes can carry booking, cancellation, and material submission deadlines. These apply to any channel where inventory is tied to a scheduled unit — print issues, podcast installments, influencer posts, linear TV airings, DOOH rotations.
Deadlines MUST be chronologically ordered:
booking_deadline ≤ cancellation_deadline ≤ each material_deadlines[n].due_at (ascending by array index) ≤ the installment’s scheduled_at. Buyer agents SHOULD reject installments where deadlines violate this ordering.
Each material deadline has:
The two-stage pattern — draft then final — covers a wide range of channels:
Podcast with deadlines
Print issue with deadlines
Influencer post with deadlines
Deadline policy
High-frequency collections (daily newspapers, weekly podcasts) would generate large payloads if every installment carried explicit deadlines. Thedeadline_policy on a collection declares lead-time rules that agents use to compute deadlines from each installment’s scheduled_at.
Daily newspaper with policy
Instead of enumerating deadlines for every issue, the collection declares the rule once:scheduled_at: "2026-04-01"), an agent computes:
- Booking deadline: 4 business days before = March 26
- Cancellation deadline: 3 business days before = March 27
- Material due: 2 business days before = March 28
deadlines override the policy. A special edition with tighter turnaround declares its own deadlines; regular issues inherit from the policy.
Weekly podcast with policy
Policy vs explicit deadlines
When both are present, explicit installment
deadlines take precedence. An agent SHOULD NOT compute deadlines from the policy for installments that have their own.
Specials and limited series
Collections can carry optional annotations that signal their nature to buyer agents. These are composable — a collection can be both a special and a limited series (e.g., a 4-installment Olympics documentary).Specials
A special is content anchored to a real-world event or occasion. Thespecial object can appear on both collections and installments. On a collection, it means the entire collection is event-anchored. On an installment, it means that specific installment is event-anchored (and overrides the collection-level special when present, following the same inheritance pattern as content_rating).
special field is distinct from cadence. Cadence describes release frequency (event = one-time or occasional). The special object describes what real-world event anchors the content and when it happens — information a buyer agent needs to evaluate timing relevance and premium pricing.
Limited series
A limited series is a bounded content run with a defined arc. Unlike ongoing series, limited series have a planned end.limited_series field is distinct from season: a collection can have seasons without being limited (ongoing series have seasons too), and a limited series is a structural commitment that the collection has a planned end.
How products reference collections
Products reference collections viacollections — an array of {publisher_domain, collection_ids} selectors that point to collections declared in the publisher’s adagents.json. This is the same pattern as publisher_properties. Buyers resolve full collection objects from the publisher’s adagents.json. Episodes are listed per-product in the installments array, since different products may scope different installments of the same collection.
Reporting actual delivery
Discovery and delivery answer different questions. A collection’sdistribution metadata or a product’s property selectors say where content is carried or sellable. After purchase, get_media_buy_delivery can report by_collection, by_property, and by_installment marginals. Those independent arrays do not prove a relationship between their rows. Products that declare supports_collection_property_breakdown can return by_collection_property, whose rows are affirmative evidence that a collection actually delivered on a specific property. For a scheduled airing, episode, issue, or programming block, supports_installment_property_breakdown enables by_installment_property, proving that the specific installment delivered on the host property. This is the grain needed to distinguish the same programmed airing across two host apps without inferring delivery from catalog carriage. Collections and installments use publisher-scoped references; property rows use a publisher-scoped operational identifier and add a catalog property reference when one exists. If the response is truncated or suppressed, an absent intersection row proves nothing.
Run-of-collection (no specific installments)
A product can reference a collection without listing installments. This means “inventory across this collection, whatever installments air during the flight dates”:Specific installments
For premium or guaranteed buys, the seller scopes to specific installments:get_products response structure
Products reference collections viacollections selectors — the same pattern as publisher_properties. Each selector has a publisher_domain and collection_ids array pointing to collections declared in that publisher’s adagents.json. Buyers resolve full collection objects from adagents.json.
Canonical collection identity
A collection’s identity is{publisher_domain, collection_id} — scoped to the publisher that declares it in their adagents.json. This means any collection creator can serve as their own canonical registry.
Creator as canonical publisher
A creator like MrBeast declares collections inmrbeast.com/adagents.json. Any seller packaging that creator’s inventory — a YouTube sales house, a CTV distributor, the creator’s own team — references the same canonical source:
mrbeast.com + beast_games regardless of which seller or platform the inventory comes from. No cross-referencing of IMDb IDs or distribution identifiers needed — the creator’s domain is the registry.
When creators don’t publish adagents.json
Not every collection has a creator-owned domain. A streaming platform’s original series may only exist in that platform’sadagents.json. In that case, the platform is the canonical publisher and collections points to their domain. Distribution identifiers on the collection object handle cross-seller matching when the same collection appears on multiple platforms without a single canonical source.
Identity resolution priority
Buyer agents should resolve collection identity in this order:- Canonical publisher —
publisher_domain+collection_idfrom the creator’s ownadagents.json. Strongest signal. - Platform-independent identifiers —
imdb_id,gracenote_id,eidr_idfrom the collection’sdistributionarray. Reliable cross-reference when no canonical publisher exists. - Platform-specific identifiers — Spotify, Apple, YouTube IDs. Useful within a platform but not universal.
Discovery examples
CTV collection with installments
A streaming platform selling sponsorships against a known collection with upcoming installments:Related collections and derivative content
A streaming platform offering a main collection and its companion after-collection, plus highlight clips:derivative_of. The companion after-collection is linked via related_collections on the main collection — buyers targeting Nova Kitchen can discover the after-collection as an additional reach opportunity.
Podcast with distribution
A podcast network selling across multiple distribution platforms. The collection’sdistribution array in adagents.json captures the full distribution footprint; buyers use distribution identifiers for cross-seller matching:
Live event with tentative installments
A sports league selling sponsorships against a live event series. Live broadcasts useflexible_end because game duration is unpredictable, and unplanned_breaks because ad breaks follow game flow (timeouts, period breaks) rather than a fixed schedule. The tentative Game 5 depends on the series outcome — it only happens if neither team wins in four games.
cadence: "event" signals a non-recurring series, flexible_end tells buyers the broadcast length is approximate, and unplanned_breaks: true indicates ad breaks follow game flow rather than a predetermined schedule. The tentative Game 5 includes valid_until so buyer agents know when to re-query — if the series ends in four games, that installment will resolve to cancelled. Buyers should always check valid_until on tentative installments before committing budget.
Discovering collections
Buyers discover collections through the standardget_products workflow. Natural language briefs drive collection selection:
collections selectors. The buyer resolves full collection objects from each publisher’s adagents.json. Registry clients can also bootstrap and look up the crawled collection catalog through /api/registry/catalog/collections/sync and /api/registry/catalog/collections/distribution, which is useful for cross-referencing platform aliases such as YouTube channel IDs back to the publisher-declared collection.
For community-maintained entries, registry moderators can seed a publisher-scoped collection with PUT /api/registry/catalog/collections/{publisher_domain}/{collection_id}. This creates a contributed registry record and emits the same collection.created / collection.updated feed events. It does not replace publisher-origin proof: once the publisher declares the collection in their own adagents.json, the authoritative declaration wins.
Brand safety
Collections provide a two-level brand safety model: a collection baseline and per-installment overrides.Collection baseline
A collection’s default brand safety profile comes from:content_rating— the collection’s declared rating system and valuegenre— content categories (ideally usinggenre_taxonomyfor machine-readable evaluation)talent— hosts and recurring cast, with optional brand.json references for deeper evaluation
Installment overrides
When installment details are available, they can shift the safety profile:- A
content_ratingthat differs from the collection baseline (this week is TV-14 instead of TV-PG) guest_talentthat changes the talent profile (a controversial guest)topicsthat add installment-specific content signals
What is not modeled
AdCP does not predict content safety for unknown future installments. A buyer who commits to “all April installments” buys based on the collection’s baseline profile, accepting variation. The seller’s content standards and the collection’s track record are the buyer’s basis for that decision.Distribution identifiers
Each collection’sdistribution array maps it to specific publisher platforms using host property_ids, platform identifiers, or both. Identifiers enable cross-seller matching: when two different sellers both offer products for the same collection, a buyer agent can match them via shared identifiers.
Cross-seller matching
Platform-independent identifiers are the most reliable for deduplication:
Collections SHOULD include at least one platform-independent identifier when available.
Platform-specific identifiers
apple_podcast_id, spotify_collection_id, rss_url, podcast_guid, amazon_music_id, iheart_id, podcast_index_id. Available video/CTV types: youtube_channel_id, youtube_channel_handle, youtube_channel_url, youtube_playlist_id, amazon_title_id, platform_channel_id, roku_channel_id, pluto_channel_id, tubi_id, peacock_id, tiktok_id, twitch_channel. Other: domain, substack_id. For YouTube channels, youtube_channel_id is the preferred canonical identifier; handles and URLs are aliases for discovery and matching when the channel ID is not yet resolved.
Ad inventory
Episodes declare break-based ad inventory in thead_inventory object:
For non-break ad formats like host reads, custom integrations, or sponsorships, use product placements instead. A podcast product might have a placement for “mid-roll host read (60s)” — that is a placement on the product, not part of
ad_inventory.
Relationship to LEAP
The installment model aligns with IAB Tech Lab’s LEAP Forecasting API for live streaming events:
LEAP targets SSP-to-DSP plumbing. AdCP operates at the agent-to-agent negotiation layer where buying decisions happen.
Collection targeting
Products with multiple collections default to bundles — the buyer gets all listed collections. Sellers can setcollection_targeting_allowed: true to let buyers target a subset, the same pattern as property_targeting_allowed for properties.
Selection travels in
targeting_overlay.collection_selection, mirroring
placement_selection: mode: "selected" names the complete required set as
domain-qualified selectors with explicit collection_ids (the domain-only
bulk-grant form is authorization scoping, not selection), and
mode: "default" accepts the product’s full bundle. Buyers who manage
selection through lists keep using collection_list /
collection_list_exclude refs.
collection_selection is also the audit surface: sellers
MUST echo the committed collection selection there as concrete selectors —
including the materialized result of any collection_list composition — so a
buyer can verify what content programming a package runs against without
re-resolving mutable lists or re-fetching the product catalog. A purchase made
with mode: "default" therefore reads back as mode: "selected" naming the
product’s complete bundle; the default branch carries no selectors and
cannot satisfy the echo. For a channel
buy this is the readback of the one axis that makes the product distinct: the
channel itself.
Multi-collection bundles
A single product can span multiple collections by listing multiple collection IDs incollections. When a product has multiple collections, each installment MUST include canonical collection_ref so the buyer agent knows both the parent collection and its publisher namespace. The deprecated collection_id shorthand is only unambiguous for single-namespace products.
Print publication with issues
A magazine publisher selling display ads across upcoming issues. Each issue is an installment with deadlines for booking, cancellation, and material delivery:deadlines object replaces what the German OBS system handles through separate message exchanges — booking, cancellation, and material delivery are all visible upfront.
See also
- Media products — the full product model
- Print ads — print-specific creative formats, physical dimensions, bleed, and DPI
- brand.json — talent identity and brand safety evaluation
- Product discovery — how buyers discover inventory via
get_products