"creative" in supported_protocols and exposes the get_creative_delivery tool — whether that’s a dedicated creative service or a sales agent implementing the Creative Protocol.
Request Schema: /schemas/3.2.0-beta.7/creative/get-creative-delivery-request.json
Response Schema: /schemas/3.2.0-beta.7/creative/get-creative-delivery-response.json
Request Parameters
At least one scoping filter (media_buy_ids or creative_ids) is required.
* At least one of
media_buy_ids or creative_ids must be provided.
Response
Creative Object
Delivery metrics fields
Fields available on bothcreative.totals and each variant entry. Commonly-used subset — see the delivery-metrics schema for the full list including incrementality, brand lift, and broadcast metrics.
Spend-derived metrics. Sellers should not populateroasandcost_per_acquisitionon individualvariantobjects — spend cannot be attributed per-variant since it applies to the creative as a whole. These fields are meaningful only oncreative.totals.by_event_typeentries carrycountandvalueper event type, but not spend-derived rates.
Platform-conditional fields.dooh_metricsis present only for DOOH campaigns;ooh_metricsonly for static OOH campaigns. Engagement fields (engagements,follows,saves,profile_visits,engagement_rate) are platform-specific; not all sellers emit them on standardized fields — some usevariant.extfor engagement data instead.
Variant Object
Each variant row represents a specific execution within one source revision: a fixed creative (Tier 1), an asset combination the platform selected (Tier 2), or a generated variant (Tier 3). For catalog-driven packages, each catalog item rendered as a distinct ad execution is a variant — the variant’s manifest includes the catalog reference with the specific item rendered.creative_id, revision_id, and variant_id are separate namespaces. The
canonical build-to-delivery join is build_creative.variants[].build_variant_id
→ promoted creative_id → delivery creative_id. revision_id identifies the
immutable buyer-authored input state beneath that creative; for a seller
advertising creative.supports_revisions, variant_id is an agent-unique AdCP
served-execution identity. Every execution derived from
a revision carries that revision even when the seller transcodes or chooses
another equivalent delivery representation.
Revision attribution
Do not compare every row to the creative’s currentlist_creatives.revision_id.
A reporting window may contain executions from several accepted revisions; each
row carries the source revision that actually produced that execution.
Every row is revision-homogeneous: all of its metrics come from exactly one
source revision and, when localized, one locale. For an agent advertising
creative.supports_revisions, variant_id is agent-unique and MUST NOT be
reused for another creative, revision, locale, or rendered manifest; this keeps
preview_creative replay by
variant_id unambiguous when variant preview is supported. An adapter
whose native ad platform reuses an identifier maps each distinct execution to
a distinct AdCP variant_id and may retain the native identifier in ext.
variant_count counts distinct variant_id values before applying
max_variants. Tier 1 therefore has one row per revision and locale represented
in the requested period, not necessarily one row for the whole period. A seller
that cannot partition delivery this way cannot advertise
creative.supports_revisions: true.
For localized delivery, locale_variant_id is checked against the source
revision’s accepted localization topology, not only the current
list_creatives topology.
Localized delivery attribution
For a localized creative, every returned execution MUST includelocale_variant_id and that value MUST exist in the accepted localization
topology of the row’s source revision. When that revision is current, the value
therefore also exists in list_creatives.localization.variants[]; historical
rows are checked against buyer-retained sync state rather than a newer current
topology. This identifies the assets that
actually served after strict RFC 4647 Lookup, an explicit locale fallback, or
the default action and is required for every such path. When the selected
product format carries locale_policy, this value MUST also identify a variant
eligible under its accepted language ranges; buyer fallbacks and defaults never
bypass that seller constraint. variant_id remains the seller execution identity;
locale_variant_id is the buyer’s stable locale identity.
Derived metrics like ctr, completion_rate, roas, and cost_per_click are platform-calculated and may not equal naive division of their component fields due to rounding, attribution windows, or filtered impressions.
Tier Behavior
Tier 1: Standard Creatives
Within one source revision and locale, a standard creative maps 1:1 to one variant. A report spanning revision or locale boundaries contains distinct variant rows; a row’s metrics match the creative totals only when it is the sole row in the reporting period.Platform engagement metrics
Social and feed-native platforms include engagement data in theext field on each variant, since engagement types vary by platform:
ext field is not standardized across platforms — each platform defines its own engagement schema. Buyers aggregating across social platforms should map platform-specific fields to a common model.
Tier 2: Asset Group Optimization
Buyer provides multiple asset alternatives using a format withselection_mode: "optimize". Platform tests combinations and returns the manifest for each variant showing which assets were selected.
Tier 3: Generative Creative
Platform generates variants from brand manifest and input contexts. Themanifest contains the generated assets — which may differ entirely from what the buyer submitted.
When the publisher uses AdCP content standards, generation_context can include an artifact reference linking the variant to the specific content (article, video, etc.) that triggered generation. Platforms can also use ext for vendor-specific context structures.
Previewing Variants
Usepreview_creative with request_type: "variant" to see what a specific variant looked like when served:
manifest, you can also pass the manifest directly to preview_creative as a standard single request to re-render it.
Relationship to delivery reporting
Use
media_buy_id + creative_id as join keys to correlate data across both responses.
When a sales agent implements both protocols, both tasks are available on the same agent URL. See Creative capabilities on sales agents for the full pattern.
Cross-agent aggregation
When running campaigns across multiple sellers, callget_creative_delivery on each agent separately and correlate results:
- Join key: Use
creative_id(buyer-assigned) to correlate the same creative across agents. If you usedconcept_idduring upload, filter by concept to group related creatives. - Variant row scope: The published default scopes
variant_idto agent + creative. An agent advertisingcreative.supports_revisionsstrengthens this to agent-unique and immutable. In either case, use the structured tuple(agent_url, media_buy_id-or-null, creative_id, variant_id)as the globally scoped reporting row key;revision_idandlocale_variant_idare immutable attribution fields, not extensions of variant identity. - Timezone handling: Each agent may report in its own timezone via
reporting_period.timezone. Normalize to a common timezone before aggregating metrics. max_variantsselection: Agents choose which variants to return whenmax_variantslimits the result set. Most agents prioritize by impression volume (most-served first). For representative sampling, make multiple calls with different time ranges rather than relying on a single largemax_variantsvalue.
Building a cross-agent dashboard
When aggregating delivery data from multiple agents into a unified view, follow this sequence:-
Collect: Call
get_creative_deliveryon each agent in parallel, using the samecreative_idsfilter. -
Normalize timezones: Convert each agent’s
reporting_periodto a common timezone before summing. -
Merge by
creative_id: Group results bycreative_idacross agents. Sumtotals(impressions, spend, clicks). Do not average derived metrics likectr— recompute them from the summed components. -
Build a variant-row key: Serialize the structured tuple
agent_url + media_buy_id-or-null + creative_id + variant_id. Use actualnull, not string sentinels, so legitimate IDs cannot collide with absence. Distinct revisions and locales already have distinct agent-assignedvariant_idvalues. -
Group by
concept_id: For campaign-level roll-ups, useconcept_idto group related creatives across sizes and sellers. Pull the concept-to-creative mapping fromlist_creativeson each agent.
Capability declaration
Agents that support this task exposeget_creative_delivery in their tool surface and declare Creative Protocol support through get_adcp_capabilities:
get_adcp_capabilities surfaces. This applies to any endpoint implementing the Creative Protocol, including a sales agent with creative capabilities.