Creative libraries let buyers manage creatives through AdCP — browsing existing assets, uploading new ones, assigning them to campaigns, and tracking approval status. A creative library is hosted by any agent that declaresDocumentation Index
Fetch the complete documentation index at: https://agenticadvertisingorg-changeset-release-main.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
has_creative_library: true in its capabilities: ad servers (CM360, Flashtalking), creative management platforms (Celtra), or sales agents with inline creative management.
The model
A creative library organizes assets at three levels:| Level | AdCP equivalent | Examples |
|---|---|---|
| Account | Account (via accounts protocol) | Advertiser in CM360, brand workspace in Celtra |
| Concept | concept_id / concept_name | Flashtalking concept, CM360 creative group, Celtra campaign folder |
| Creative | Creative item with creative_id, format_id, assets | A 300x250 display ad, a 30s video spot |
concept_id to filter and manage them as a group.
Creative state and assignment state are separate
Two things the library tracks independently:- Creative state — the review status of the creative itself:
processing,pending_review,approved,rejected, orarchived. Set by the creative agent’s review workflow. Applies to the creative as a library asset, regardless of where it is used. - Assignment state — the relationship between a creative and a package on a specific media buy. Created when the buyer assigns the creative (via
sync_creatives,creative_assignments, or inline creatives oncreate_media_buy). Released when the media buy or package is rejected, canceled, or completed, or when the buyer removes the assignment.
- A creative in the library has zero or more active assignments at any time.
- Rejecting, canceling, or completing a media buy releases its assignments. It does not change the creative’s review state, remove the creative from the library, or affect the creative’s use in other media buys.
- When a creative’s review state changes after assignments exist (e.g., a seller revokes an approval, or approves a previously rejected creative), sellers MAY continue or stop in-flight serving based on the new state. Buyers SHOULD re-fetch
approval_statusper package viaget_media_buysafter a creative-state change to detect assignment-level impact. See creative review.
Creatives outlast campaigns
A creative MUST persist in the library independently of the buys that reference it. Buy rejection, cancellation, or completion releases assignments only — the creative remains in the library at its currentstatus and may be reused on subsequent buys. This holds regardless of how the creative entered the library: explicit sync_creatives, inline creative on create_media_buy, or platform-native upload exposed through AdCP. Sellers whose underlying ad server has no library object distinct from per-buy attachment satisfy this rule by exposing the buyer-synced creative through list_creatives for the buy’s lifetime and continuing to expose its terminal state (including archived) after teardown — the library can be a thin view over per-buy storage; it does not need to be a separate store.
Retention beyond active assignments is seller-defined. An agent MAY archive an unassigned creative due to inactivity, post-flight expiry, or storage policy (see creative status lifecycle), and MAY transition approved → rejected for policy revocation, takedown, or content drift. Whenever a creative’s state changes after it has been synced by a buyer, the seller MUST make the new state observable so the buyer can resync, replace, or stop relying on the asset before reuse:
- For state changes affecting an active media buy (e.g.,
approved→rejectedon a creative with live assignments), sellers MUST surface a correspondingimpairmenton the buy. See media buy health. - For state changes on creatives with no active assignments (e.g., seller archives an unassigned creative for inactivity), sellers MUST reflect the new
statuson the nextlist_creativesread — that snapshot is the conformant signal today, per the snapshot-and-log contract. A push channel for account-scoped creative state changes is being defined under the creative lifecycle webhooks RFC; when that channel ships, sellers SHOULD additionally fire on it.
list_creatives before reuse on a new buy. A library creative is the bundle of inputs the buyer supplied — uploaded assets, a brief, brand and catalog pointers, or any combination. Retention applies to the bundle; whether the format’s rendered outputs are individually addressable is a format-level concern and is independent of library retention.
Connecting to a library
Establish account access before querying:Browsing creatives
Uselist_creatives to browse the library. Filter by concept, format, status, tags, or date range:
status field reflects the creative’s current state in the library: processing, pending_review, approved, rejected, or archived. See creative review for how status transitions work.
Uploading creatives
Usesync_creatives to upload new creatives or update existing ones. The operation uses upsert semantics — if a creative_id already exists, it updates; otherwise it creates.
list_creatives to see when it transitions from pending_review to approved.
Uploading with assignments
Assign creatives to packages in the same call:Generating tags from library creatives
When you need a serving tag for a creative in the library, usebuild_creative with creative_id instead of a manifest:
creative_id from its library and returns a manifest with the serving tag. The tag format depends on the platform:
- Flashtalking, Celtra: Universal tags that adapt to any environment. No placement context needed.
- CM360: Placement-level tags that require trafficking context. Pass
media_buy_idandpackage_id:
Assigning creatives to campaigns
There are two paths for attaching library creatives to a media buy:Path 1: Creative assignments on the package
Reference library creatives by ID when creating the media buy:sync_creatives or the platform’s own upload flow).
Path 2: Inline creatives on the package
Upload the creative directly with the media buy — no separate sync step:sync_creatives uploads. The inline form is a convenience — “sync and assign in one call” — not a separate lifecycle. Once submitted, the creative enters the library with the same review flow, retention, and identifiers it would have under sync_creatives. If the create_media_buy task resolves as pending_manual and the buy never activates, or if the buy is rejected or canceled, only the package assignments are released; the creatives remain in the library and may be referenced by creative_id in a subsequent create_media_buy call. This assignment-release behavior is normative on the media-buy side — see the Media Buy State Transitions rule.
Creative review proceeds independently of the media buy outcome. Sellers MUST NOT skip review solely because the buy did not activate, and a buy rejection does not by itself imply rejection of the submitted creatives — a creative rejection MUST be a deliberate review decision with its own rejection_reason, not implicit from the containing buy’s status. Sellers MAY deprioritize review of creatives that currently have no active assignments, provided review completes before any future assignment activates.
Capability-flag scope. inline_creative_management: true advertises that the sales agent accepts inline creatives on create_media_buy; it does not tie the inline creative’s lifecycle to the buy. The decoupled library lifecycle applies regardless of submission path.
Multi-seller distribution
When you work with multiple sellers, build creatives once and distribute them:- Build on your creative agent:
- Sync to each seller’s library:
sync_creatives on each sales agent separately. Use the same creative_id and concept_id across sellers so you can correlate the same creative and campaign concept across your media buys. See Multi-agent creative orchestration for the full pattern.
- Track approval per seller — each seller reviews independently. Poll
list_creativeson each agent to check status. A creative may beapprovedon one seller andrejectedon another based on their policies.
Tracking approval status
Creative approval operates at two levels: Library level: Thestatus field on each creative in list_creatives — processing, pending_review, approved, rejected, or archived.
Package level: The approval_status on each creative in get_media_buys — pending_review, approved, or rejected with rejection_reason.
A creative can be approved in the library but rejected at the package level if it violates placement-specific policies. Poll both after syncing or submitting a media buy with new creatives.
Dynamic creative optimization (DCO)
Creatives with dynamic content variables appear in the library with avariables array when you request include: { variables: true }. Each variable defines a slot that the ad server fills at serve time:
has_variables: true in list_creatives filters to find DCO creatives. Variable types match common platform patterns: text, color, image, video, number, boolean.
How the ad server uses these variables at serve time (data feeds, targeting rules, optimization algorithms) is outside AdCP’s scope. AdCP models the variable slots, not the optimization logic.
Next steps
- Generative creative — AI-powered creative generation and brief-in-media-buy workflows
- Creative capabilities on sales agents — When the seller manages both media and creative
- Implementing creative agents — Building an AdCP creative agent around your platform
- sync_creatives reference — Upload API details
- list_creatives reference — Query API details with full filtering options