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
Creative object
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
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