Overview
A Creative in v2 is a creative manifest — a structured bundle containing uploaded assets (images, video, HTML, VAST tags), an optional brief, brand info auto-resolved from the campaign’s advertiser, and a target ADCP format. Manifests are nested under campaigns and propagate to media buys at execution time.New in v2: creatives are no longer stored at the advertiser level and referenced by campaigns. They are created directly under a campaign at
/api/buyer/campaigns/:campaignId/creatives/.... The model is also fully manifest-aligned with the AdCP creative manifest spec.Field-name exception: Creative manifests use snake_case field names (
creative_id, campaign_id, format_id, template_id, brand_domain, target_format_ids) because they are passed through verbatim to the ADCP wire-format. This is an intentional exception to v2’s general camelCase convention — see the migration guide for context.Why this changed
V1 treated creatives as advertiser-level assets reused across campaigns. V2 tightens the model so:- Each campaign sees exactly the formats its selected products require (
creativeFormats.required) - Asset uploads happen in a single multipart request with the manifest metadata
- Format and template auto-detection runs against the campaign’s product mix
- Tracking macros and brand info are resolved from the campaign + advertiser context
Key fields
| Field | Type | Notes |
|---|---|---|
creative_id | string | Manifest ID |
campaign_id | string | Owning campaign |
name | string | Human-readable name |
message | string | Optional creative brief / direction text |
template_id | string | Creative template (display_image, display_html, video_standard, vendor tags, etc.) |
format_id | object | { agent_url, id } — ADCP format reference |
target_format_ids | array | Formats from campaign products this manifest can serve |
brand_domain | string | Auto-resolved from the campaign’s advertiser |
assets | array | Uploaded assets (id, type, MIME, public URL, source) |
preview_url | string | URL to processed HTML preview hosted on GCS |
tracking | object | Auto-generated impression and click tracker URLs |
sync_status | object | { synced, agent_count, last_synced_at } across sales agents |
frequencyCaps | array | Buyer-defined caps on this creative |
Asset types
V2 assets cover the full ADCP type spectrum:| Type | Purpose |
|---|---|
IMAGE | JPEG, PNG, GIF, WebP, SVG |
VIDEO | MP4, WebM, QuickTime |
AUDIO | MP3, WAV, OGG |
HTML | Inline content or hosted URL |
JAVASCRIPT / CSS | Companion script and style assets |
VAST | VAST tag (URL or inline XML) — renamed from v1’s VIDEO_VAST |
URL | Clickthrough, tracker pixel, or VAST URL with explicit url_type |
FONT / LOGO / DOCUMENT / TEXT | Supporting assets |
url_type: CLICKTHROUGH, TRACKER_PIXEL, TRACKER_SCRIPT, or VAST. Webhook assets enable server-side dynamic content rendering (DCO) with HMAC or API-key signing.
Lifecycle
Discover required formats
GET /api/buyer/campaigns/:campaignId/creatives/formats returns available templates and the deduplicated campaign_format_ids from selected products. Each product’s required formats are also broken out under campaign_products.Create the manifest
POST a multipart request with files + JSON metadata. Scope3 auto-classifies assets, processes HTML to rewrite local references to CDN URLs, inserts ADCP macros, and generates a preview.
Validate coverage
GET /api/buyer/campaigns/:id returns creativeFormats: { required, covered, missing }. Upload more manifests until missing is empty.Propagate to media buys
On campaign execute, the manifests sync to each sales agent for the formats they support. Sync status is reflected in
sync_status on each manifest.Common operations
Create a creative manifest (multipart)
The endpoint accepts ametadata JSON field plus files[] form fields:
Creative creation is a single multipart request: a JSON
metadata field plus zero or more files parts (-F "files=@..."). The server accepts up to the configured MAX_FILE_COUNT files per request and pairs each file with the matching assets[].filename in the metadata.List manifests
search, includeFrequencyCaps. Pagination: take, skip.
Get / update / delete
Render an ADCP preview
preview_creative tool to render at native format dimensions. Useful for validation before publisher submission.
Format coverage on the campaign
When youGET /api/buyer/campaigns/:id, the response includes:
missing is the prompt to upload more creatives. Coverage is computed against the formats every selected product needs.
Tracking macros
When the format supports it, Scope3 auto-injects:- An impression tracker URL as a
TRACKER_PIXELURL asset - A click tracker URL that wraps the original clickthrough — the original is preserved in the
rurlquery parameter
{CAMPAIGN_ID}, {DEVICE_TYPE}, {COUNTRY}, etc.) are filled at impression time. The tracking.supported_macros array on the manifest response lists which macros the format supports.
Format catalog
To inspect formats required by the campaign’s selected products:| Endpoint | Purpose |
|---|---|
GET /api/buyer/campaigns/:campaignId/creatives/formats | List the deduplicated format IDs required by every product in the campaign and the available templates. |
Propagation to media buys
At campaign execute, the manifest is synced to each sales agent that supports itsformat_id. The same manifest can serve multiple media buys; later updates re-sync. Use sync_status to confirm publishers have received the latest version.
Related concepts
Campaign
Owning campaign — formats come from its products
Brand
Brand info auto-resolved from the advertiser