AdCP 3.0 Proposal - This specification is under development for AdCP 3.0. Feedback welcome via GitHub Discussions.
Canonical formats in 3.1: this page describes the v1 specification model. For the canonical-formats model (inlineStatus: Request for Comments Last Updated: March 2026 The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.format_optionson products,validate_inputprimitive), see canonical-formats and the migration guide.
Abstract
The Creative Protocol defines a standard interface for creative format discovery, manifest validation, creative generation, and preview rendering. This protocol enables AI agents to discover format specifications, build compliant creative assets, and generate previews across advertising platforms.Protocol overview
The Creative Protocol provides:- Format discovery with full technical specifications
- Manifest validation against format requirements
- AI-powered creative generation and transformation
- Preview rendering for creative verification
- Universal macros for cross-platform tracking
Transport requirements
Creative agents MUST support at least one of the following transports:
Creative agents SHOULD support MCP as the preferred transport.
Creative agents MUST declare Creative Protocol support via
get_adcp_capabilities:
creative capabilities tell the buyer which interaction models this agent supports. See Interaction models below.
Core concepts
Creative agents
A creative agent is any agent that implements the Creative Protocol. This includes standalone services (ad servers, creative management platforms, generative tools) and sales agents that declare"creative" in supported_protocols. A creative agent:
- Defines and documents formats it owns
- Validates manifests against format requirements
- Generates previews showing how creatives will render
- Optionally generates or transforms creatives from natural language briefs
Interaction models
Creative agents serve different roles depending on their capabilities. Buyers useget_adcp_capabilities to determine which interaction model applies:
These models compose — an agent can support multiple. A creative ad server with
supports_generation: true and has_creative_library: true can both generate creatives from briefs and retrieve existing ones from its library. The supports_compliance flag is orthogonal — any interaction model can support compliance requirements in briefs.
Buyer workflow by model:
- Transformation:
list_creative_formats→build_creative(withcreative_manifest+target_format_id) - Generation:
list_creative_formats→build_creative(withmessage+target_format_id) - Library retrieval:
list_creatives→build_creative(withcreative_id+target_format_id)
pricing_options on list_creative_formats, and returns pricing in build_creative responses. Agents that persist creative_id on build output can also expose pricing on list_creatives. Free transformation agents remain stateless and unchanged.
Format authority
Each format has exactly one authoritative creative agent, identified by theagent_url in the format ID:
Formats
Formats define how assets are assembled and rendered. A format specifies:- Media family (display, video, audio, dooh)
- Required and optional asset types
- Technical constraints (dimensions, duration, file size, codecs)
- Rendering behavior and interaction expectations
Assets
Assets are the building blocks of creatives. Asset types include:- image: Static images (JPEG, PNG, WebP, GIF)
- video: Video files (MP4, WebM, MOV) or VAST tags
- audio: Audio files (MP3, M4A) or DAAST tags
- text: Headlines, descriptions, CTAs
- html: HTML5 creatives or third-party tags
- javascript: JavaScript tags
- url: Tracking pixels, clickthrough URLs
Manifests
Manifests pair format specifications with actual asset content. A manifest provides:- Format reference (agent_url + id)
- Asset values keyed by asset_id from the format
- Tracking URLs and macros
Universal macros
AdCP defines universal macros for cross-platform tracking. Creative agents MUST support these macros in tracking URLs:{TIMESTAMP}: Unix timestamp{CACHEBUSTER}: Random cache-busting value{CLICK_URL}: Click tracking URL{REDIRECT_URL}: Final destination URL
Creative Status Lifecycle
Schema:enums/creative-status.json
Creatives in a library progress through a defined set of states. Most transitions are seller-initiated (processing, review, approval/rejection). suspended is a recoverable offline state for approved creatives whose dependencies become unavailable, such as an expired published-post authorization. archived is reached either by buyer cleanup or by seller-side lifecycle policy on creatives without active assignments — see the rules below.
processing→pending_review: automatic when ingestion and transcoding succeedprocessing→rejected: automatic when processing fails (corrupt file, unsupported codec, constraint violation)pending_review→approved: seller approves after content policy reviewpending_review→rejected: seller rejects withrejection_reasonapproved→suspended: seller detects a recoverable dependency/authorization loss, such asidentity_authorization_revoked,identity_authorization_expired, orsource_privatefor apublished_postreference. Sellers MUST surface a correspondingimpairmenton affected active buys.suspended→approved: seller observes that the dependency is restored and any required re-review passes.suspended→rejected: seller determines that a previously recoverable dependency/authorization loss cannot be restored for this creative, or that replacement/resubmission is required. Example: a revoked identity/post authorization for apublished_postreference cannot be reauthorized. Sellers MUST keep affected active buys impaired until the creative is replaced, reassigned, or the package/buy is otherwise remediated.approved→archived(buyer-initiated): buyer issues archive viasync_creativesapproved→archived(seller-initiated): seller archives an unassigned creative for inactivity, post-flight expiry, or storage policy. Sellers MUST NOT seller-archive a creative that has active package assignments — theapproved→rejected(revocation) path with animpairmenton the affected buy is the only conformant route when active serving is involved. State-change observability for seller-initiated archive follows the creative retention contract — minimally, the newstatusMUST be visible on the nextlist_creativesread.archived→approved: buyer-initiated viasync_creatives(unarchive). Sellers MAY require re-review, transitioning topending_reviewinstead.rejected→processing: buyer fixes the creative and resubmits viasync_creatives. The creative re-enters the full processing and review pipeline.approved→pending_review: seller-initiated re-review (e.g., policy change). Sellers MUST notify subscribers viacreative.status_changed(fired to eachnotification_configs[]subscriber whoseevent_types[]includes this value — see below) when a previously approved creative is pulled back for re-review.
rejected creative for delivery (e.g., assigning it to a package) with error code CREATIVE_REJECTED. Creative agents MUST also prevent delivery of suspended creatives until the dependency is restored.
Creative agents MUST include status and rejection_reason (when rejected) in list_creatives responses.
Lifecycle webhooks
Seller-initiated and system-initiated transitions fire push notifications against the account’snotification_configs[] subscribers — each entry whose event_types[] includes the fired type receives an independent fire. Two event types cover the surface:
creative.status_changed— fires on every seller-initiated or system-initiated transition:pending_review → approved/rejected,approved → pending_review(re-review),approved → suspended(recoverable dependency/authorization loss),suspended → approved(recovery),suspended → rejected(terminal dependency/authorization loss),approved → rejected(post-approval revocation),approved → archived(seller-initiated). Payload:creative-status-changed-webhook.json.creative.purged— fires when a creative is destroyed (retention sweep, takedown, legal erasure).softpurges retain a tombstone onlist_creatives(withinclude_purged: true) for 30 days;hardpurges retain no record — the webhook is the buyer’s only signal. Payload:creative-purged-webhook.json.
sync_creatives response path. The push channel exists only for transitions the buyer did not initiate.
Both events carry a categorical reason_code drawn from creative-event-reason-code.json. Buyer-side remediation per reason code is documented inline on the enum’s enumDescriptions.
When a creative transitions to a state that breaks active serving (approved → suspended, approved → rejected, suspended → rejected, or seller-initiated approved → archived while assignments exist — which is non-conformant; see the transition rules above), the seller MUST also surface a corresponding impairment on every media buy referencing the creative (see Media buy health). The creative-side creative.status_changed and the buy-side impairment are paired but distinct signals; buyers correlate by creative_id. The two surfaces have different anchors: creative events fire account-level (subscriptions outlive any one buy); impairments fire per-buy. No ordering guarantee between the paired fires — buyers MUST NOT assume one arrives before the other; reconcile via the snapshot (list_creatives and get_media_buys).
Sellers declare which event types they support and per-type coalescence windows via get_adcp_capabilities. Default coalescence is 5 minutes for creative.status_changed; sellers MUST NOT coalesce creative.purged. Retroactive contract: when a seller declares support for these event types, the obligation covers all creatives in the library — no grace period for pre-existing creatives.
Buyers MAY pull recent webhook fires per creative via list_creatives with include_webhook_activity: true. The read surface follows the webhook_activity[] adoption checklist — 30-day retention, three-state presence semantics, idempotency_key correlation to buyer-side endpoint logs.
Pricing
Creative agents that charge for their services expose pricing through the same discover → build → report loop used by signals agents and content standards agents.Pricing discovery surfaces
Pricing is discovered via two surfaces depending on the agent’s interaction model:list_creatives— ad servers and library-based agents exposepricing_options[]on each creative. The buyer discovers pricing for specific creatives they want to use.list_creative_formats— transformation and generation agents exposepricing_options[]on each format. The buyer discovers pricing for the formats the agent can produce, before any creative exists.
pricing_options[] array of vendor-pricing-option objects. Both require account and include_pricing: true on the request.
An agent MAY expose pricing on both surfaces (e.g., a creative management platform that has both a library and transformation capabilities).
Pricing flow
- Account setup — rate card agreed. Determines pricing for all subsequent operations.
- Discovery —
list_creativesorlist_creative_formatswithaccountandinclude_pricing: truereturnspricing_options[]. Vendors may offer multiple options (volume tiers, context-specific rates, different models per product line). - Build —
build_creativewithaccount. The agent computes the cost and returnspricing_option_id,vendor_cost,currency, andconsumptionin the response. - Report —
report_usagewithcreative_idandpricing_option_idfor reconciliation.
Pricing models
Creative agents reuse the vendor pricing models defined invendor-pricing-option.json:
Consumption details
Schema:core/creative-consumption.json
The build_creative response includes a consumption object with structured details about what was consumed. Well-known fields: tokens (LLM tokens consumed), images_generated, renders (render passes), duration_seconds (processing time). Agents MAY include additional fields.
The consumption object is informational — it lets the buyer verify that vendor_cost is consistent with the rate card. vendor_cost is the billing source of truth.
Accounts requirement
Creative agents that charge for their services MUST implement the Accounts Protocol. This applies to any creative agent with pricing — ad servers, generation platforms, and transformation agents that bill for usage.Bundled mode
When a publisher uses a creative agent internally (bundled), the buyer never sees the creative agent’s pricing. The cost is absorbed into product pricing. The sales agent is the buyer in the creative agent relationship — it establishes an account, callsbuild_creative, and handles report_usage. The protocol surface is the same.
Tasks
The Creative Protocol defines the following tasks. See task reference pages for complete request/response schemas and examples.list_creative_formats
Reference:list_creative_formats task
Discover creative formats and their specifications.
Requirements:
- Creative agents MUST return full format specifications for formats they own
- Creative agents MUST include
agent_urlidentifying the authoritative agent for each format - Creative agents MUST include technical constraints (dimensions, duration, file types) in format definitions
- Creative agents MAY include references to other creative agents providing additional formats
- When filtering by
format_ids, creative agents MUST return only the requested formats
list_transformers
Reference:list_transformers task
Discover the account-scoped transformers a creative agent offers — the creative analog of media-buy products: agent-offered, selectable units of build capability (voices, models, styles) that you select with transformer_id in build_creative. Offered only by agents that declare creative.supports_transformers: true in get_adcp_capabilities.
Requirements:
- Creative agents that set
creative.supports_transformers: trueMUST implementlist_transformers - Creative agents MUST resolve transformers, their enumerable option values, and pricing for the calling account — including custom values configured for that account (e.g. cloned voices)
- Creative agents MUST return account-scoped option values inline on
params[].options[]for eachfieldnamed inexpand_params, and SHOULD omit them otherwise - When
include_pricingis true, creative agents that charge MUST includepricing_options(theper_unitmodel) on each transformer
build_creative
Reference:build_creative task
Transform, generate, or retrieve creative manifests. Supports three modes:
- Generation: Create a manifest from a brief or seed assets
- Transformation: Adapt an existing manifest to a different format
- Library retrieval: Resolve a
creative_idfrom the agent’s library into a manifest with ad-serving assets (HTML/JavaScript/VAST tags)
- Creative agents MUST validate input manifests against format requirements
- Creative agents MUST return a valid manifest for the target format on success
- Creative agents MUST return validation errors if the transformation cannot be completed
- Creative agents SHOULD preserve tracking URLs and macros during transformation
- Creative agents SHOULD respect
qualityfor generative tasks ("draft"for fast iteration,"production"for final delivery) and MAY ignore it for non-generative transforms - Creative agents SHOULD honor
item_limitwhen present, using the lesser ofitem_limitand the format’smax_items - Creative agents MAY use AI/LLM processing for generation tasks
- When
creative_idis provided, creative agents MUST resolve the creative from their library - When
macro_valuesis provided, creative agents SHOULD substitute the specified macros in the output manifest’s assets and leave unresolved macros as{MACRO}placeholders - Creative agents MUST ignore unrecognized macro keys in
macro_values— unknown macros are not an error - Creative agents SHOULD assign globally unique
creative_idvalues; when they cannot guarantee uniqueness,concept_idis REQUIRED onbuild_creativerequests to disambiguate build_creativesupports async responses (status: "working"withcontext_idpolling) for generation and transformation tasks that take significant time. Library retrieval is typically synchronous.- When
accountis provided and the agent charges, the response MUST includepricing_option_id,vendor_cost, andcurrency. Theconsumptionobject SHOULD be included when relevant. - For async builds, pricing fields appear on the final completed response only, not on intermediate status responses.
- When a paid creative agent receives a
build_creativerequest withoutaccountand the agent requires an account, the agent MUST return an error.
preview_creative
Reference:preview_creative task
Generate preview renderings of creative manifests.
Requirements:
- Creative agents MUST validate manifests before generating previews
- Creative agents MUST return preview URLs or HTML for valid manifests
- Creative agents MUST keep preview URLs dereferenceable until their
expires_attimestamp. Whenexpires_atis omitted, preview URLs do not expire at the protocol layer and remain valid until the agent explicitly revokes them out of band. - Creative agents SHOULD include
expires_atfor time-limited preview URLs - Creative agents SHOULD support batch preview for multiple creatives
- Creative agents MAY support multiple output formats (URL, HTML, image)
list_creatives
Schema:creative/list-creatives-request.json / creative/list-creatives-response.json
Reference: list_creatives task
Browse and filter creative assets in a creative library. Implemented by any agent that hosts a creative library — ad servers, creative management platforms, and sales agents that manage creatives.
Requirements:
- Agents MUST return creatives accessible to the authenticated account
- Agents MUST include approval status for each creative
- Agents SHOULD support filtering by format, status, tags, and date range
- Agents SHOULD support filtering by
concept_idsandformat_idswhen the platform organizes creatives into concepts - Agents MAY include dynamic content variable definitions when
include_variables=true - Agents MAY include a lightweight delivery snapshot when
include_snapshot=true. The snapshot provides lifetime impressions and last-served date for operational use — detailed analytics belong inget_creative_delivery. - When
accountandinclude_pricing=trueare provided, agents that charge MUST includepricing_optionson each creative — an array ofvendor-pricing-optionobjects. Vendors may offer multiple options per creative (volume tiers, context-specific rates, different pricing models).
- Creative agents that charge for their services MUST implement the Accounts Protocol. This applies to any creative agent with pricing — ad servers, generation platforms, and transformation agents that bill for usage.
- Creative agents that host a library but do not charge SHOULD implement the Accounts Protocol so buyers can establish access before querying.
- This is the same accounts protocol used by sales agents — there is no separate version.
- Sales agents that already implement accounts for media buys do not need to do anything additional.
sync_creatives
Schema:creative/sync-creatives-request.json / creative/sync-creatives-response.json
Reference: sync_creatives task
Upload and synchronize creative assets in a library. Implemented by any agent that hosts a creative library — ad servers, creative management platforms, and sales agents that manage creatives.
Requirements:
- Agents MUST validate creatives against format specifications
- Agents MUST return validation errors for non-compliant creatives
- Agents MAY require approval before creatives are available for use
- Agents SHOULD support
dry_runfor validation without applying changes - Agents MUST reject requests that combine
delete_missing: truewithcreative_ids—delete_missingapplies to the entire library, not a filtered subset - Agents that also manage media buys SHOULD support the
assignmentsfield for bulk creative-to-package mapping - Standalone creative agents that do not manage media buys SHOULD ignore the
assignmentsfield
get_creative_delivery
Reference:get_creative_delivery task
Retrieve creative delivery data with variant-level metrics.
Requirements:
- Agents MUST return delivery data for the requested creatives
- Agents SHOULD include variant-level breakdowns when available
- Sales agents implementing the Creative Protocol SHOULD support this task when their products generate or optimize creative variants
Error handling
Creative agents MUST return errors using the standard AdCP error schema. Common error codes:REFERENCE_NOT_FOUND: Requested format does not exist or is not accessible (error.fieldidentifies theformat_id)VALIDATION_ERROR: Manifest failed format validationASSET_MISSING: Required asset not provided in manifestASSET_INVALID: Asset does not meet format constraintsGENERATION_FAILED: Creative generation could not be completed
Security considerations
Transport security
All Creative Protocol communications MUST use HTTPS with TLS 1.2 or higher.Asset security
- Creative agents SHOULD validate that asset URLs are accessible
- Creative agents SHOULD scan assets for malware and malicious content
- Creative agents MUST NOT execute untrusted JavaScript during validation
Preview security
- Preview URLs SHOULD be time-limited (indicated by
expires_at) - Preview URLs MUST NOT depend on pod-local or process-local state unless the agent can guarantee that state for the advertised lifetime of the URL
- Creative agents SHOULD sandbox HTML previews to prevent script execution
- Consumers of
output_format: "html"MUST only use trusted creative agents
Conformance
Creative agent conformance
A conformant Creative Protocol agent MUST:- Support at least one specified transport (MCP or A2A)
- Implement
list_creative_formatsfor format discovery - Return authoritative format definitions only for formats it owns
- Validate manifests against format specifications
- Use specified error codes
- Implement
build_creativefor creative generation - Implement
preview_creativefor preview rendering - Support universal macros in tracking URLs
- Implement
list_creativeswhen the agent hosts a creative library - Implement
sync_creativeswhen the agent accepts creative uploads - Support
creative_idinbuild_creativewhen the agent hosts a creative library - Implement the accounts protocol (
sync_accounts/list_accounts) when hosting a creative library - Declare
supports_generation,supports_transformation, andhas_creative_libraryinget_adcp_capabilitiesso buyers can determine the correct interaction model
Consumer conformance
A conformant Creative Protocol consumer MUST:- Use the
agent_urlfrom format IDs to identify the authoritative creative agent - Validate manifests against format specifications before submission
- Handle validation errors appropriately
- Track visited URLs when recursively discovering formats to avoid infinite loops
Implementation notes
Response time expectations
Creative agents SHOULD target the following response times:Recursive format discovery
Creative agents MAY reference other creative agents in theirlist_creative_formats response:
Format-aware validation
Manifest validation MUST be performed in the context of the format specification:- Look up the format definition from the authoritative creative agent
- For each asset in the manifest, find the corresponding entry in the format’s
assetsarray - Validate the asset value against the type and constraints defined in the format
Standard vs custom formats
- Standard formats: Based on IAB specifications, hosted by the reference creative agent (
https://creative.adcontextprotocol.org) - Custom formats: Defined by individual publishers or creative platforms for specialized inventory
agent_url field identifies which agent is authoritative for each format.
Schema reference
Some creative protocol schemas (
build_creative, list_creative_formats, preview_creative) have paths under media-buy/ because they were originally released as part of the media-buy protocol. The schema paths are stable identifiers and do not affect which protocol the task belongs to.