Skip to main content
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

curl -X POST https://api.interchange.io/api/v2/buyer/campaigns/cmp_987654321/creatives/create \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F 'metadata={
    "name": "Q2 hero video",
    "message": "30s product reveal — premium tone, 2-second hook",
    "template_id": "video_standard",
    "url_asset": { "url": "https://acme.com/promo", "url_type": "clickthrough" },
    "assets": [
      { "filename": "hero-30s.mp4", "asset_type": "VIDEO", "label": "main_video" }
    ]
  };type=application/json' \
  -F "files=@hero-30s.mp4" \
  -F "files=@companion-banner.png"

Parameters

The metadata JSON part carries:
FieldTypeRequiredNotes
namestringNoManifest name (max 255). Auto-generated if omitted
messagestringNoCreative brief / direction text (max 5000)
template_idstringNoADCP format ID (display_image, display_html, video_standard) or vendor tag
format_idobjectNo{ agent_url, id, width?, height?, duration_ms? } — explicit ADCP format reference
format_kindstringNoAdCP 3.1 canonical kind (e.g. image_carousel, video_hosted). Alternative to format_id
url_assetobjectNoSingle URL asset: { url, url_type }. url_type is clickthrough, tracker_pixel, tracker_script, or vast
url_assetsarrayNoSlot-bound URL assets for multi-slot formats (max 50): { asset_id, url, url_type? }
text_assetsarrayNoSlot-bound text assets, e.g. native headline (max 50): { asset_id, content }
assetsarrayNoPer-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
cardsarrayNoCarousel cards for image_carousel (2–10): { filename or url, headline?, description?, cta?, landing_page_url? }
frequencyCapsarrayNoBuyer-defined caps: { max_impressions, window: { interval, unit } }
Form parts: files=@<path> (one per uploaded asset). Limits: 50 MB per file, 20 files per request.

Response

{
  "creative_id": "cm_abcdef",
  "campaign_id": "cmp_987654321",
  "name": "Q2 hero video",
  "message": "30s product reveal — premium tone, 2-second hook",
  "template_id": "video_standard",
  "brand_domain": "acme.com",
  "format_id": { "id": "video_standard", "agent_url": "https://agent.example.com" },
  "preview_url": "https://storage.googleapis.com/creatives/cm_abcdef/preview.html",
  "assets": [
    {
      "asset_id": "asset_001",
      "name": "main_video",
      "original_filename": "hero-30s.mp4",
      "asset_type": "VIDEO",
      "content_type": "video/mp4",
      "file_size": 8421376,
      "public_url": "https://cdn.example.com/creatives/cm_abcdef/hero-30s.mp4",
      "asset_source": "USER_UPLOADED",
      "created_at": "2026-06-07T15:04:00Z"
    }
  ],
  "tracking": {
    "impression_tracker_url": "https://track.scope3.com/imp?cid={CAMPAIGN_ID}",
    "click_tracker_url": "https://track.scope3.com/clk?rurl=https%3A%2F%2Facme.com%2Fpromo",
    "supported_macros": ["CAMPAIGN_ID", "DEVICE_TYPE", "COUNTRY"]
  },
  "sync_status": { "synced": false, "agent_count": 0 },
  "created_at": "2026-06-07T15:04:00Z",
  "updated_at": "2026-06-07T15:04:00Z"
}
Returns 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 — a files part with no matching assets[].filename, more than one url_type: clickthrough URL asset, file over 50 MB, or unsupported MIME type.
  • 404 NOT_FOUNDcampaignId does not exist or is not visible to the authenticated customer.
See Errors for the full error contract.

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