POST /api/v2/buyer/campaigns/{campaignId}/creatives/create
Creates a manifest from uploaded files plus JSON metadata in a single multipart/form-data request. Scope3 auto-classifies assets, processes HTML to rewrite local references to CDN URLs, inserts ADCP tracking macros, and generates a preview. The body is a metadata JSON part plus zero or more files parts; each file pairs with the matching assets[].filename.
Propagation to sales agents is asynchronous. On campaign execute, the manifest syncs to each agent that supports its format as a
creative_sync task — poll sync_status to confirm receipt. See Tasks for the async polling model.Request
Parameters
Themetadata JSON part carries:
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | No | Manifest name (max 255). Auto-generated if omitted |
message | string | No | Creative brief / direction text (max 5000) |
template_id | string | No | ADCP format ID (display_image, display_html, video_standard) or vendor tag |
format_id | object | No | { agent_url, id, width?, height?, duration_ms? } — explicit ADCP format reference |
format_kind | string | No | AdCP 3.1 canonical kind (e.g. image_carousel, video_hosted). Alternative to format_id |
url_asset | object | No | Single URL asset: { url, url_type }. url_type is clickthrough, tracker_pixel, tracker_script, or vast |
url_assets | array | No | Slot-bound URL assets for multi-slot formats (max 50): { asset_id, url, url_type? } |
text_assets | array | No | Slot-bound text assets, e.g. native headline (max 50): { asset_id, content } |
assets | array | No | Per-file metadata: { filename, asset_type?, label?, slot_asset_id? }. asset_type is one of IMAGE, VIDEO, AUDIO, HTML, JAVASCRIPT, CSS, TEXT, URL, VAST, FONT, LOGO, DOCUMENT. Auto-classified if omitted |
cards | array | No | Carousel cards for image_carousel (2–10): { filename or url, headline?, description?, cta?, landing_page_url? } |
frequencyCaps | array | No | Buyer-defined caps: { max_impressions, window: { interval, unit } } |
files=@<path> (one per uploaded asset). Limits: 50 MB per file, 20 files per request.
Response
201. sync_status.synced is false until the campaign executes and the manifest propagates. When a manifest with the same (campaign_id, name) already exists, the existing one is returned with already_exists: true and ignored_files set — use Update creative manifest to add assets to it.
Errors
400 VALIDATION_ERROR— afilespart with no matchingassets[].filename, more than oneurl_type: clickthroughURL asset, file over 50 MB, or unsupported MIME type.404 NOT_FOUND—campaignIddoes not exist or is not visible to the authenticated customer.
Related
Creative overview
Manifest fields, asset types, and tracking
Validate creative manifest
Dry-run before creating
Get creative manifest
Read the created manifest
Tasks
Async creative_sync polling