Upload and manage creative assets in a creative library. Supports bulk uploads, upsert semantics, and generative creatives. Implemented by any agent that hosts a creative library — creative agents (ad servers, creative management platforms) and sales agents that manage creatives. Response time: Instant to days (returnsDocumentation Index
Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
Use this file to discover all available pages before exploring further.
completed, or submitted for review that takes hours/days)
Request Schema: creative/sync-creatives-request.json
Response Schema: creative/sync-creatives-response.json
Quick start
Upload creative assets:creatives[].status (e.g., pending_review) on the synchronous success response. When the whole operation is queued (batch ingestion, governance review gating the sync), the response is a submitted envelope with top-level status: "submitted" and a task_id. See Async approval workflow.
Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
account | object | Yes | Account reference identifying the advertiser/workspace for this sync (account-ref) |
creatives | Creative[] | Yes | Creative assets to upload/update (max 100) |
creative_ids | string[] | No | Optional filter to limit sync scope to specific creative IDs. Only these creatives are affected, others remain untouched. Useful for partial updates and error recovery. |
assignments | array | No | Array of {creative_id, package_id} objects for bulk assignment. Optional weight and placement_ids per assignment. |
dry_run | boolean | No | When true, preview changes without applying them (default: false) |
validation_mode | string | No | Validation strictness: "strict" (default) or "lenient" |
delete_missing | boolean | No | When true, creatives not in this sync are archived (default: false). Cannot be combined with creative_ids. Cannot delete creatives assigned to active, non-paused packages. |
Creative object
| Field | Type | Required | Description |
|---|---|---|---|
creative_id | string | Yes | Unique identifier for this creative |
name | string | Yes | Human-readable name |
format_id | FormatId | Yes | Format specification (structured object with agent_url and id) |
assets | object | Yes | Assets keyed by role (e.g., {video: {...}, thumbnail: {...}}). Catalogs are included as assets with asset_type: "catalog". See Catalogs. |
tags | string[] | No | Searchable tags for creative organization |
Asset structure
Assets are keyed by role name. Each role contains the asset details:test=false
Assignments structure
Assignments are at the request level, mapping creative IDs to package IDs. Standalone creative agents that do not manage media buys ignore this field.test=false
Response
Responses use discriminated unions — a response has exactly one of three shapes, never mixed: 1. Synchronous success — per-creative results:creatives- Results for each creative processed (includes both successful and failed items)dry_run- Boolean indicating if this was a dry run (optional)
errors- Array of operation-level errors (auth failure, service unavailable)
status- Always"submitted"task_id- Handle for polling viatasks/getor receiving a webhook on completionmessage- Optional human-readable explanation of the queue state
creatives array lands on the task completion artifact, not on the submitted envelope. Per-item async review (one creative in pending_review while the rest of the sync resolves synchronously) belongs on the synchronous success branch with status: "pending_review" on that item, not here.
Each creative in the success response includes:
- All request fields
platform_id- Platform’s internal ID (whenactionis notfailed)action- Lifecycle operation performed by this sync:created,updated,unchanged,failed,deletedstatus- Advisory review-lifecycle state (CreativeStatus):processing,pending_review,approved,rejected,archived. A UI hint and polling-scheduling signal — not a spend-authorization gate. Orthogonal toaction—actiondescribes what the sync did,statusdescribes where the creative is in the review lifecycle. Values come fromCreativeStatusonly, never fromCreativeAction(never putcreated/updated/failedinstatus). Sellers with async review returnprocessingorpending_review; sellers with synchronous review MAY return a terminal value (approved/rejected). Buyers MUST NOT gate downstream spend or package activation onstatus: approvedfrom this response — reconcile vialist_creativesor a signed review webhook before committing spend. Authoritative state is always vialist_creatives. MUST be omitted whenactionisfailedordeleted— failed items have no meaningful review state (seeerrors); deleted items are gone from the library. The schema enforces the omission rule via a conditional constraint.errors- Array of error messages (only whenaction: "failed")warnings- Array of non-fatal warnings (optional)
Common scenarios
Bulk upload
Upload multiple creatives in one call:Generative creatives
Use the creative agent to generate creatives from brand identity data. See the Generative Creatives guide for complete workflow details.Dry run validation
Validate creative configuration without uploading:Scoped update with creative_ids filter
Update only specific creatives from a large library without affecting others:- Scoped updates: Only specified creatives modified, even with 100+ in library
- Error recovery: Retry only failed creatives after bulk sync validation failures
- Performance: Publisher can optimize processing when scope is known upfront
- Safety: Explicit targeting reduces risk of unintended changes
Async approval workflow
Two distinct async patterns — match the right one to the agent’s behavior: Per-creative async review (common): the sync operation itself resolves synchronously, but one or more creatives require downstream review (brand safety, policy compliance). Items in review come back on the synchronous success response withstatus: "pending_review" (or processing during ingestion). The buyer reconciles terminal state via list_creatives or a webhook.
Operation-level async (less common): the whole sync is queued — the seller cannot return any per-item results before responding, because ingestion is batched or governance review gates the entire sync. The response is a submitted envelope:
- Top-level
status: "submitted"withtask_id message— optional human-readable explanation- No
creativesarray on this envelope
tasks/get or wait for the webhook. The completion artifact carries the creatives array with per-item action/status results; operation-level failures surface as status: "failed" on the task.
See: Webhooks for webhook configuration.
Sync modes
Upsert (default)
- Creates new creatives or updates existing by
creative_id - Merges package assignments (additive)
- Updates provided fields, leaves others unchanged
- Use
creative_idsfilter to limit scope to specific creatives
Dry run
- Validates request without making changes
- Returns errors and warnings
- Does not process assets or create creatives
- Use for pre-flight validation checks
Error handling
| Error Code | Description | Resolution |
|---|---|---|
INVALID_FORMAT | Format not supported by product | Check product’s supported formats via list_creative_formats |
ASSET_PROCESSING_FAILED | Asset file corrupt or invalid | Verify asset meets format requirements (codec, dimensions, duration) |
PACKAGE_NOT_FOUND | Package ID doesn’t exist in media buy | Verify package_id from create_media_buy response |
BRAND_SAFETY_VIOLATION | Creative failed brand safety scan | Review content against publisher’s brand safety guidelines |
FORMAT_MISMATCH | Assets don’t match format requirements | Verify asset types and specifications match format definition |
CREATIVE_IN_ACTIVE_DELIVERY | Creative is assigned to an active, non-paused package (blocks updates and delete_missing deletions) | Pause the package first, or create a new creative version |
Best practices
-
Use upsert semantics - Same
creative_idupdates existing creative rather than creating duplicates. This allows iterative creative development. Note: updates are blocked for creatives in active delivery (see #7). -
Validate first - Use
dry_run: trueto catch errors before actual upload. This saves bandwidth and processing time. - Batch assignments - Include all package assignments in single sync call to avoid race conditions between updates.
- CDN-hosted assets - Use publicly accessible CDN URLs for faster processing. Platforms can fetch assets directly without proxy delays.
- Brand identity - For generative creatives, validate brand identity schema before syncing to avoid processing failures.
-
Check format support - Use
list_creative_formatsto verify product supports your creative formats before uploading. -
Active delivery protection - Creatives assigned to active, non-paused packages cannot be updated or deleted via
delete_missing. Pause the package first, unassign the creative viaupdate_media_buy, or create a new creative with a differentcreative_id.
Related tasks
list_creative_formats- Check supported formats before uploadlist_creatives- Browse and filter creatives in a librarybuild_creative- Build manifests from library creatives or generate from scratchpreview_creative- Generate previews of creative manifests- Creative Asset Types - Technical requirements for assets