sync_creatives
Overview
Uploads new creatives, updates existing ones, or removes creatives no longer needed. Every creative is validated against the format specification returned by list_creative_formats. Supports dry-run mode for pre-flight validation.
Category: Creative
Authentication: Required
REST equivalent: POST /api/v1/media-buys/{id}/creatives
Parameters
| Parameter |
Type |
Required |
Default |
Description |
creatives |
list[dict] or None |
No |
None |
Creatives to create or update. See Creative fields below. |
assignments |
dict or None |
No |
None |
Map of media buy IDs to lists of creative IDs to assign. |
creative_ids |
list[str] or None |
No |
None |
When used with delete_missing, the canonical set of creative IDs. Any creative not in this list is deleted. |
delete_missing |
bool |
No |
false |
Delete creatives owned by the caller that are not in creative_ids. |
dry_run |
bool |
No |
false |
Validate inputs without persisting changes. |
validation_mode |
str |
No |
"strict" |
"strict" rejects any format mismatch; "lenient" allows minor deviations. |
Creative Fields
| Field |
Type |
Required |
Default |
Description |
creative_id |
str |
Yes |
– |
Caller-supplied unique identifier. |
format_id |
FormatId |
Yes |
– |
Format spec reference (agent_url, id). |
name |
str |
Yes |
– |
Human-readable creative name. |
status |
str or None |
No |
None |
Initial status override (typically left as None). |
assets |
dict |
Yes |
– |
Asset payload. Structure depends on format (e.g., {"url": "...", "width": 300, "height": 250} for display, {"vast_url": "..."} for video). |
provenance |
Provenance or None |
No |
None |
Content provenance metadata for EU AI Act compliance. See below. |
Provenance Fields
| Field |
Type |
Required |
Description |
digital_source_type |
str |
Yes |
How the creative was produced. See DigitalSourceType enum below. |
ai_tool |
str or None |
No |
AI tool used (e.g., "DALL-E 3", "Midjourney v6"). |
human_oversight |
str or None |
No |
Description of human oversight during production. |
declared_by |
str or None |
No |
Entity declaring provenance. |
created_time |
str (ISO 8601) or None |
No |
When the creative was originally produced. |
c2pa |
dict or None |
No |
C2PA manifest data. |
disclosure |
str or None |
No |
Human-readable disclosure about AI involvement. |
verification |
dict or None |
No |
Third-party verification data. |
DigitalSourceType Enum
| Value |
Description |
digital_capture |
Captured by a digital device. |
digital_creation |
Created by a human using digital tools. |
composite_capture |
Composite of captured sources. |
composite_synthetic |
Composite with fully synthetic elements. |
composite_with_trained_model |
Composite with AI model output. |
trained_algorithmic_model |
Generated entirely by an AI model. |
algorithmic_media |
Generated by a non-ML algorithm. |
human_edits |
AI-generated with significant human modifications. |
minor_human_edits |
AI-generated with minor human edits (cropping, colour correction). |
Creative Lifecycle
sync_creatives → processing → pending_review → approved → live
│ │
▼ ▼
rejected rejected
Tenants can configure automatic approval thresholds. When the content-standards score meets creative_auto_approve_threshold (default 0.9), the creative is approved without human review. Below creative_auto_reject_threshold (default 0.1), it is automatically rejected.
Response
| Field |
Type |
Description |
created |
int |
Number of creatives created. |
updated |
int |
Number of creatives updated. |
deleted |
int |
Number of creatives deleted. |
results |
list[object] |
Per-creative results with creative_id, status, and errors. |
Errors
| Error |
Cause |
AdCPValidationError (400) |
Format mismatch, missing required asset fields, or invalid format_id. |
AdCPNotFoundError (404) |
Referenced format_id does not exist at the specified agent_url. |
AdCPAuthorizationError (403) |
Attempting to modify creatives owned by another principal. |
Example
Request:
{
"creatives": [
{
"creative_id": "cr_video_001",
"format_id": {"agent_url": "https://creative.example.com", "id": "video_30s"},
"name": "Acme Sports CTV 30s",
"assets": {
"vast_url": "https://cdn.example.com/vast/acme_sports_30s.xml",
"duration_seconds": 30,
"resolution": "1920x1080"
},
"provenance": {
"digital_source_type": "human_edits",
"ai_tool": "RunwayML Gen-3",
"human_oversight": "Creative director reviewed and approved final cut",
"disclosure": "This advertisement contains AI-generated visual effects."
}
}
],
"assignments": {
"mb_a1b2c3d4": ["cr_video_001"]
},
"dry_run": false,
"validation_mode": "strict"
}
Response:
{
"created": 1,
"updated": 0,
"deleted": 0,
"results": [
{
"creative_id": "cr_video_001",
"status": "processing",
"errors": []
}
]
}
Further Reading