Skip to main content
POST /api/v2/buyer/advertisers/{advertiserId}/creatives/create Creates a creative manifest scoped to an advertiser instead of a campaign. Use it to stage creative you already have before a campaign exists, or to build a reusable master you assign to several campaigns later. The manifest is stored with campaign_id unset and advertiser_id set, and it appears in the advertiser-scoped creative listing. Everything else about a manifest is the same as the campaign-scoped Create creative manifest: same metadata body, same asset handling, same tracking macros, same 50 MB per-file and 20-file-per-request limits.
An advertiser-level master does not deliver on its own. It reaches a media buy only after it is assigned to a campaign — see Advertiser library: assign and unassign.

What differs from the campaign-scoped create

Request

curl

Parameters

advertiserId is a path parameter. The metadata JSON part carries the same fields as the campaign-scoped create: A create must satisfy two independent requirements, and a request that misses either is rejected with 400 VALIDATION_ERROR:
  • Content — at least one file, linked_assets entry, url_asset/url_assets entry, text_assets entry, cards entry, webhook_asset, or a message. A request carrying only a name has none.
  • Format identity — a canonical format_kind, either supplied directly or inferred from exactly one renderable primary asset (IMAGE, VIDEO, AUDIO, HTML, VAST). A brief, a click-through URL, and a TEXT asset carry no identity, so a create built only from those must supply format_kind.
brandAgentId is accepted in the body for wire compatibility and ignored on this route — the path advertiserId is authoritative. Form parts: files=@<path> (one per uploaded asset). Limits: 50 MB per file, 20 files per request.

Response

Returns 201 with the same CreativeManifestResponse the campaign-scoped create returns, except campaign_id is absent and advertiser_id is set:
When a non-archived manifest with the same (advertiser_id, name) already exists, that manifest is returned with already_exists: true and ignored_files set. The assets sent with that request are not attached to it — create under a different name, or use Update creative manifest to add assets to the existing one.

Errors

  • 400 VALIDATION_ERROR — no content supplied (name only), no resolvable format_kind, a files part with no matching assets[].filename, more than one make_primary asset, a file over 50 MB, an unsupported MIME type, or a non-numeric advertiserId.
  • 400 VALIDATION_ERROR — a product-scoped format_option_ref, which cannot be resolved without a campaign.
  • 404 NOT_FOUNDadvertiserId does not exist or does not belong to the authenticated account. The two cases are deliberately indistinguishable so the response never confirms that an advertiser exists in another account.
  • 409 CONFLICT — the name is held by a creative that is still being written (details.reason: name_creation_in_progress) or was left incomplete by an earlier attempt (name_creation_abandoned). Branch on details.reason, not the message.
See Errors for the full error contract.

From an agent

The save_creative MCP tool reaches this operation: omit creativeId, supply advertiserId (with no campaignId), a name, content (message, assets, sourceAssetRef, or clickUrl), and identity (formatKind, unless an asset or private JPEG/PNG source implies it). Supplying campaignId instead creates the Creative under that campaign’s advertiser and then attaches it to the campaign. The tool enforces both requirements before dispatching, so a brief-only call fails with a named field rather than a generic service error. save_creative sends assets as hosted URLs or inline base64 data URLs; it has no multipart files equivalent. A finalized private JPEG/PNG upload is the exception: pass its opaque scope3-asset://v1/... reference as sourceAssetRef, and Interchange re-verifies and copies the bytes into the governed Creative store. The manifest keeps only the durable asset and a one-way source fingerprint, never the private reference, object path, or a signed URL. Retrying the same source and name returns the same Creative and completes an interrupted campaign attachment. Package and media-buy attachment remain separate workflows. For ordinary assets, if the manifest comes back with fewer assets than the call requested, the tool says so in its response text and sets assetAttachWarning, assetsRequested, and assetsAttached — the creative was saved, but the missing media is not on it. Re-send it as a hosted url rather than assuming the creative is complete.

Create creative manifest

The campaign-scoped create

Creative overview

Manifest fields, the advertiser library, assign and unassign