openapi: 3.2.0 info: title: Scope3 Buyer Creatives API version: 2.0.0 description: 'REST API for advertisers to manage advertisers, campaigns, and reporting. ## Authentication All endpoints require a Bearer token in the Authorization header: ``` Authorization: Bearer your-api-key ``` ## Base URL `https://api.interchange.io/api/v2/buyer` ## For AI Agents AI agents can use the MCP endpoint at `/mcp/v2/buyer` with three tools: - `initialize`: Start an MCP session - `api_call`: Make REST API calls - `ask_about_capability`: Learn about API features' servers: - url: https://api.interchange.io/api/v2/buyer description: Production server tags: - name: Creatives description: Build, manage, and sync campaign creatives via AdCP Creative Protocol paths: /advertisers/{advertiserId}/creative/model-credentials: get: operationId: listCreativeModelCredentials summary: List generation-provider keys for an advertiser description: 'List the buyer''s generation-provider keys usable for this advertiser — its assigned keys plus the customer''s all-accounts keys — each carrying a label, assignment, status, a masked key hint (never the raw key), and `effective: true` on the one auto-selected for its provider. Gated behind buyer-creative-v2 and buyer-generative-creative.' tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Unique identifier for the advertiser example: '12345' type: string minLength: 1 required: true description: Unique identifier for the advertiser responses: '200': description: List generation-provider keys for an advertiser content: application/json: schema: $ref: '#/components/schemas/AdvertiserModelCredentialList' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Feature not enabled for this account (buyer-creative-v2 or buyer-generative-creative is off). content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' post: operationId: connectCreativeModelCredential summary: Connect a generation-provider key for an advertiser description: Store a buyer generation-provider API key assigned to this advertiser so generation runs on the buyer's own account. The raw key is held in the secret manager; only a reference and a masked hint are persisted. Gated behind buyer-creative-v2 and buyer-generative-creative. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Unique identifier for the advertiser example: '12345' type: string minLength: 1 required: true description: Unique identifier for the advertiser requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConnectBuyerModelCredentialBody' responses: '200': description: Connect a generation-provider key for an advertiser content: application/json: schema: $ref: '#/components/schemas/BuyerModelCredential' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Feature not enabled for this account (buyer-creative-v2 or buyer-generative-creative is off). content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /creative/model-credentials/{id}: patch: operationId: updateCreativeModelCredential summary: Update or rotate a generation-provider key description: Update a buyer generation-provider credential. Supplying `apiKey` atomically rotates only the stored secret while preserving the credential's label, advertiser assignments, and default status unless those fields are also explicitly changed. Gated behind buyer-creative-v2 and buyer-generative-creative. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: id schema: type: string pattern: ^[1-9]\d*$ required: true requestBody: required: true content: application/json: schema: type: object properties: apiKey: type: string minLength: 1 label: type: string minLength: 1 maxLength: 120 advertiserIds: type: array items: type: integer maximum: 9007199254740991 minimum: 1 isDefault: type: boolean responses: '200': description: Update or rotate a generation-provider key content: application/json: schema: $ref: '#/components/schemas/BuyerModelCredential' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Feature not enabled for this account (buyer-creative-v2 or buyer-generative-creative is off). content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: No active model credential with this id. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /creative-dashboard-url: get: operationId: getCreativeDashboardUrl summary: Get creative dashboard URL description: Returns a fully-resolved URL to the Interchange creative dashboard scoped to the provided advertiser, campaign, and optionally a specific creative manifest. Pass all three IDs to deep-link directly to a manifest; omit manifestId to land at the campaign level; omit campaignId to land at the advertiser level. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: advertiserId schema: description: Advertiser ID. Narrows the URL to the advertiser level. type: integer maximum: 9007199254740991 minimum: 1 description: Advertiser ID. Narrows the URL to the advertiser level. - in: query name: campaignId schema: description: Campaign ID. Requires advertiserId. Narrows the URL to the campaign level. type: string description: Campaign ID. Requires advertiserId. Narrows the URL to the campaign level. - in: query name: manifestId schema: description: Creative manifest ID. Requires both advertiserId and campaignId. Deep-links to a specific creative. type: string description: Creative manifest ID. Requires both advertiserId and campaignId. Deep-links to a specific creative. responses: '200': description: Get creative dashboard URL content: application/json: schema: $ref: '#/components/schemas/CreativeDashboardUrlResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/create: post: operationId: createCreativeManifest summary: Create creative manifest description: Create a creative manifest with uploaded file assets and optional brief/tag metadata. Multipart form-data request with files and JSON metadata. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCreativeManifestMetadata' responses: '201': description: Create creative manifest content: application/json: schema: $ref: '#/components/schemas/CreativeManifestResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/templates: get: operationId: listCreativeTemplates summary: List creative templates description: List available creative templates plus the selected products required legacy format IDs and V2 format options for a campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID responses: '200': description: List creative templates content: application/json: schema: $ref: '#/components/schemas/AvailableTemplatesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creativeManifest: get: operationId: listCreativeManifests summary: List creative manifests description: List creative manifests for a campaign with optional filtering by status, quality, or search term. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: search schema: description: Search by name type: string maxLength: 200 description: Search by name - in: query name: promoted schema: description: When "true", return only promoted creative-library items (those with a creative_role of evergreen or reference). Flight-specific creatives are excluded. type: string enum: - 'true' - 'false' description: When "true", return only promoted creative-library items (those with a creative_role of evergreen or reference). Flight-specific creatives are excluded. - in: query name: role schema: description: 'Filter to a single library role: evergreen or reference (the shelf''s two tabs). Implies promoted; narrower than `promoted=true`.' allOf: - $ref: '#/components/schemas/CreativeRole' description: 'Filter to a single library role: evergreen or reference (the shelf''s two tabs). Implies promoted; narrower than `promoted=true`.' - in: query name: source schema: description: 'Filter by provenance: uploaded (A), generated (B), or connected (C).' allOf: - $ref: '#/components/schemas/CreativeSource' description: 'Filter by provenance: uploaded (A), generated (B), or connected (C).' - in: query name: format_kind schema: description: Filter by AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted). type: string minLength: 1 maxLength: 255 description: Filter by AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted). - in: query name: asset_type schema: description: Filter to creatives that carry at least one asset of this type. type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT description: Filter to creatives that carry at least one asset of this type. - in: query name: dimensions schema: description: Filter to creatives with an asset of these pixel dimensions, "WIDTHxHEIGHT" (e.g. "300x250"). type: string pattern: ^\d{1,5}[x×]\d{1,5}$ description: Filter to creatives with an asset of these pixel dimensions, "WIDTHxHEIGHT" (e.g. "300x250"). - in: query name: take schema: description: Number of results to return (max 250) example: 50 default: 50 type: integer maximum: 250 minimum: 1 description: Number of results to return (max 250) - in: query name: skip schema: description: Number of results to skip for pagination example: 0 default: 0 type: integer minimum: 0 maximum: 9007199254740991 description: Number of results to skip for pagination - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID responses: '200': description: List creative manifests content: application/json: schema: $ref: '#/components/schemas/CreativeManifestListResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives: get: operationId: listCreatives summary: List creatives description: List creative manifest summaries for a campaign, with optional text search and pagination. Returns the same summary rows as the manifest list. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: search schema: description: Creative name substring search. type: string description: Creative name substring search. - in: query name: take schema: type: integer maximum: 9007199254740991 minimum: 1 - in: query name: skip schema: type: integer minimum: 0 maximum: 9007199254740991 - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID responses: '200': description: List creatives content: application/json: schema: $ref: '#/components/schemas/CreativeManifestListResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/bulk-update: post: operationId: bulkUpdateCreatives summary: Bulk update creatives description: Preview or apply a bulk update to saved campaign creatives. Defaults to dry_run=true so the buyer can confirm the matched set before applying changes. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BulkUpdateCreativesBody' responses: '200': description: Bulk update creatives content: application/json: schema: $ref: '#/components/schemas/BulkUpdateCreativesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives/create: post: operationId: createAdvertiserCreative summary: Create advertiser creative master description: Create a creative manifest scoped to an advertiser without requiring a campaign. The resulting master can be assigned to one or more campaigns. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCreativeManifestMetadata' responses: '200': description: Create advertiser creative master content: application/json: schema: $ref: '#/components/schemas/CreativeManifestResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives: get: operationId: listAdvertiserCreatives summary: List advertiser creative library description: List all creative manifests belonging to an advertiser, independent of campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: search schema: description: Search by name type: string maxLength: 200 description: Search by name - in: query name: promoted schema: description: When "true", return only promoted creative-library items (those with a creative_role of evergreen or reference). Flight-specific creatives are excluded. type: string enum: - 'true' - 'false' description: When "true", return only promoted creative-library items (those with a creative_role of evergreen or reference). Flight-specific creatives are excluded. - in: query name: role schema: description: 'Filter to a single library role: evergreen or reference (the shelf''s two tabs). Implies promoted; narrower than `promoted=true`.' allOf: - $ref: '#/components/schemas/CreativeRole' description: 'Filter to a single library role: evergreen or reference (the shelf''s two tabs). Implies promoted; narrower than `promoted=true`.' - in: query name: source schema: description: 'Filter by provenance: uploaded (A), generated (B), or connected (C).' allOf: - $ref: '#/components/schemas/CreativeSource' description: 'Filter by provenance: uploaded (A), generated (B), or connected (C).' - in: query name: format_kind schema: description: Filter by AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted). type: string minLength: 1 maxLength: 255 description: Filter by AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted). - in: query name: asset_type schema: description: Filter to creatives that carry at least one asset of this type. type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT description: Filter to creatives that carry at least one asset of this type. - in: query name: dimensions schema: description: Filter to creatives with an asset of these pixel dimensions, "WIDTHxHEIGHT" (e.g. "300x250"). type: string pattern: ^\d{1,5}[x×]\d{1,5}$ description: Filter to creatives with an asset of these pixel dimensions, "WIDTHxHEIGHT" (e.g. "300x250"). - in: query name: take schema: description: Number of results to return (max 250) example: 50 default: 50 type: integer maximum: 250 minimum: 1 description: Number of results to return (max 250) - in: query name: skip schema: description: Number of results to skip for pagination example: 0 default: 0 type: integer minimum: 0 maximum: 9007199254740991 description: Number of results to skip for pagination - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID responses: '200': description: List advertiser creative library content: application/json: schema: $ref: '#/components/schemas/CreativeManifestListResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives/save-to-library: post: operationId: saveCreativesToLibrary summary: Promote advertiser creatives into the library shelf description: Buyer-creative-v2 (feature-flagged). Promotes advertiser creatives into the durable creative library ("the shelf") with a role — `evergreen` (serve-ready, reusable across campaigns) or `reference` (a generation input, not served). Identify the creatives by `creative_ids` or by `collection_id`. No campaign is required. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SaveCreativesToLibraryBody' responses: '200': description: Promote advertiser creatives into the library shelf content: application/json: schema: $ref: '#/components/schemas/SaveCreativesToLibraryResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /creatives/stash: post: operationId: stashBroughtCreatives summary: Stash brought creatives before an advertiser is chosen description: Buyer-creative-v2 (feature-flagged). Persists uploaded creatives customer-scoped BEFORE an advertiser is named, so the upload survives across turns. Returns the saved creatives (with ids) in the same shape as the creative-intent picker; pass those ids to getCreativeIntent as `creative_ids` once the advertiser is known. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object properties: assets: minItems: 1 maxItems: 50 type: array items: type: object properties: data_url: type: string maxLength: 73400320 asset_type: type: string enum: - IMAGE - VIDEO - AUDIO - HTML - VAST name: type: string declared_sizes: maxItems: 30 type: array items: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - width - height required: - data_url required: - assets responses: '200': description: Stash brought creatives before an advertiser is chosen content: application/json: schema: type: object properties: advertiser_name: type: string advertisers: type: array items: type: object properties: advertiser_id: type: string name: type: string required: - advertiser_id - name additionalProperties: false selected_advertiser_id: type: string files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag preview_url: type: string required: - file_id - filename - media_kind additionalProperties: false recent_campaigns: type: array items: type: object properties: campaign_id: type: string name: type: string created_label: type: string required: - campaign_id - name additionalProperties: false saved_as: type: string collection_id: type: string skipped_files_notice: type: string skipped_files: type: array items: type: string required: - files - recent_campaigns additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creative-intent: post: operationId: getCreativeIntent summary: Open the creative-intent picker for an advertiser description: Buyer-creative-v2 (feature-flagged). Opens the in-chat "which campaign are these for?" picker. When `assets` are supplied (the buyer's upload), they are persisted as advertiser-level creatives up front — so they survive until a campaign is picked in a later turn — and returned in `files` with their ids. Returns the advertiser, its recent campaigns, and the saved creatives. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: type: string required: true requestBody: required: true content: application/json: schema: type: object properties: assets: minItems: 1 maxItems: 50 type: array items: type: object properties: data_url: type: string maxLength: 73400320 asset_type: type: string enum: - IMAGE - VIDEO - AUDIO - HTML - VAST name: type: string declared_sizes: maxItems: 30 type: array items: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - width - height required: - data_url creative_ids: minItems: 1 maxItems: 50 type: array items: type: string responses: '200': description: Open the creative-intent picker for an advertiser content: application/json: schema: type: object properties: advertiser_name: type: string advertisers: type: array items: type: object properties: advertiser_id: type: string name: type: string required: - advertiser_id - name additionalProperties: false selected_advertiser_id: type: string files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag preview_url: type: string required: - file_id - filename - media_kind additionalProperties: false recent_campaigns: type: array items: type: object properties: campaign_id: type: string name: type: string created_label: type: string required: - campaign_id - name additionalProperties: false saved_as: type: string collection_id: type: string skipped_files_notice: type: string skipped_files: type: array items: type: string required: - files - recent_campaigns additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-confirmation: get: operationId: getCreativeConfirmation summary: Get creative-confirmation card for a campaign description: Buyer-creative-v2 (feature-flagged). Returns the campaign's creatives with recognized status plus real format coverage, for the in-chat "here's what I added" card. Read-only — does not attach anything. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string required: true responses: '200': description: Get creative-confirmation card for a campaign content: application/json: schema: type: object properties: campaign_id: type: string campaign_name: type: string coverage: type: object properties: total_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 covered_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - total_placements - covered_placements additionalProperties: false files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag status: type: string enum: - recognizing - recognized - mapped - needs_input - misfit - malformed detected: type: object properties: dimensions: type: string duration: type: string codec: type: string bitrate: type: string frameRate: type: string sampleRate: type: string container: type: string fileSize: type: string tagType: type: string additionalProperties: false suggestion: type: string format_incompatible: type: string preview_url: type: string message: type: string suggestions: type: array items: type: string accepts_context: type: boolean placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false required: - file_id - filename - media_kind - status - detected additionalProperties: false missing_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false available_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false truncated: type: boolean unreadable_placements: type: integer maximum: 9007199254740991 minimum: 1 skipped_files_notice: type: string skipped_files: type: array items: type: string required: - coverage - files additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' post: operationId: attachCreativesToCampaign summary: Attach brought creatives to a campaign description: 'Buyer-creative-v2 (feature-flagged). Two paths, then returns the same confirmation card: `assets` creates a creative on the campaign from each upload (same-turn); `creative_ids` assigns advertiser-level masters saved earlier at intent time (cross-turn). Either way images auto-map by size to a required placement. Returns 404 for callers not enrolled in the flag.' tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string required: true requestBody: required: true content: application/json: schema: type: object properties: assets: minItems: 1 maxItems: 50 type: array items: type: object properties: data_url: type: string maxLength: 73400320 asset_type: type: string enum: - IMAGE - VIDEO - AUDIO - HTML - VAST name: type: string declared_sizes: maxItems: 30 type: array items: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - width - height required: - data_url creative_ids: minItems: 1 maxItems: 50 type: array items: type: string collection_id: type: string responses: '200': description: Attach brought creatives to a campaign content: application/json: schema: type: object properties: campaign_id: type: string campaign_name: type: string coverage: type: object properties: total_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 covered_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - total_placements - covered_placements additionalProperties: false files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag status: type: string enum: - recognizing - recognized - mapped - needs_input - misfit - malformed detected: type: object properties: dimensions: type: string duration: type: string codec: type: string bitrate: type: string frameRate: type: string sampleRate: type: string container: type: string fileSize: type: string tagType: type: string additionalProperties: false suggestion: type: string format_incompatible: type: string preview_url: type: string message: type: string suggestions: type: array items: type: string accepts_context: type: boolean placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false required: - file_id - filename - media_kind - status - detected additionalProperties: false missing_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false available_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false truncated: type: boolean unreadable_placements: type: integer maximum: 9007199254740991 minimum: 1 skipped_files_notice: type: string skipped_files: type: array items: type: string required: - coverage - files additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/{creativeId}/placement: post: operationId: remapCreativePlacement summary: Reassign a brought creative to a different placement description: Buyer-creative-v2 (feature-flagged). Reassigns an already-attached creative to a different required placement (the "correction" step, e.g. "move the 300×250 to the leaderboard"), then returns the refreshed confirmation card. `format_id` is the target placement, resolved from the campaign's required formats. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string required: true - in: path name: creativeId schema: type: string required: true requestBody: required: true content: application/json: schema: type: object properties: format_id: type: object properties: agent_url: type: string minLength: 1 id: type: string minLength: 1 required: - agent_url - id required: - format_id responses: '200': description: Reassign a brought creative to a different placement content: application/json: schema: type: object properties: campaign_id: type: string campaign_name: type: string coverage: type: object properties: total_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 covered_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - total_placements - covered_placements additionalProperties: false files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag status: type: string enum: - recognizing - recognized - mapped - needs_input - misfit - malformed detected: type: object properties: dimensions: type: string duration: type: string codec: type: string bitrate: type: string frameRate: type: string sampleRate: type: string container: type: string fileSize: type: string tagType: type: string additionalProperties: false suggestion: type: string format_incompatible: type: string preview_url: type: string message: type: string suggestions: type: array items: type: string accepts_context: type: boolean placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false required: - file_id - filename - media_kind - status - detected additionalProperties: false missing_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false available_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false truncated: type: boolean unreadable_placements: type: integer maximum: 9007199254740991 minimum: 1 skipped_files_notice: type: string skipped_files: type: array items: type: string required: - coverage - files additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/placements: post: operationId: remapCreativePlacements summary: Batch-reassign brought creatives to placements description: Buyer-creative-v2 (feature-flagged). Reassigns several already-attached creatives to placements in one call (the card's "Save mappings" commit), then returns the refreshed confirmation card once. `mappings` is `[{ creative_id, format_id }]`. Returns 404 for callers not enrolled in the flag. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string required: true requestBody: required: true content: application/json: schema: type: object properties: mappings: minItems: 1 maxItems: 50 type: array items: type: object properties: creative_id: type: string minLength: 1 format_ids: minItems: 1 maxItems: 50 type: array items: type: object properties: agent_url: type: string minLength: 1 id: type: string minLength: 1 required: - agent_url - id required: - creative_id - format_ids required: - mappings responses: '200': description: Batch-reassign brought creatives to placements content: application/json: schema: type: object properties: campaign_id: type: string campaign_name: type: string coverage: type: object properties: total_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 covered_placements: type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - total_placements - covered_placements additionalProperties: false files: type: array items: type: object properties: file_id: type: string filename: type: string media_kind: type: string enum: - image - video - audio - tag status: type: string enum: - recognizing - recognized - mapped - needs_input - misfit - malformed detected: type: object properties: dimensions: type: string duration: type: string codec: type: string bitrate: type: string frameRate: type: string sampleRate: type: string container: type: string fileSize: type: string tagType: type: string additionalProperties: false suggestion: type: string format_incompatible: type: string preview_url: type: string message: type: string suggestions: type: array items: type: string accepts_context: type: boolean placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false required: - file_id - filename - media_kind - status - detected additionalProperties: false missing_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false available_placements: type: array items: type: object properties: placement_id: type: string placement_name: type: string spec_label: type: string product_name: type: string required: - placement_id - placement_name additionalProperties: false truncated: type: boolean unreadable_placements: type: integer maximum: 9007199254740991 minimum: 1 skipped_files_notice: type: string skipped_files: type: array items: type: string required: - coverage - files additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives/{creativeId}/campaigns: post: operationId: assignCreativeToCampaign summary: Assign creative to campaign description: Assign an advertiser-library creative to a campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignCreativeToCampaignBody' responses: '200': description: Assign creative to campaign content: application/json: schema: type: object properties: manifest_id: type: string campaign_id: type: string required: - manifest_id - campaign_id additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives/{creativeId}/campaigns/{campaignId}: delete: operationId: unassignCreativeFromCampaign summary: Unassign creative from campaign description: Remove a creative from a campaign assignment. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID responses: '204': description: No content '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creatives/{creativeId}: delete: operationId: archiveCreative summary: Archive creative globally description: Permanently archive a creative across all campaigns. Checks for active/paused media buys in all campaigns before archiving, removes all campaign memberships, and archives the manifest and its assets. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: description: Advertiser ID type: string minLength: 1 required: true description: Advertiser ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID responses: '204': description: No content '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: No creative with this id owned by the caller. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-collections: get: operationId: listCreativeCollections summary: List creative collections description: List creative collections attached to or created for a campaign. Collections group saved creatives and raw/generated assets for prompt-driven creative workflows. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: search schema: type: string minLength: 1 maxLength: 200 - in: query name: include_members schema: type: boolean - in: query name: take schema: description: Number of results to return (max 250) example: 50 default: 50 type: integer maximum: 250 minimum: 1 description: Number of results to return (max 250) - in: query name: skip schema: description: Number of results to skip for pagination example: 0 default: 0 type: integer minimum: 0 maximum: 9007199254740991 description: Number of results to skip for pagination - in: path name: campaignId schema: type: string minLength: 1 required: true responses: '200': description: List creative collections content: application/json: schema: $ref: '#/components/schemas/ListCreativeCollectionsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' post: operationId: createCreativeCollection summary: Create creative collection description: Create a creative collection of saved creatives and assets, optionally attaching it to the campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCreativeCollectionBody' responses: '201': description: Create creative collection content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-collections/{collectionId}: get: operationId: getCreativeCollection summary: Get creative collection description: Get a creative collection with members, campaign attachments, and saved creative summaries. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: collectionId schema: type: string minLength: 1 required: true responses: '200': description: Get creative collection content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionSummary' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' put: operationId: updateCreativeCollection summary: Update creative collection description: Update creative collection name, description, or metadata. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: collectionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCreativeCollectionBody' responses: '200': description: Update creative collection content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-collections/{collectionId}/members: post: operationId: addCreativeCollectionMembers summary: Add creative collection members description: Add saved creative IDs or raw/generated asset IDs to a creative collection. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: collectionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddCreativeCollectionMembersBody' responses: '200': description: Add creative collection members content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' delete: operationId: removeCreativeCollectionMembers summary: Remove creative collection members description: Remove saved creatives or assets from a creative collection. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: collectionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RemoveCreativeCollectionMembersBody' responses: '200': description: Remove creative collection members content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-collections/{collectionId}/attach: post: operationId: attachCreativeCollectionToCampaign summary: Attach creative collection to campaign description: Attach a creative collection to the campaign as a library, source asset set, approved set, or testing set. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: collectionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AttachCreativeCollectionBody' responses: '200': description: Attach creative collection to campaign content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /advertisers/{advertiserId}/creative-collections: get: operationId: listAdvertiserCreativeCollections summary: List advertiser creative collections description: List creative collections owned by an advertiser. These collections are not campaign-scoped and can be attached to multiple campaigns. tags: - Creatives security: - bearerAuth: [] parameters: - in: query name: search schema: type: string minLength: 1 maxLength: 200 - in: query name: include_members schema: type: boolean - in: query name: take schema: description: Number of results to return (max 250) example: 50 default: 50 type: integer maximum: 250 minimum: 1 description: Number of results to return (max 250) - in: query name: skip schema: description: Number of results to skip for pagination example: 0 default: 0 type: integer minimum: 0 maximum: 9007199254740991 description: Number of results to skip for pagination - in: path name: advertiserId schema: type: string pattern: ^\d+$ required: true responses: '200': description: List advertiser creative collections content: application/json: schema: $ref: '#/components/schemas/ListCreativeCollectionsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' post: operationId: createAdvertiserCreativeCollection summary: Create advertiser creative collection description: Create a creative collection owned by an advertiser (not campaign-scoped). The collection can be attached to multiple campaigns via the attach endpoint. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: advertiserId schema: type: string pattern: ^\d+$ required: true requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCreativeCollectionBody' responses: '201': description: Create advertiser creative collection content: application/json: schema: $ref: '#/components/schemas/CreativeCollectionMutationResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/{creativeId}: get: operationId: getCreativeManifest summary: Get creative manifest description: Get a single creative manifest by ID within a campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID responses: '200': description: Get creative manifest content: application/json: schema: $ref: '#/components/schemas/CreativeManifestResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' put: operationId: updateCreativeManifest summary: Update creative manifest description: Update creative manifest fields such as name, brief message, tag, quality, status, or manage assets (add, delete, reclassify). Multipart form-data request. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCreativeManifestMetadata' responses: '200': description: Update creative manifest content: application/json: schema: $ref: '#/components/schemas/CreativeManifestResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' delete: operationId: deleteCreativeManifest summary: Delete creative manifest description: Delete a creative manifest and all its assets from a campaign. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID responses: '204': description: No content '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/{creativeId}/preview: post: operationId: previewCreative summary: Preview creative description: Render a preview of a creative manifest via its format renderer. The creative must have a `format_id` and be published (assets uploaded) — otherwise the request fails with a validation error. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID responses: '200': description: Preview creative content: application/json: schema: $ref: '#/components/schemas/CreativePreviewResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creatives/{creativeId}/duplicate: post: operationId: duplicateCreative summary: Duplicate creative description: Create a copy of an existing creative manifest (including its assets) within the same campaign. Returns the new manifest. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: description: Campaign ID type: string minLength: 1 required: true description: Campaign ID - in: path name: creativeId schema: description: Creative manifest ID type: string minLength: 1 required: true description: Creative manifest ID responses: '201': description: Duplicate creative content: application/json: schema: $ref: '#/components/schemas/CreativeManifestResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-sessions/{sessionId}: get: operationId: getCreativeSession summary: Get creative session description: Get a creative iteration session by ID, including its drafts, evaluator results, and current status. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: sessionId schema: type: string minLength: 1 required: true responses: '200': description: Get creative session content: application/json: schema: type: object properties: creative_session_id: type: string campaign_id: type: string presentation: type: string enum: - generative-widgets title: type: string persona: type: string brand: type: string brand_reference: type: object properties: domain: type: string minLength: 1 brand_id: type: string industries: type: array items: type: string data_subject_contestation: type: object properties: url: type: string format: uri email: type: string format: email pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ languages: type: array items: type: string additionalProperties: false brand_kit_override: type: object properties: logo: type: object properties: asset_type: type: string enum: - image url: type: string format: uri width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 format: type: string alt_text: type: string required: - asset_type - url - width - height additionalProperties: {} colors: type: object properties: primary: type: string pattern: ^#[0-9A-Fa-f]{6}$ secondary: type: string pattern: ^#[0-9A-Fa-f]{6}$ accent: type: string pattern: ^#[0-9A-Fa-f]{6}$ additionalProperties: false voice: type: string tagline: type: string additionalProperties: false required: - domain additionalProperties: false objective: type: string prompt: type: string accumulated_feedback: type: array items: type: string status: type: string enum: - drafting - refining - evaluating - finalized source_asset: type: object properties: asset_id: type: string minLength: 1 label: type: string minLength: 1 maxLength: 255 url: type: string minLength: 1 source: type: string enum: - upload - url - dam - product_catalog - brand_library - local - generated role: type: string enum: - product - logo - background - reference - copy - audio - video locked_asset: type: boolean can_transform: type: boolean preservation_notes: type: string maxLength: 1000 rights: type: object properties: status: default: unknown type: string enum: - unknown - owned - licensed - restricted - expired usage: type: string expires_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ notes: type: string required: - status additionalProperties: false dimensions: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 duration_seconds: type: number exclusiveMinimum: 0 additionalProperties: false render_crop: type: object properties: x: type: number minimum: 0 maximum: 1 y: type: number minimum: 0 maximum: 1 width: type: number maximum: 1 exclusiveMinimum: 0 height: type: number maximum: 1 exclusiveMinimum: 0 units: default: normalized type: string enum: - normalized source: type: string enum: - user - system - dam - product_catalog notes: type: string maxLength: 500 required: - x - y - width - height - units additionalProperties: false checksum: type: string minLength: 1 mime_type: type: string minLength: 1 required: - label - url additionalProperties: false asset_store: type: object properties: status: type: string enum: - linked - session_inline - external - unconfigured summary: type: string assets: type: array items: type: object properties: asset_id: type: string minLength: 1 label: type: string minLength: 1 maxLength: 255 url: type: string minLength: 1 source: type: string enum: - upload - url - dam - product_catalog - brand_library - local - generated role: type: string enum: - product - logo - background - reference - copy - audio - video locked_asset: type: boolean can_transform: type: boolean preservation_notes: type: string maxLength: 1000 rights: type: object properties: status: default: unknown type: string enum: - unknown - owned - licensed - restricted - expired usage: type: string expires_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ notes: type: string required: - status additionalProperties: false dimensions: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 duration_seconds: type: number exclusiveMinimum: 0 additionalProperties: false render_crop: type: object properties: x: type: number minimum: 0 maximum: 1 y: type: number minimum: 0 maximum: 1 width: type: number maximum: 1 exclusiveMinimum: 0 height: type: number maximum: 1 exclusiveMinimum: 0 units: default: normalized type: string enum: - normalized source: type: string enum: - user - system - dam - product_catalog notes: type: string maxLength: 500 required: - x - y - width - height - units additionalProperties: false checksum: type: string minLength: 1 mime_type: type: string minLength: 1 required: - label - url additionalProperties: false renditions: type: array items: type: object properties: asset_id: type: string minLength: 1 parent_asset_id: type: string minLength: 1 rendition_type: type: string enum: - transparent_cutout - thumbnail - render_crop label: type: string minLength: 1 maxLength: 255 url: type: string minLength: 1 source: type: string enum: - upload - url - dam - product_catalog - brand_library - local - generated role: type: string enum: - product - logo - background - reference - copy - audio - video mime_type: type: string minLength: 1 width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 alpha: type: boolean locked_asset: type: boolean can_transform: type: boolean rights: type: object properties: status: default: inherited type: string enum: - unknown - owned - licensed - restricted - expired - inherited usage: type: string expires_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ notes: type: string source_asset_id: type: string minLength: 1 required: - status additionalProperties: false provenance: type: object properties: method: type: string enum: - background_removal - thumbnail_generation - original_has_alpha - render_crop provider: type: string minLength: 1 source_checksum: type: string minLength: 1 created_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ additionalProperties: false quality: type: object properties: status: type: string enum: - approved - needs_review - failed checks: type: array items: type: object properties: code: type: string minLength: 1 status: type: string enum: - pass - warn - fail detail: type: string maxLength: 1000 required: - code - status additionalProperties: false required: - status additionalProperties: false required: - asset_id - parent_asset_id - rendition_type - label - url additionalProperties: false required: - status - summary - assets additionalProperties: false creative_plan: type: object properties: provider_type: type: string enum: - amazon - audiostack - elevenlabs - fal - gemini - google - linkedin - meta - openai - pinterest - reddit - snap - spotify - tiktok - veo modality: type: string enum: - image - video - audio format_discovery: type: string enum: - canonical - static_catalog - aao_registry - planner_default target_format_id: type: object properties: agent_url: type: string id: type: string width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - agent_url - id additionalProperties: false format_kind: type: string enum: - audio_hosted params: type: object properties: duration_ms_exact: type: integer maximum: 9007199254740991 minimum: 1 additionalProperties: false transformer_id: type: string format_source: type: string enum: - explicit - draft_fallback manifest_strategy: type: string enum: - pass_through - synthesize_required_text_assets generation_strategy: type: string enum: - native_reference_edit - scene_then_locked_composite - text_to_image - audio_script_to_mix - video_text_to_video composition_strategy: type: string enum: - native_integrated_with_locked_final_overlay - deterministic_locked_overlay - native_integrated - none variant_strategy: type: object properties: dimension: type: string values: type: array items: type: string requested_count: type: integer maximum: 9007199254740991 minimum: 1 feedback_mode: type: string enum: - select_then_refine evaluator_mode: type: string enum: - draft_soft_final_hard required: - values - requested_count - feedback_mode - evaluator_mode additionalProperties: false native_capabilities: type: object properties: reference_image_input: type: boolean native_image_editing: type: boolean locked_asset_compositing: type: boolean audio_duration_targeting: type: boolean audio_language_control: type: boolean required: - reference_image_input - native_image_editing - locked_asset_compositing - audio_duration_targeting - audio_language_control additionalProperties: false required_assets: type: array items: type: object properties: asset_id: type: string asset_type: type: string required: type: boolean source: type: string enum: - format_catalog - planner_default required: - asset_id - asset_type - required - source additionalProperties: false required: - provider_type - modality - format_discovery - format_source - manifest_strategy - generation_strategy - composition_strategy - variant_strategy - native_capabilities - required_assets additionalProperties: false required_placements: type: array items: type: object properties: format_id: type: string agent_url: type: string label: type: string width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 dimensions: type: string required: - format_id - agent_url - label additionalProperties: false renderer_capabilities: type: array items: type: object properties: format_id: type: string label: type: string modality: type: string enum: - image - video - audio - html - native - unknown renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false dimensions: type: string publisher_context: type: string required: - format_id - label - modality - renderer additionalProperties: false rendering_model: type: object properties: creative_canvas: type: object properties: label: type: string description: type: string includes: type: array items: type: string excludes: type: array items: type: string required: - label - description - includes - excludes additionalProperties: false review_surface: type: object properties: label: type: string description: type: string includes: type: array items: type: string excludes: type: array items: type: string required: - label - description - includes - excludes additionalProperties: false required: - creative_canvas - review_surface additionalProperties: false flow: type: array items: type: object properties: label: type: string state: type: string enum: - done - current - pending summary: type: string required: - label - state - summary additionalProperties: false variants: type: array items: type: object properties: build_variant_id: type: string parent_build_variant_id: type: string name: type: string direction: type: string rationale: type: string quality: description: Creative quality level per AdCP protocol type: string enum: - draft - production status: type: string enum: - draft - selected - refined - finalized recommended: type: boolean preview: oneOf: - type: object properties: type: type: string enum: - image url: type: string minLength: 1 alt: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - video url: type: string minLength: 1 renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - audio url: type: string minLength: 1 title: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - html html: type: string minLength: 1 renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - html additionalProperties: false - type: object properties: type: type: string enum: - link url: type: string minLength: 1 label: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false type: object score: type: number evaluation: type: array items: type: object properties: evaluator_id: type: string minLength: 1 evaluator_version: type: string minLength: 1 category: type: string enum: - readiness - asset - brand_brief - format_seller - policy_safety - performance code: type: string label: type: string stage: type: string enum: - generation - selection - refinement - finalization - adaptation - approval - live_learning - draft - final status: type: string enum: - pass - warn - fail detail: type: string severity: type: string enum: - hard - soft blocking: type: boolean confidence: type: number minimum: 0 maximum: 1 evidence_refs: type: array items: type: string minLength: 1 remediation: type: string maxLength: 1000 required: - label - status - detail additionalProperties: false required: - build_variant_id - name - direction - rationale - quality - status - preview additionalProperties: false selected_variant_id: type: string refined_variant_id: type: string format_renders: type: array items: type: object properties: format_id: type: string label: type: string publisher_context: type: string dimensions: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false preview: oneOf: - type: object properties: type: type: string enum: - image url: type: string minLength: 1 alt: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - video url: type: string minLength: 1 renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - audio url: type: string minLength: 1 title: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false - type: object properties: type: type: string enum: - html html: type: string minLength: 1 renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - html additionalProperties: false - type: object properties: type: type: string enum: - link url: type: string minLength: 1 label: type: string renderer: type: object properties: kind: type: string enum: - image - video - audio - html - iframe - link label: type: string mime_type: type: string controls: type: boolean canonical: type: boolean required: - kind - label additionalProperties: false required: - type - url additionalProperties: false type: object evaluation: type: array items: type: object properties: evaluator_id: type: string minLength: 1 evaluator_version: type: string minLength: 1 category: type: string enum: - readiness - asset - brand_brief - format_seller - policy_safety - performance code: type: string label: type: string stage: type: string enum: - generation - selection - refinement - finalization - adaptation - approval - live_learning - draft - final status: type: string enum: - pass - warn - fail detail: type: string severity: type: string enum: - hard - soft blocking: type: boolean confidence: type: number minimum: 0 maximum: 1 evidence_refs: type: array items: type: string minLength: 1 remediation: type: string maxLength: 1000 required: - label - status - detail additionalProperties: false required: - format_id - label - publisher_context - preview additionalProperties: false next_steps: type: array items: type: object properties: kind: type: string enum: - creative_review - asset_rights - seller_formats - performance_measurement - launch_handoff label: type: string status: type: string enum: - done - attention - pending - blocked summary: type: string action: type: string required: - kind - label - status - summary additionalProperties: false notices: type: array items: type: object properties: code: type: string enum: - variant_count_mismatch severity: type: string enum: - info - warn message: type: string required: - code - severity - message additionalProperties: false finalization: type: object properties: creative_id: type: string manifest_id: type: string sync_status: type: string summary: type: string required: - creative_id - manifest_id - sync_status - summary additionalProperties: false required: - creative_session_id - campaign_id - title - persona - brand - objective - prompt - status - flow - variants - format_renders additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-sessions/{sessionId}/evaluate: post: operationId: evaluateCreativeSession summary: Evaluate creative session description: Run draft or final evaluator checks across a creative iteration session. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: sessionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: type: object properties: stage: default: draft type: string enum: - generation - selection - refinement - finalization - adaptation - approval - live_learning - draft - final selected_variant_id: type: string minLength: 1 responses: '200': description: Evaluate creative session '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-sessions/{sessionId}/finalize: post: operationId: finalizeCreativeSession summary: Finalize creative session description: Save the selected creative session variant as a campaign creative manifest. tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string minLength: 1 required: true - in: path name: sessionId schema: type: string minLength: 1 required: true requestBody: required: true content: application/json: schema: type: object properties: selected_variant_id: type: string minLength: 1 name: type: string minLength: 1 maxLength: 255 message: type: string minLength: 1 maxLength: 5000 responses: '200': description: Finalize creative session '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /campaigns/{campaignId}/creative-references: get: operationId: getCreativeReferences summary: Get creative references description: 'Get the campaign advertiser''s creative library as generative reference sources: sourced materials (reference-role assets, filterable by media type) and past creatives (filterable by campaign). Gated behind the buyer-generative-creative surface.' tags: - Creatives security: - bearerAuth: [] parameters: - in: path name: campaignId schema: type: string required: true responses: '200': description: Get creative references content: application/json: schema: type: object properties: campaign_id: type: string sourced_materials: type: array items: type: object properties: reference_id: type: string name: type: string format: type: string media_kind: type: string enum: - image - video - audio - other reuse_count: type: integer minimum: 0 maximum: 9007199254740991 preview_url: type: string required: - reference_id - name - format - media_kind additionalProperties: false sourced_materials_total: type: integer minimum: 0 maximum: 9007199254740991 past_creatives: type: array items: type: object properties: creative_id: type: string name: type: string format: type: string reuse_count: type: integer minimum: 0 maximum: 9007199254740991 preview_url: type: string campaign_id: type: string campaign_name: type: string required: - creative_id - name - format - campaign_id additionalProperties: false past_creatives_total: type: integer minimum: 0 maximum: 9007199254740991 preselected: type: object properties: sourced_materials: type: array items: type: string past_creatives: type: array items: type: string required: - sourced_materials - past_creatives additionalProperties: false required: - campaign_id - sourced_materials - past_creatives additionalProperties: false '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' components: schemas: CreativeManifestListResponse: description: Paginated list of creative manifest summaries type: object properties: manifests: description: Manifests projected to the summary shape. Use `get_creative` for full detail. type: array items: $ref: '#/components/schemas/CreativeManifestSummary' total: type: integer minimum: 0 maximum: 9007199254740991 required: - manifests - total additionalProperties: false CreativeAssetControl: description: Renderer/evaluator guidance for supplied creative assets that must retain visual fidelity through generation and refinement. type: object properties: locked_asset: description: When true, creative generation and rendering should preserve this supplied asset rather than redraw or reinterpret it. type: boolean asset_role: description: Role of the supplied asset, such as product, package, logo, brand, reference, or scene. type: string enum: - product - package - logo - brand - reference - scene - other can_transform: description: Whether the asset may be transformed. Set false for exact product imagery, packaging, logos, book covers, or regulated artwork. type: boolean preservation_notes: description: Human-readable instructions for preserving asset fidelity, e.g. "Preserve cover typography and portrait exactly." type: string minLength: 1 maxLength: 1000 source_asset_id: description: Raw/source creative-session asset ID used to derive this linked asset, when the asset is a rendition or locked composite. type: string minLength: 1 maxLength: 255 rendition_asset_id: description: Creative-session rendition asset ID used in the final creative manifest. type: string minLength: 1 maxLength: 255 additionalProperties: false ConnectBuyerModelCredentialBody: type: object properties: providerType: type: string enum: - audiostack - elevenlabs - fal - gemini - openai - veo apiKey: type: string minLength: 1 label: type: string minLength: 1 maxLength: 120 required: - providerType - apiKey - label CreativeCollectionMemberInput: description: A saved creative or source/generated asset to add to a collection. type: object properties: member_type: description: Type of item in a creative collection. Creative members are saved campaign creatives; asset members are raw/source/brand/generated assets. type: string enum: - creative - asset member_id: type: string minLength: 1 maxLength: 255 label: type: string minLength: 1 maxLength: 255 metadata: default: {} type: object additionalProperties: {} required: - member_type - member_id FrequencyCapWindow: description: Rolling time window over which max_impressions applies (AdCP Duration shape). type: object properties: interval: type: number minimum: 1 unit: anyOf: - type: string enum: - seconds - type: string enum: - minutes - type: string enum: - hours - type: string enum: - days - type: string enum: - campaign required: - interval - unit additionalProperties: {} CreateCreativeManifestMetadata: description: JSON metadata for creating a creative manifest type: object properties: name: description: Manifest name (auto-generated if omitted) type: string minLength: 1 maxLength: 255 message: description: Creative brief / direction text type: string minLength: 1 maxLength: 5000 url_asset: description: Add a single URL asset (per AdCP url-asset spec). For multi-slot formats (e.g. native), use `url_assets` instead. type: object properties: url: description: URL to add as asset (must be http/https) type: string format: uri url_type: description: URL type classification type: string enum: - clickthrough - tracker_pixel - tracker_script - vast required: - url - url_type url_assets: description: URL assets assigned to specific AdCP format slots (e.g. native landing_page, click trackers). Each entry pairs a slot `asset_id` with a URL. maxItems: 50 type: array items: $ref: '#/components/schemas/UrlAssetSlotInput' text_assets: description: Text assets assigned to specific AdCP format slots (e.g. native headline, long_headline, description, business_name, disclosure). Each entry pairs a slot `asset_id` with content. maxItems: 50 type: array items: $ref: '#/components/schemas/TextAssetSlotInput' webhook_asset: description: Add a webhook asset for DCO (dynamic content). type: object properties: url: description: URL to add as asset (must be http/https) type: string format: uri method: type: string enum: - GET - POST timeout_ms: type: integer minimum: 10 maximum: 5000 response_type: type: string enum: - html - json - xml - javascript security: type: object properties: method: type: string enum: - hmac_sha256 - api_key - none hmac_header: type: string api_key_header: type: string required: - method required: - url - response_type - security format_id: description: Legacy-v1 ADCP named-format ref for this creative (auto-resolved from template if omitted). Use format_kind for AdCP 3.1 canonical formats. type: object properties: agent_url: type: string id: type: string pattern: ^[a-zA-Z0-9_-]+$ width: type: number minimum: 1 height: type: number minimum: 1 duration_ms: type: number minimum: 1 required: - agent_url - id additionalProperties: {} format_kind: description: AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted). Alternative to format_id for canonical formats. anyOf: - type: string enum: - image - type: string enum: - html5 - type: string enum: - display_tag - type: string enum: - image_carousel - type: string enum: - video_hosted - type: string enum: - video_vast - type: string enum: - audio_hosted - type: string enum: - audio_daast - type: string enum: - sponsored_placement - type: string enum: - native_in_feed - type: string enum: - responsive_creative - type: string enum: - agent_placement - type: string enum: - custom format_option_ref: description: Pins this manifest to a specific format_options[] entry on a product, identified by format_option_id. Use scope:"publisher" with publisher_domain for catalog-backed options, scope:"product" for product-inline options. oneOf: - type: object properties: scope: type: string enum: - publisher publisher_domain: type: string format_option_id: type: string required: - scope - publisher_domain - format_option_id additionalProperties: false - type: object properties: scope: type: string enum: - product format_option_id: type: string required: - scope - format_option_id additionalProperties: false type: object industry_identifiers: description: Industry identifiers (Ad-ID, ISCI, Clearcast clock number, IDcrea) per AdCP spec. type: array items: type: object properties: type: type: string enum: - ad_id - isci - clearcast_clock - idcrea value: type: string required: - type - value template_id: description: Creative template ID — legacy-v1 ADCP named-format id (e.g., "display_image", "display_html", "video_standard") or vendor tag (e.g., "vendor_dcm_tag") type: string assets: description: 'Multipart REST metadata only: each filename must match a file uploaded in the same multipart request. Murph chat attachments are not multipart files; represent them as linked_assets[].data_url using the murph-attachment://N placeholder instead. If omitted, multipart files are auto-classified.' type: array items: type: object properties: filename: description: Must match an uploaded file's originalname type: string minLength: 1 asset_type: description: Asset type (auto-detected from MIME if omitted) type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT label: description: Label/key for this asset in the manifest (auto-generated if omitted) type: string slot_asset_id: description: AdCP format slot asset_id for this file (used by multi-slot formats like native). type: string minLength: 1 maxLength: 255 locked_asset: description: When true, creative generation and rendering should preserve this supplied asset rather than redraw or reinterpret it. type: boolean asset_role: description: Role of the supplied asset, such as product, package, logo, brand, reference, or scene. type: string enum: - product - package - logo - brand - reference - scene - other can_transform: description: Whether the asset may be transformed. Set false for exact product imagery, packaging, logos, book covers, or regulated artwork. type: boolean preservation_notes: description: Human-readable instructions for preserving asset fidelity, e.g. "Preserve cover typography and portrait exactly." type: string minLength: 1 maxLength: 1000 source_asset_id: description: Raw/source creative-session asset ID used to derive this linked asset, when the asset is a rendition or locked composite. type: string minLength: 1 maxLength: 255 rendition_asset_id: description: Creative-session rendition asset ID used in the final creative manifest. type: string minLength: 1 maxLength: 255 required: - filename linked_assets: description: URL-backed or inline media assets from a chat attachment, DAM, catalog, product page, or creative generator. For every Murph chat attachment, use linked_assets[].data_url = murph-attachment://N; never put its filename in assets[] because buyer_api_call does not send multipart file bytes. maxItems: 50 type: array items: $ref: '#/components/schemas/LinkedCreativeAssetInput' brandAgentId: description: Advertiser ID (parameter name kept for wire compatibility). Required when creating an advertiser-level master without a campaign. Ignored when the manifest is created under a campaign (resolved from campaign context). type: string frequencyCaps: description: Buyer-defined frequency caps for this creative. When provided, sets the full list. type: array items: $ref: '#/components/schemas/FrequencyCapConfigInput' cards: description: Carousel cards (image_carousel format). Min 2, max 10. Each card needs filename (for an uploaded file) or url (for a pre-hosted asset), plus optional headline, description, cta, landing_page_url. minItems: 2 maxItems: 10 type: array items: $ref: '#/components/schemas/CardInput' ManifestAssetResponse: description: Asset within a creative manifest type: object properties: asset_id: description: Asset ID type: string name: description: Display name type: string original_filename: description: Original uploaded filename type: string asset_type: description: Asset type type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT content_type: description: MIME type type: string file_size: description: File size in bytes type: integer minimum: -9007199254740991 maximum: 9007199254740991 public_url: description: Public URL type: string format: uri asset_source: description: Whether this asset was uploaded by the user or generated by the system type: string enum: - CREATIVE_SOURCE - USER_UPLOADED - SYSTEM_PROCESSED slot_asset_id: description: AdCP format slot asset_id assigned to this asset, when applicable. The slot asset_id is the key under which the asset appears in the AdCP creative manifest. type: string asset_control: description: Optional fidelity controls for supplied assets that should be preserved by creative generators, renderers, and evaluators. allOf: - $ref: '#/components/schemas/CreativeAssetControl' width: description: Actual width in pixels (image and video assets only) type: integer maximum: 9007199254740991 minimum: 1 height: description: Actual height in pixels (image and video assets only) type: integer maximum: 9007199254740991 minimum: 1 declared_sizes: description: Buyer-declared display sizes for an HTML ad tag, supplied out-of-band via a CSV/manifest at upload. Declared, not probed — distinct from width/height, which hold measured dimensions. type: array items: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - width - height additionalProperties: false duration_ms: description: Detected duration in milliseconds, probed at upload (video and audio assets) type: integer maximum: 9007199254740991 minimum: 1 codec: description: Detected codec, normalized at upload, e.g. "h264", "aac", "mp3" (video and audio assets) type: string bitrate_kbps: description: Detected average overall bitrate in kilobits per second (video and audio assets) type: integer maximum: 9007199254740991 minimum: 1 frame_rate: description: Detected frames per second, e.g. 30 or 29.97 (video assets) type: number exclusiveMinimum: 0 sample_rate: description: Detected audio sampling rate in hertz, e.g. 44100 (audio assets) type: integer maximum: 9007199254740991 minimum: 1 container: description: Detected container/format family, e.g. "mp4", "mp3", "wav" (video and audio assets) type: string warnings: description: Dimensional inconsistencies detected at upload time. Present only when a problem was found. type: array items: $ref: '#/components/schemas/AssetDimensionWarning' created_at: description: Upload timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - asset_id - name - original_filename - asset_type - content_type - file_size - public_url - asset_source - created_at additionalProperties: false TemplateAssetRequirement: description: Asset slot within a creative template. Re-exported from `@adcp/sdk` as `FormatAssetSlot` — a discriminated union over `item_type` (`individual` or `repeatable_group`) per the AdCP spec. anyOf: - anyOf: - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - image requirements: type: object properties: min_width: type: number max_width: type: number min_height: type: number max_height: type: number unit: anyOf: - type: string enum: - px - type: string enum: - dp - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt aspect_ratio: type: string pattern: ^\d+(\.\d+)?:\d+(\.\d+)?$ formats: type: array items: anyOf: - type: string enum: - jpg - type: string enum: - jpeg - type: string enum: - png - type: string enum: - gif - type: string enum: - webp - type: string enum: - svg - type: string enum: - avif - type: string enum: - tiff - type: string enum: - pdf - type: string enum: - eps min_dpi: type: number minimum: 1 bleed: anyOf: - type: object properties: uniform: type: number minimum: 0 required: - uniform additionalProperties: {} - type: object properties: top: type: number minimum: 0 right: type: number minimum: 0 bottom: type: number minimum: 0 left: type: number minimum: 0 required: - top - right - bottom - left additionalProperties: {} color_space: anyOf: - type: string enum: - rgb - type: string enum: - cmyk - type: string enum: - grayscale max_file_size_kb: type: number minimum: 1 transparency_required: type: boolean animation_allowed: type: boolean max_animation_duration_ms: type: number minimum: 0 max_weight_grams: type: number additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - video requirements: type: object properties: min_width: type: number minimum: 1 max_width: type: number minimum: 1 min_height: type: number minimum: 1 max_height: type: number minimum: 1 aspect_ratio: type: string pattern: ^\d+:\d+$ min_duration_ms: type: number minimum: 1 max_duration_ms: type: number minimum: 1 containers: type: array items: anyOf: - type: string enum: - mp4 - type: string enum: - webm - type: string enum: - mov - type: string enum: - avi - type: string enum: - mkv codecs: type: array items: anyOf: - type: string enum: - h264 - type: string enum: - h265 - type: string enum: - vp8 - type: string enum: - vp9 - type: string enum: - av1 - type: string enum: - prores max_file_size_kb: type: number minimum: 1 min_bitrate_kbps: type: number minimum: 1 max_bitrate_kbps: type: number minimum: 1 frame_rates: type: array items: type: number audio_required: type: boolean frame_rate_type: anyOf: - type: string enum: - constant - type: string enum: - variable scan_type: anyOf: - type: string enum: - progressive - type: string enum: - interlaced gop_type: anyOf: - type: string enum: - closed - type: string enum: - open min_gop_interval_seconds: type: number minimum: 0 max_gop_interval_seconds: type: number minimum: 0 moov_atom_position: anyOf: - type: string enum: - start - type: string enum: - end audio_codecs: type: array items: anyOf: - type: string enum: - aac - type: string enum: - pcm - type: string enum: - ac3 - type: string enum: - eac3 - type: string enum: - mp3 - type: string enum: - opus - type: string enum: - vorbis - type: string enum: - flac audio_sample_rates: type: array items: type: number audio_channels: type: array items: anyOf: - type: string enum: - mono - type: string enum: - stereo - type: string enum: - '5.1' - type: string enum: - '7.1' loudness_lufs: type: number loudness_tolerance_db: type: number minimum: 0 true_peak_dbfs: type: number additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - audio requirements: type: object properties: min_duration_ms: type: number minimum: 1 max_duration_ms: type: number minimum: 1 formats: type: array items: anyOf: - type: string enum: - mp3 - type: string enum: - aac - type: string enum: - wav - type: string enum: - ogg - type: string enum: - flac max_file_size_kb: type: number minimum: 1 sample_rates: type: array items: type: number channels: type: array items: anyOf: - type: string enum: - mono - type: string enum: - stereo min_bitrate_kbps: type: number minimum: 1 max_bitrate_kbps: type: number minimum: 1 additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - text requirements: type: object properties: min_length: type: number minimum: 0 max_length: type: number minimum: 1 min_lines: type: number minimum: 1 max_lines: type: number minimum: 1 character_pattern: type: string prohibited_terms: type: array items: type: string allowed_values: type: array items: type: string additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - markdown requirements: type: object properties: max_length: type: number minimum: 1 additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - html requirements: type: object properties: max_file_size_kb: type: number minimum: 1 sandbox: anyOf: - type: string enum: - none - type: string enum: - iframe - type: string enum: - safeframe - type: string enum: - fencedframe external_resources_allowed: type: boolean allowed_external_domains: type: array items: type: string additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - css requirements: type: object properties: max_file_size_kb: type: number minimum: 1 additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - javascript requirements: type: object properties: max_file_size_kb: type: number minimum: 1 module_type: anyOf: - type: string enum: - script - type: string enum: - module - type: string enum: - iife strict_mode_required: type: boolean external_resources_allowed: type: boolean allowed_external_domains: type: array items: type: string additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - vast requirements: type: object properties: vast_version: anyOf: - type: string enum: - '2.0' - type: string enum: - '3.0' - type: string enum: - '4.0' - type: string enum: - '4.1' - type: string enum: - '4.2' additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - daast requirements: type: object properties: daast_version: type: string enum: - '1.0' additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - url requirements: type: object properties: role: anyOf: - type: string enum: - clickthrough - type: string enum: - landing_page - type: string enum: - impression_tracker - type: string enum: - click_tracker - type: string enum: - viewability_tracker - type: string enum: - third_party_tracker protocols: type: array items: anyOf: - type: string enum: - https - type: string enum: - http allowed_domains: type: array items: type: string max_length: type: number minimum: 1 macro_support: type: boolean additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - webhook requirements: type: object properties: methods: type: array items: anyOf: - type: string enum: - GET - type: string enum: - POST additionalProperties: {} required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - brief required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - individual asset_id: type: string asset_role: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_group_id: type: string asset_type: type: string enum: - catalog required: - item_type - asset_id - required - asset_type additionalProperties: {} - type: object properties: item_type: type: string enum: - repeatable_group asset_group_id: type: string required: type: boolean min_count: type: number minimum: 0 max_count: type: number minimum: 1 selection_mode: anyOf: - type: string enum: - sequential - type: string enum: - optimize assets: type: array items: anyOf: - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - image requirements: type: object properties: min_width: type: number max_width: type: number min_height: type: number max_height: type: number unit: anyOf: - type: string enum: - px - type: string enum: - dp - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt aspect_ratio: type: string pattern: ^\d+(\.\d+)?:\d+(\.\d+)?$ formats: type: array items: anyOf: - type: string enum: - jpg - type: string enum: - jpeg - type: string enum: - png - type: string enum: - gif - type: string enum: - webp - type: string enum: - svg - type: string enum: - avif - type: string enum: - tiff - type: string enum: - pdf - type: string enum: - eps min_dpi: type: number minimum: 1 bleed: anyOf: - type: object properties: uniform: type: number minimum: 0 required: - uniform additionalProperties: {} - type: object properties: top: type: number minimum: 0 right: type: number minimum: 0 bottom: type: number minimum: 0 left: type: number minimum: 0 required: - top - right - bottom - left additionalProperties: {} color_space: anyOf: - type: string enum: - rgb - type: string enum: - cmyk - type: string enum: - grayscale max_file_size_kb: type: number minimum: 1 transparency_required: type: boolean animation_allowed: type: boolean max_animation_duration_ms: type: number minimum: 0 max_weight_grams: type: number additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - video requirements: type: object properties: min_width: type: number minimum: 1 max_width: type: number minimum: 1 min_height: type: number minimum: 1 max_height: type: number minimum: 1 aspect_ratio: type: string pattern: ^\d+:\d+$ min_duration_ms: type: number minimum: 1 max_duration_ms: type: number minimum: 1 containers: type: array items: anyOf: - type: string enum: - mp4 - type: string enum: - webm - type: string enum: - mov - type: string enum: - avi - type: string enum: - mkv codecs: type: array items: anyOf: - type: string enum: - h264 - type: string enum: - h265 - type: string enum: - vp8 - type: string enum: - vp9 - type: string enum: - av1 - type: string enum: - prores max_file_size_kb: type: number minimum: 1 min_bitrate_kbps: type: number minimum: 1 max_bitrate_kbps: type: number minimum: 1 frame_rates: type: array items: type: number audio_required: type: boolean frame_rate_type: anyOf: - type: string enum: - constant - type: string enum: - variable scan_type: anyOf: - type: string enum: - progressive - type: string enum: - interlaced gop_type: anyOf: - type: string enum: - closed - type: string enum: - open min_gop_interval_seconds: type: number minimum: 0 max_gop_interval_seconds: type: number minimum: 0 moov_atom_position: anyOf: - type: string enum: - start - type: string enum: - end audio_codecs: type: array items: anyOf: - type: string enum: - aac - type: string enum: - pcm - type: string enum: - ac3 - type: string enum: - eac3 - type: string enum: - mp3 - type: string enum: - opus - type: string enum: - vorbis - type: string enum: - flac audio_sample_rates: type: array items: type: number audio_channels: type: array items: anyOf: - type: string enum: - mono - type: string enum: - stereo - type: string enum: - '5.1' - type: string enum: - '7.1' loudness_lufs: type: number loudness_tolerance_db: type: number minimum: 0 true_peak_dbfs: type: number additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - audio requirements: type: object properties: min_duration_ms: type: number minimum: 1 max_duration_ms: type: number minimum: 1 formats: type: array items: anyOf: - type: string enum: - mp3 - type: string enum: - aac - type: string enum: - wav - type: string enum: - ogg - type: string enum: - flac max_file_size_kb: type: number minimum: 1 sample_rates: type: array items: type: number channels: type: array items: anyOf: - type: string enum: - mono - type: string enum: - stereo min_bitrate_kbps: type: number minimum: 1 max_bitrate_kbps: type: number minimum: 1 additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - text requirements: type: object properties: min_length: type: number minimum: 0 max_length: type: number minimum: 1 min_lines: type: number minimum: 1 max_lines: type: number minimum: 1 character_pattern: type: string prohibited_terms: type: array items: type: string allowed_values: type: array items: type: string additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - markdown requirements: type: object properties: max_length: type: number minimum: 1 additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - html requirements: type: object properties: max_file_size_kb: type: number minimum: 1 sandbox: anyOf: - type: string enum: - none - type: string enum: - iframe - type: string enum: - safeframe - type: string enum: - fencedframe external_resources_allowed: type: boolean allowed_external_domains: type: array items: type: string additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - css requirements: type: object properties: max_file_size_kb: type: number minimum: 1 additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - javascript requirements: type: object properties: max_file_size_kb: type: number minimum: 1 module_type: anyOf: - type: string enum: - script - type: string enum: - module - type: string enum: - iife strict_mode_required: type: boolean external_resources_allowed: type: boolean allowed_external_domains: type: array items: type: string additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - vast requirements: type: object properties: vast_version: anyOf: - type: string enum: - '2.0' - type: string enum: - '3.0' - type: string enum: - '4.0' - type: string enum: - '4.1' - type: string enum: - '4.2' additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - daast requirements: type: object properties: daast_version: type: string enum: - '1.0' additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - url requirements: type: object properties: role: anyOf: - type: string enum: - clickthrough - type: string enum: - landing_page - type: string enum: - impression_tracker - type: string enum: - click_tracker - type: string enum: - viewability_tracker - type: string enum: - third_party_tracker protocols: type: array items: anyOf: - type: string enum: - https - type: string enum: - http allowed_domains: type: array items: type: string max_length: type: number minimum: 1 macro_support: type: boolean additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} - type: object properties: asset_id: type: string asset_role: type: string asset_group_id: type: string required: type: boolean overlays: type: array items: type: object properties: id: type: string description: type: string visual: type: object properties: url: type: string light: type: string dark: type: string additionalProperties: {} bounds: type: object properties: x: type: number y: type: number width: type: number minimum: 0 height: type: number minimum: 0 unit: anyOf: - type: string enum: - px - type: string enum: - fraction - type: string enum: - inches - type: string enum: - cm - type: string enum: - mm - type: string enum: - pt required: - x - y - width - height - unit additionalProperties: {} required: - id - bounds additionalProperties: {} asset_type: type: string enum: - webhook requirements: type: object properties: methods: type: array items: anyOf: - type: string enum: - GET - type: string enum: - POST additionalProperties: {} required: - asset_id - required - asset_type additionalProperties: {} required: - item_type - asset_group_id - required - min_count - max_count - assets additionalProperties: {} AdvertiserModelCredential: type: object properties: id: type: string customerId: type: integer minimum: -9007199254740991 maximum: 9007199254740991 advertiserIds: type: array items: type: string isDefault: type: boolean providerType: type: string providerDisplayName: type: string label: type: string status: type: string enum: - ACTIVE - REVOKED - ERROR maskedKey: type: - string - 'null' connectedBy: type: - string - 'null' createdAt: type: string updatedAt: type: string assignment: type: string enum: - advertiser - default effective: type: boolean required: - id - customerId - advertiserIds - isDefault - providerType - providerDisplayName - label - status - maskedKey - connectedBy - createdAt - updatedAt - assignment - effective additionalProperties: false AssignCreativeToCampaignBody: description: Assign an advertiser-library creative to a campaign type: object properties: campaignId: description: Campaign ID to assign the creative to type: string minLength: 1 required: - campaignId BulkUpdateCreativeSelection: description: Selectors for a campaign-scoped bulk creative update type: object properties: collection_id: description: Creative collection ID to use as the matched set. Only creative members in the collection are included. type: string minLength: 1 maxLength: 255 creative_ids: description: Exact creative IDs to include minItems: 1 maxItems: 200 type: array items: type: string minLength: 1 name_contains: description: Case-insensitive partial creative name match type: string minLength: 1 maxLength: 200 created_after: description: Include creatives created at or after this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ created_before: description: Include creatives created at or before this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_after: description: Include creatives updated at or after this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_before: description: Include creatives updated at or before this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ template_id: description: Match creatives using this template ID type: string minLength: 1 maxLength: 255 format_kind: description: Match creatives using this canonical format kind type: string minLength: 1 maxLength: 255 asset_type: description: Match creatives containing at least one active asset type type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT UpdateCreativeManifestMetadata: description: JSON metadata for updating a creative manifest type: object properties: name: description: Updated manifest name type: string minLength: 1 maxLength: 255 message: description: Updated creative brief type: string maxLength: 5000 format_id: description: Updated legacy-v1 ADCP named-format ref type: object properties: agent_url: type: string id: type: string pattern: ^[a-zA-Z0-9_-]+$ width: type: number minimum: 1 height: type: number minimum: 1 duration_ms: type: number minimum: 1 required: - agent_url - id additionalProperties: {} format_kind: description: Updated AdCP 3.1 canonical format kind. Alternative to format_id for canonical formats. anyOf: - type: string enum: - image - type: string enum: - html5 - type: string enum: - display_tag - type: string enum: - image_carousel - type: string enum: - video_hosted - type: string enum: - video_vast - type: string enum: - audio_hosted - type: string enum: - audio_daast - type: string enum: - sponsored_placement - type: string enum: - native_in_feed - type: string enum: - responsive_creative - type: string enum: - agent_placement - type: string enum: - custom format_option_ref: description: Updated format_option_ref. Accepts scope:"publisher" (requires publisher_domain) or scope:"product". Legacy flat shape without scope is also accepted. oneOf: - type: object properties: scope: type: string enum: - publisher publisher_domain: type: string format_option_id: type: string required: - scope - publisher_domain - format_option_id additionalProperties: false - type: object properties: scope: type: string enum: - product format_option_id: type: string required: - scope - format_option_id additionalProperties: false type: object industry_identifiers: description: Updated industry identifiers. Replaces existing list. type: array items: type: object properties: type: type: string enum: - ad_id - isci - clearcast_clock - idcrea value: type: string required: - type - value target_format_ids: description: Additional format IDs this creative covers beyond its primary format_id. Replaces the existing list. type: array items: type: object properties: agent_url: type: string id: type: string pattern: ^[a-zA-Z0-9_-]+$ width: type: number minimum: 1 height: type: number minimum: 1 duration_ms: type: number minimum: 1 required: - agent_url - id additionalProperties: {} template_id: description: Updated creative template ID type: string click_url: description: Canonical click-through URL. Server assigns this to the AdCP click_url slot and refreshes click tracking metadata. type: string format: uri url_asset: description: Add a single URL asset (per AdCP url-asset spec). For multi-slot formats (e.g. native), use `url_assets` instead. type: object properties: url: description: URL to add as asset (must be http/https) type: string format: uri url_type: description: URL type classification type: string enum: - clickthrough - tracker_pixel - tracker_script - vast required: - url - url_type url_assets: description: URL assets assigned to specific AdCP format slots. Each entry replaces any existing asset assigned to the same slot asset_id. maxItems: 50 type: array items: $ref: '#/components/schemas/UrlAssetSlotInput' text_assets: description: Text assets assigned to specific AdCP format slots. Each entry replaces any existing asset assigned to the same slot asset_id. maxItems: 50 type: array items: $ref: '#/components/schemas/TextAssetSlotInput' webhook_asset: description: Add a webhook asset for DCO (dynamic content). type: object properties: url: description: URL to add as asset (must be http/https) type: string format: uri method: type: string enum: - GET - POST timeout_ms: type: integer minimum: 10 maximum: 5000 response_type: type: string enum: - html - json - xml - javascript security: type: object properties: method: type: string enum: - hmac_sha256 - api_key - none hmac_header: type: string api_key_header: type: string required: - method required: - url - response_type - security delete_asset_ids: description: Asset IDs to remove from the manifest (max 100) maxItems: 100 type: array items: type: string minLength: 1 primary_asset_id: description: Promote this asset to CREATIVE_SOURCE (the renderable "primary" asset). Demotes the current primary to USER_UPLOADED. Only IMAGE, VIDEO, AUDIO, HTML, and VAST assets may be set as primary. type: string minLength: 1 reclassify_assets: description: Reclassify existing assets to a different type maxItems: 100 type: array items: type: object properties: asset_id: type: string minLength: 1 asset_type: description: Creative asset type (AdCP spec + extensions) type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT required: - asset_id - asset_type new_assets: description: Metadata for newly uploaded files being added type: array items: type: object properties: filename: description: Must match an uploaded file's originalname type: string minLength: 1 asset_type: description: Creative asset type (AdCP spec + extensions) type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT label: type: string slot_asset_id: description: AdCP format slot asset_id for this file (used by multi-slot formats like native). type: string minLength: 1 maxLength: 255 locked_asset: description: When true, creative generation and rendering should preserve this supplied asset rather than redraw or reinterpret it. type: boolean asset_role: description: Role of the supplied asset, such as product, package, logo, brand, reference, or scene. type: string enum: - product - package - logo - brand - reference - scene - other can_transform: description: Whether the asset may be transformed. Set false for exact product imagery, packaging, logos, book covers, or regulated artwork. type: boolean preservation_notes: description: Human-readable instructions for preserving asset fidelity, e.g. "Preserve cover typography and portrait exactly." type: string minLength: 1 maxLength: 1000 source_asset_id: description: Raw/source creative-session asset ID used to derive this linked asset, when the asset is a rendition or locked composite. type: string minLength: 1 maxLength: 255 rendition_asset_id: description: Creative-session rendition asset ID used in the final creative manifest. type: string minLength: 1 maxLength: 255 required: - filename frequencyCaps: description: Buyer-defined frequency caps for this creative. When provided, replaces the existing list; omit to preserve. type: array items: $ref: '#/components/schemas/FrequencyCapConfigInput' cards: description: Full replacement of carousel cards (image_carousel format). Max 10. Provide asset_id for existing media, filename for new uploads, or url for pre-hosted assets. maxItems: 10 type: array items: $ref: '#/components/schemas/CardUpdate' RemoveCreativeCollectionMembersBody: description: Remove saved creatives or assets from a collection. type: object properties: members: minItems: 1 maxItems: 500 type: array items: type: object properties: member_type: description: Type of item in a creative collection. Creative members are saved campaign creatives; asset members are raw/source/brand/generated assets. type: string enum: - creative - asset member_id: type: string minLength: 1 maxLength: 255 required: - member_type - member_id required: - members CreativeManifestSummary: description: Compact creative-manifest view returned by list endpoints. Use `get_creative` for the full resource. type: object properties: creative_id: description: Creative manifest ID type: string campaign_id: description: Campaign ID (omitted for advertiser-level masters) type: string name: description: Manifest name type: string format_id: description: ADCP format identifier type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} format_kind: description: AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted) type: string template_id: description: Creative template used for this manifest type: string brand_domain: description: Brand domain (auto-resolved) type: string preview_url: description: URL to preview the processed creative (processed HTML hosted in GCS) type: string format: uri requires_upgrade: description: True when this creative has no format_kind and must be upgraded before it can be assigned to new media buys. Call POST .../upgrade to set format_kind and clear this flag. type: boolean reuse_count: description: Number of campaigns this creative is actively attached to. A reuse signal for the advertiser library (returned on the advertiser-scoped list); omitted on single-manifest reads. type: integer minimum: 0 maximum: 9007199254740991 creative_role: description: Advertiser-library role (evergreen or reference). Absent for flight-specific creatives that live on their campaign. allOf: - $ref: '#/components/schemas/CreativeRole' creative_source: description: Provenance of the creative (uploaded/generated/connected). Today always "uploaded". allOf: - $ref: '#/components/schemas/CreativeSource' platform_links: description: Provider/sales-agent creative identifiers captured from sync_creatives for round-trip comparison. type: array items: $ref: '#/components/schemas/CreativeManifestPlatformLink' created_at: description: Created timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: description: Updated timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ asset_count: description: Number of uploaded assets in this manifest. Replaces the embedded `assets[]` array on summary rows. example: 3 type: integer minimum: 0 maximum: 9007199254740991 primary_asset_type: description: The dominant media asset type (VIDEO > AUDIO > IMAGE/HTML) — lets clients classify a creative by medium even when format_kind is absent (e.g. a bare upload). Omitted when the manifest has no media asset. type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT sync_status: description: Compact sync status across sales agents. Use `get_creative` for the full sync metadata (including `last_synced_at`). type: object properties: synced: description: True when the manifest is synced with at least one agent type: boolean agent_count: description: Number of sales agents the manifest is synced with type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - synced - agent_count additionalProperties: false target_format_ids: description: Additional format IDs this creative covers beyond its primary format_id. type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} placements: description: Resolved placements this creative maps to (primary + target formats), named against the campaign's required placements. Populated by the campaign creative-manifest list. type: array items: type: object properties: placement_id: type: string placement_name: type: string required: - placement_id - placement_name additionalProperties: false required: - creative_id - name - created_at - updated_at - asset_count additionalProperties: false ProductFormatOptionParams: description: Canonical format params. For hosted video, carries accepted containers/codecs. type: object properties: containers: description: Accepted delivery containers for hosted video. A buyer should only send a creative whose container is listed here. example: - mp4 type: array items: type: string enum: - mp4 - webm - mov video_codecs: description: Accepted video codecs for hosted video. example: - h264 type: array items: type: string enum: - h264 - h265 - vp8 - vp9 - av1 - prores audio_codecs: description: Accepted audio codecs for hosted video. example: - aac type: array items: type: string enum: - aac - mp3 - opus - pcm additionalProperties: {} FrequencyCapConfigInput: description: Frequency cap entry supplied inside a parent advertiser/campaign/creative request body. On PUT, the full array replaces all existing caps for that target. type: object properties: max_impressions: description: Maximum number of impressions allowed within the window example: 3 type: integer maximum: 9007199254740991 minimum: 1 window: $ref: '#/components/schemas/FrequencyCapWindow' required: - max_impressions - window additionalProperties: {} CardUpdate: description: Per-card input for updating carousel creatives. type: object properties: asset_id: description: Existing media asset ID to retain (for cards whose image has not changed). type: string minLength: 1 filename: description: Filename of an uploaded file for this card's media. type: string minLength: 1 url: description: URL of a hosted image for this card's media. type: string format: uri headline: type: string maxLength: 255 description: type: string maxLength: 2000 cta: type: string maxLength: 50 landing_page_url: description: URL to add as asset (must be http/https) type: string format: uri platform_extensions: type: array items: type: object additionalProperties: {} BulkUpdateCreativesBody: description: Bulk update saved campaign creatives. Use dry_run first to confirm the matched set. type: object properties: selection: $ref: '#/components/schemas/BulkUpdateCreativeSelection' update: type: object properties: click_url: description: Set the canonical click-through URL for every selected creative. type: string format: uri format_id: description: Set the primary format for every selected creative. Use to retype creatives to a sales agent's required format id (e.g. display_300x250_nongenerative). type: object properties: agent_url: type: string id: type: string pattern: ^[a-zA-Z0-9_-]+$ width: type: number minimum: 1 height: type: number minimum: 1 duration_ms: type: number minimum: 1 required: - agent_url - id additionalProperties: {} target_format_ids: description: Set the additional format ids every selected creative covers. Replaces the existing list on each creative. type: array items: type: object properties: agent_url: type: string id: type: string pattern: ^[a-zA-Z0-9_-]+$ width: type: number minimum: 1 height: type: number minimum: 1 duration_ms: type: number minimum: 1 required: - agent_url - id additionalProperties: {} dry_run: description: When true, return the matched creative set without applying changes. Defaults to true for human confirmation. default: true type: boolean exclude_creative_ids: description: Creative IDs to remove from the matched set before applying the update maxItems: 200 type: array items: type: string minLength: 1 limit: description: Maximum number of creatives to match/update default: 200 type: integer minimum: 1 maximum: 500 confirm_partial_batch: description: When false, applying a bulk update is rejected if more creatives match than the requested limit. Set true only when the buyer explicitly confirms a partial batch. default: false type: boolean required: - selection - update UpdateCreativeCollectionBody: description: Update creative collection metadata. type: object properties: name: type: string minLength: 1 maxLength: 255 description: type: - string - 'null' minLength: 1 maxLength: 2000 metadata: type: object additionalProperties: {} CreativeCollectionMutationResponse: description: Mutation response for collection management. type: object properties: collection: $ref: '#/components/schemas/CreativeCollectionSummary' added_count: type: integer minimum: 0 maximum: 9007199254740991 removed_count: type: integer minimum: 0 maximum: 9007199254740991 attached: allOf: - $ref: '#/components/schemas/CampaignCreativeCollectionAttachment' assigned_count: description: Number of creative_manifest_campaign rows created by this operation. type: integer minimum: 0 maximum: 9007199254740991 legacy_members_excluded: description: Creative members skipped because their manifest lacks format_kind (upgrade required). type: integer minimum: 0 maximum: 9007199254740991 ownership_excluded: description: Creative members skipped because their manifest belongs to a different advertiser than the campaign. type: integer minimum: 0 maximum: 9007199254740991 required: - collection additionalProperties: false CreativeRole: description: 'Advertiser creative-library role: evergreen (serve-ready, reusable across campaigns) or reference (a generation input, not served). Absent for flight-specific creatives.' type: string enum: - evergreen - reference ErrorResponse: description: Standard error response type: object properties: data: type: - string - 'null' enum: - null error: $ref: '#/components/schemas/ApiError' required: - data - error additionalProperties: false BulkUpdateCreativeSelectionOutput: description: Selectors for a campaign-scoped bulk creative update type: object properties: collection_id: description: Creative collection ID to use as the matched set. Only creative members in the collection are included. type: string minLength: 1 maxLength: 255 creative_ids: description: Exact creative IDs to include minItems: 1 maxItems: 200 type: array items: type: string minLength: 1 name_contains: description: Case-insensitive partial creative name match type: string minLength: 1 maxLength: 200 created_after: description: Include creatives created at or after this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ created_before: description: Include creatives created at or before this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_after: description: Include creatives updated at or after this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_before: description: Include creatives updated at or before this ISO timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ template_id: description: Match creatives using this template ID type: string minLength: 1 maxLength: 255 format_kind: description: Match creatives using this canonical format kind type: string minLength: 1 maxLength: 255 asset_type: description: Match creatives containing at least one active asset type type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT additionalProperties: false LinkedCreativeAssetInput: description: A linked or inline generated creative asset that can be saved into the manifest asset store without multipart file upload. type: object properties: url: description: Publicly reachable URL for a hosted creative asset from a DAM, catalog, product page, or creative generator. type: string format: uri data_url: description: Inline generated creative asset as a base64 data URL. Use when a local/dev creative adapter returns inline assets because no asset store is configured. type: string pattern: ^data:(image|video|audio|text\/html|application\/xml|text\/plain)[^;]*;base64,[A-Za-z0-9+/=]+$ asset_type: description: Creative asset type represented by the linked URL (IMAGE, VIDEO, AUDIO, HTML, VAST, etc.). type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT label: description: Human-readable label for this linked asset. type: string minLength: 1 maxLength: 255 slot_asset_id: description: Optional AdCP format slot asset_id for this linked asset (for example, "image", "video", or "audio"). type: string minLength: 1 maxLength: 255 content_type: description: Optional MIME type. If omitted, the server infers a sensible default from asset_type and URL extension. type: string minLength: 1 maxLength: 255 duration_ms: description: Duration in milliseconds for time-based assets (VIDEO, AUDIO, VAST). Persisted so the media-buy compatibility gate can verify the creative fits a slot's required duration before syncing it to a source. type: integer minimum: 0 maximum: 9007199254740991 declared_sizes: description: Buyer-declared display sizes (width×height in pixels) for an HTML ad tag whose markup doesn't declare one — supplied out-of-band via a CSV/manifest. Persisted so the tag can still auto-map to placements when assigned to a campaign in a later turn. Ignored for non-HTML assets (images/video carry probed dimensions). maxItems: 30 type: array items: type: object properties: width: type: integer maximum: 9007199254740991 minimum: 1 height: type: integer maximum: 9007199254740991 minimum: 1 required: - width - height make_primary: description: When true, make this URL-backed asset the primary renderable creative source. Only one linked asset may be primary. type: boolean locked_asset: description: When true, creative generation and rendering should preserve this supplied asset rather than redraw or reinterpret it. type: boolean asset_role: description: Role of the supplied asset, such as product, package, logo, brand, reference, or scene. type: string enum: - product - package - logo - brand - reference - scene - other can_transform: description: Whether the asset may be transformed. Set false for exact product imagery, packaging, logos, book covers, or regulated artwork. type: boolean preservation_notes: description: Human-readable instructions for preserving asset fidelity, e.g. "Preserve cover typography and portrait exactly." type: string minLength: 1 maxLength: 1000 source_asset_id: description: Raw/source creative-session asset ID used to derive this linked asset, when the asset is a rendition or locked composite. type: string minLength: 1 maxLength: 255 rendition_asset_id: description: Creative-session rendition asset ID used in the final creative manifest. type: string minLength: 1 maxLength: 255 required: - asset_type SaveCreativesToLibraryBody: description: Promote advertiser creatives into the library ("the shelf") with a role. Identify the creatives by creative_ids or by collection_id. type: object properties: creative_ids: description: Creative manifest IDs to promote into the advertiser library. Provide this or collection_id. type: array items: type: string minLength: 1 collection_id: description: A saved collection (e.g. the one grouped at creative-intent time) whose creative members are all promoted. Provide this or creative_ids — collection_id scales to any number of creatives. type: string minLength: 1 role: description: 'Library role to assign: evergreen (serve-ready) or reference (generation input).' allOf: - $ref: '#/components/schemas/CreativeRole' required: - role UrlAssetSlotInput: description: URL asset assigned to an AdCP format slot. The slot asset_id is the key in the creative manifest assets map. type: object properties: asset_id: description: AdCP format slot asset_id (e.g. "landing_page", "click_url") type: string minLength: 1 maxLength: 255 url: description: URL to add as asset (must be http/https) type: string format: uri url_type: description: URL type classification. Optional — the server derives the canonical url_type from `asset_id` (e.g. "landing_page" → clickthrough, "impression_tracker" → tracker_pixel). Any client-provided value is treated as a hint, not authoritative. type: string enum: - clickthrough - tracker_pixel - tracker_script - vast required: - asset_id - url FrequencyCapConfig: description: Buyer-side frequency cap configuration type: object properties: max_impressions: description: Maximum number of impressions allowed within the window example: 3 type: integer maximum: 9007199254740991 minimum: 1 window: $ref: '#/components/schemas/FrequencyCapWindow' id: description: Unique identifier for the frequency cap config example: '12345' type: string targetLevel: description: Level of the entity the cap applies to allOf: - $ref: '#/components/schemas/FrequencyCapTargetLevel' targetId: description: 'Identifier of the entity at the chosen target level: advertiser_id when targetLevel is ADVERTISER, campaign_id when CAMPAIGN, creative_id when CREATIVE.' example: camp_abc123 type: string createdAt: description: ISO 8601 creation timestamp type: string updatedAt: description: ISO 8601 last-updated timestamp type: string archivedAt: description: ISO 8601 archive timestamp; null for active configs type: - string - 'null' required: - max_impressions - window - id - targetLevel - targetId - createdAt - updatedAt additionalProperties: {} BulkUpdateCreativeResultItem: description: A creative selected by a bulk update dry-run or execution result. type: object properties: creative_id: description: Creative manifest ID type: string campaign_id: description: Campaign ID (omitted for advertiser-level masters) type: string name: description: Manifest name type: string format_id: description: ADCP format identifier type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} format_kind: description: AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted) type: string template_id: description: Creative template used for this manifest type: string brand_domain: description: Brand domain (auto-resolved) type: string preview_url: description: URL to preview the processed creative (processed HTML hosted in GCS) type: string format: uri requires_upgrade: description: True when this creative has no format_kind and must be upgraded before it can be assigned to new media buys. Call POST .../upgrade to set format_kind and clear this flag. type: boolean reuse_count: description: Number of campaigns this creative is actively attached to. A reuse signal for the advertiser library (returned on the advertiser-scoped list); omitted on single-manifest reads. type: integer minimum: 0 maximum: 9007199254740991 creative_role: description: Advertiser-library role (evergreen or reference). Absent for flight-specific creatives that live on their campaign. allOf: - $ref: '#/components/schemas/CreativeRole' creative_source: description: Provenance of the creative (uploaded/generated/connected). Today always "uploaded". allOf: - $ref: '#/components/schemas/CreativeSource' platform_links: description: Provider/sales-agent creative identifiers captured from sync_creatives for round-trip comparison. type: array items: $ref: '#/components/schemas/CreativeManifestPlatformLink' created_at: description: Created timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: description: Updated timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ asset_count: description: Number of uploaded assets in this manifest. Replaces the embedded `assets[]` array on summary rows. example: 3 type: integer minimum: 0 maximum: 9007199254740991 primary_asset_type: description: The dominant media asset type (VIDEO > AUDIO > IMAGE/HTML) — lets clients classify a creative by medium even when format_kind is absent (e.g. a bare upload). Omitted when the manifest has no media asset. type: string enum: - IMAGE - VIDEO - AUDIO - HTML - JAVASCRIPT - CSS - TEXT - URL - VAST - FONT - LOGO - DOCUMENT sync_status: description: Compact sync status across sales agents. Use `get_creative` for the full sync metadata (including `last_synced_at`). type: object properties: synced: description: True when the manifest is synced with at least one agent type: boolean agent_count: description: Number of sales agents the manifest is synced with type: integer minimum: -9007199254740991 maximum: 9007199254740991 required: - synced - agent_count additionalProperties: false target_format_ids: description: Additional format IDs this creative covers beyond its primary format_id. type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} placements: description: Resolved placements this creative maps to (primary + target formats), named against the campaign's required placements. Populated by the campaign creative-manifest list. type: array items: type: object properties: placement_id: type: string placement_name: type: string required: - placement_id - placement_name additionalProperties: false status: description: matched means dry-run only, updated means mutation succeeded, failed means this creative was matched but not updated. type: string enum: - matched - updated - failed error: description: Failure message when status is failed type: string warnings: description: Format compatibility warnings emitted when the updated format_id does not match any campaign product format. type: array items: type: string required: - creative_id - name - created_at - updated_at - asset_count - status additionalProperties: false CreativeManifestPlatformLink: description: Readback linkage between a campaign creative and the sales agent/provider creative created during sync. type: object properties: agent_id: description: Stable ADCP sales-agent identifier used for the sync. type: string agent_name: description: Human-readable sales-agent or platform adapter name. type: string platform_id: description: Provider-assigned creative identifier returned by sync_creatives, when available. type: string status: description: Latest sync status reported for this agent. type: string approval_status: description: Latest provider or seller approval status, when available. type: string synced_at: description: Timestamp of the latest completed sync. type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - agent_id - agent_name - status additionalProperties: false CreativeCollectionMemberSummary: description: A collection member with an optional creative summary when the member references a saved creative. type: object properties: member_type: description: Type of item in a creative collection. Creative members are saved campaign creatives; asset members are raw/source/brand/generated assets. type: string enum: - creative - asset member_id: type: string label: type: - string - 'null' metadata: type: object additionalProperties: {} creative: allOf: - $ref: '#/components/schemas/CreativeManifestSummary' created_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - member_type - member_id - created_at - updated_at additionalProperties: false AddCreativeCollectionMembersBody: description: Add saved creatives or assets to a collection. type: object properties: members: minItems: 1 maxItems: 500 type: array items: $ref: '#/components/schemas/CreativeCollectionMemberInput' required: - members ListCreativeCollectionsResponse: description: Creative collection list response. type: object properties: collections: type: array items: $ref: '#/components/schemas/CreativeCollectionSummary' total: type: integer minimum: 0 maximum: 9007199254740991 required: - collections - total additionalProperties: false CreativeManifestResponse: description: Creative manifest with inline assets type: object properties: creative_id: description: Creative manifest ID type: string name: description: Manifest name type: string message: description: Creative brief text type: string brand_domain: description: Brand domain (auto-resolved) type: string template_id: description: Creative template used for this manifest type: string format_id: description: ADCP format identifier type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} format_kind: description: AdCP 3.1 canonical format kind (e.g. image_carousel, video_hosted) type: string format_option_ref: description: AdCP 3.1 scope-discriminated format option reference. oneOf: - type: object properties: scope: type: string enum: - publisher publisher_domain: type: string format_option_id: type: string required: - scope - publisher_domain - format_option_id additionalProperties: false - type: object properties: scope: type: string enum: - product format_option_id: type: string required: - scope - format_option_id additionalProperties: false type: object requires_upgrade: description: True when this creative has no format_kind and must be upgraded before it can be assigned to new media buys. Call POST .../upgrade to set format_kind and clear this flag. type: boolean industry_identifiers: description: Industry identifiers (Ad-ID, ISCI, Clearcast clock, IDcrea) type: array items: type: object properties: type: type: string enum: - ad_id - isci - clearcast_clock - idcrea value: type: string required: - type - value additionalProperties: false target_format_ids: description: Target format IDs (from campaign products) type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} reuse_count: description: Number of campaigns this creative is actively attached to. A reuse signal for the advertiser library (returned on the advertiser-scoped list); omitted on single-manifest reads. type: integer minimum: 0 maximum: 9007199254740991 creative_role: description: Advertiser-library role (evergreen or reference). Absent for flight-specific creatives that live on their campaign. allOf: - $ref: '#/components/schemas/CreativeRole' creative_source: description: Provenance of the creative (uploaded/generated/connected). Today always "uploaded". allOf: - $ref: '#/components/schemas/CreativeSource' preview_url: description: URL to preview the processed creative (processed HTML hosted in GCS) type: string format: uri assets: description: Uploaded assets in this manifest type: array items: $ref: '#/components/schemas/ManifestAssetResponse' carousel_cards: description: Carousel card definitions for image_carousel creatives. type: array items: type: object properties: card_index: type: integer minimum: 0 maximum: 9007199254740991 media_asset_id: type: string headline: type: string description: type: string cta: type: string landing_page_url: type: string platform_extensions: type: array items: type: object additionalProperties: {} required: - card_index - media_asset_id additionalProperties: false html_processing: description: Result of HTML processing (CDN URL rewriting + macro insertion) type: object properties: processed_html: description: Full processed HTML (only included in create response, not GET) type: string processed_html_url: description: URL to processed HTML in GCS (for preview) type: string format: uri rewritten_refs: description: Asset references rewritten to CDN URLs type: array items: type: object properties: original: type: string cdn_url: type: string required: - original - cdn_url additionalProperties: false unresolved_refs: description: Local references found in HTML that did not match any uploaded asset type: array items: type: string inserted_macros: description: ADCP macros that were inserted type: array items: type: string required: - rewritten_refs - unresolved_refs - inserted_macros additionalProperties: false auto_detected_template: description: Auto-detected template info (populated when template_id was not explicitly provided) type: object properties: template_id: type: string template_name: type: string method: type: string enum: - tag_hints - html_analysis - file_analysis - none required: - template_id - template_name - method additionalProperties: false creative_manifest: description: Full ADCP creative manifest (built for sync) sync_status: description: Sync status across sales agents allOf: - $ref: '#/components/schemas/CreativeManifestSyncStatus' platform_links: description: Provider/sales-agent creative identifiers captured from sync_creatives for round-trip comparison. type: array items: $ref: '#/components/schemas/CreativeManifestPlatformLink' tracking: description: Auto-generated Scope3 tracking URLs for impression and click measurement type: object properties: impression_tracker_url: description: Scope3 impression tracker pixel URL with macro placeholders type: string click_tracker_url: description: Scope3 click tracker URL wrapping the original clickthrough with macro placeholders type: string supported_macros: description: ADCP macros supported by this creative format (filled at ad serving time) type: array items: type: string required: - supported_macros additionalProperties: false campaign_id: description: Campaign ID (omitted for advertiser-level masters) type: string advertiser_id: description: Advertiser ID this manifest belongs to type: string frequencyCaps: description: Buyer-defined frequency caps configured for this creative type: array items: $ref: '#/components/schemas/FrequencyCapConfig' already_exists: description: True when create returned a pre-existing manifest with the same (campaign_id, name) instead of inserting a new one. Only set on create responses. type: boolean ignored_files: description: Number of files in the create request that were ignored because the request hit the (campaign_id, name) dedupe path and returned a pre-existing manifest. Use the update endpoint to add or replace assets on the existing manifest. Only set when already_exists is true. type: integer minimum: 0 maximum: 9007199254740991 warnings: description: Format compatibility warnings emitted when an explicit format_id does not match any format accepted by the campaign products. Only set on update responses when a mismatch is detected. The creative was saved; reassign it or update the product configuration before executing. type: array items: type: string created_at: description: Created timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: description: Updated timestamp type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - creative_id - name - assets - created_at - updated_at additionalProperties: false SaveCreativesToLibraryResponse: description: Result of promoting creatives into the advertiser library. type: object properties: role: $ref: '#/components/schemas/CreativeRole' updated: description: Creative manifest IDs whose role was set. type: array items: type: string manifests: description: The advertiser library after the save (promoted creatives only), so the result can render the shelf. type: array items: $ref: '#/components/schemas/CreativeManifestSummary' total: description: Total promoted creatives in the advertiser library. type: integer minimum: 0 maximum: 9007199254740991 required: - role - updated - manifests - total additionalProperties: false BulkUpdateCreativesResponse: description: Bulk creative update preview or execution result suitable for confirmation UI. type: object properties: dry_run: type: boolean matched_count: type: integer minimum: 0 maximum: 9007199254740991 total_matches: type: integer minimum: 0 maximum: 9007199254740991 returned_count: type: integer minimum: 0 maximum: 9007199254740991 truncated: type: boolean updated_count: type: integer minimum: 0 maximum: 9007199254740991 selection: $ref: '#/components/schemas/BulkUpdateCreativeSelectionOutput' exclude_creative_ids: type: array items: type: string limit: type: integer maximum: 9007199254740991 minimum: 1 updates: type: object properties: click_url: description: URL to add as asset (must be http/https) type: string format: uri format_id: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} target_format_ids: type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} additionalProperties: false creatives: type: array items: $ref: '#/components/schemas/BulkUpdateCreativeResultItem' required: - dry_run - matched_count - total_matches - returned_count - truncated - updated_count - selection - limit - updates - creatives additionalProperties: false AvailableTemplatesResponse: description: Available creative templates for a campaign type: object properties: templates: description: Templates available for this campaign type: array items: $ref: '#/components/schemas/CreativeTemplateResponse' campaign_format_ids: description: Deduplicated legacy format IDs from campaign products (flat list). V2-native product declarations are returned in campaign_format_options. type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} campaign_format_options: description: Deduplicated exact AdCP 3.1 format_options from campaign products. Product-scoped options with the same format_option_id remain distinct when their declarations differ. type: array items: type: object properties: format_kind: description: AdCP format kind discriminator (e.g. video_hosted, display) example: video_hosted type: string format_option_id: description: Stable identifier buyers use to select this format via format_option_refs in create_media_buy type: string display_name: description: Human-readable name for this format option type: string params: description: Canonical params for this format option allOf: - $ref: '#/components/schemas/ProductFormatOptionParams' required: - format_kind additionalProperties: {} campaign_products: description: Formats grouped per product. Each product requires at least one creative matching one of its legacy formats or V2 format_options. type: array items: type: object properties: product_id: description: Product identifier type: string formats: description: Legacy formats supported by this product. At least one creative matching one of formats or format_options is required per product. type: array items: type: object properties: id: type: string agent_url: type: string width: type: number height: type: number duration_ms: type: number required: - id - agent_url additionalProperties: {} format_options: description: AdCP 3.1 format_options supported by this product. At least one creative matching one of formats or format_options is required per product. type: array items: type: object properties: format_kind: description: AdCP format kind discriminator (e.g. video_hosted, display) example: video_hosted type: string format_option_id: description: Stable identifier buyers use to select this format via format_option_refs in create_media_buy type: string display_name: description: Human-readable name for this format option type: string params: description: Canonical params for this format option allOf: - $ref: '#/components/schemas/ProductFormatOptionParams' required: - format_kind additionalProperties: {} required: - product_id - formats - format_options additionalProperties: false required: - templates - campaign_format_ids - campaign_format_options - campaign_products additionalProperties: false CampaignCreativeCollectionAttachment: description: Campaign attachment metadata for a creative collection. type: object properties: campaign_id: type: string collection_id: type: string role: description: 'How a campaign uses the collection: working creative library, source assets, approved launch set, or testing set.' type: string enum: - creative_library - source_assets - approved_set - test_set sync_policy: description: Whether campaign attachment changes are manual or automatically include new collection members. type: string enum: - manual - auto_include_new_members metadata: type: object additionalProperties: {} created_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - campaign_id - collection_id - role - sync_policy - created_at - updated_at additionalProperties: false CardInput: description: Per-card input for carousel creatives. Provide filename for multipart file uploads or url for pre-hosted assets. type: object properties: filename: description: Filename of an uploaded file for this card's media. Must match the file's originalname in the multipart upload. type: string minLength: 1 url: description: URL of a hosted image or video for this card's media. Use instead of filename for pre-hosted assets. type: string format: uri headline: description: Card headline text type: string maxLength: 255 description: description: Card body copy type: string maxLength: 2000 cta: description: Call-to-action label (e.g. "Shop Now") type: string maxLength: 50 landing_page_url: description: Destination URL when the card is clicked type: string format: uri platform_extensions: description: Platform-specific card attributes type: array items: type: object additionalProperties: {} CreateCreativeCollectionBody: description: Create a campaign creative workspace for saved creatives and raw/generated assets. type: object properties: name: type: string minLength: 1 maxLength: 255 description: type: string minLength: 1 maxLength: 2000 metadata: type: object additionalProperties: {} members: maxItems: 500 type: array items: $ref: '#/components/schemas/CreativeCollectionMemberInput' attach_to_campaign: description: Attach the collection to this campaign after creation. Defaults to true for campaign workspaces. default: true type: boolean role: default: creative_library description: 'How a campaign uses the collection: working creative library, source assets, approved launch set, or testing set.' type: string enum: - creative_library - source_assets - approved_set - test_set sync_policy: default: manual description: Whether campaign attachment changes are manual or automatically include new collection members. type: string enum: - manual - auto_include_new_members required: - name FrequencyCapTargetLevel: description: Level of the entity the frequency cap applies to type: string enum: - ADVERTISER - CAMPAIGN - CREATIVE CreativeManifestSyncStatus: description: Sync status across sales agents for a creative manifest. type: object properties: synced: description: True when the manifest is synced with at least one agent type: boolean agent_count: description: Number of sales agents the manifest is synced with type: integer minimum: -9007199254740991 maximum: 9007199254740991 last_synced_at: description: Timestamp of the most recent successful sync type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - synced - agent_count additionalProperties: false CreativeDashboardUrlResponse: type: object properties: url: description: Fully-resolved Interchange creative dashboard URL. type: string required: - url additionalProperties: false TextAssetSlotInput: description: Text asset assigned to an AdCP format slot. The slot asset_id is the key in the creative manifest assets map. type: object properties: asset_id: description: AdCP format slot asset_id (e.g. "headline", "description") type: string minLength: 1 maxLength: 255 content: description: Text content for this slot type: string minLength: 1 maxLength: 5000 required: - asset_id - content CreativeCollectionSummary: description: A creative collection owned by an advertiser, campaign, or customer workspace. type: object properties: collection_id: type: string campaign_id: type: string advertiser_id: description: Advertiser that owns this collection. Present when owner_scope is advertiser. type: string owner_scope: description: 'Derived scope: advertiser when advertiser_id is set, campaign when campaign_id is set, otherwise customer.' type: string enum: - advertiser - campaign - customer name: type: string description: type: - string - 'null' metadata: type: object additionalProperties: {} member_count: type: integer minimum: 0 maximum: 9007199254740991 creative_count: type: integer minimum: 0 maximum: 9007199254740991 asset_count: type: integer minimum: 0 maximum: 9007199254740991 attached_campaign_count: type: integer minimum: 0 maximum: 9007199254740991 members: type: array items: $ref: '#/components/schemas/CreativeCollectionMemberSummary' attachments: type: array items: $ref: '#/components/schemas/CampaignCreativeCollectionAttachment' created_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ updated_at: type: string format: date-time pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ required: - collection_id - name - member_count - creative_count - asset_count - attached_campaign_count - created_at - updated_at additionalProperties: false AdvertiserModelCredentialList: type: array items: $ref: '#/components/schemas/AdvertiserModelCredential' CreativeSource: description: 'Origin of the creative: uploaded (bring-your-own), generated (by a creative agent), or connected (from a 3p platform).' type: string enum: - uploaded - generated - connected CreativePreviewResponse: type: object properties: response_type: type: string previews: type: array items: type: object properties: preview_id: type: string required: - preview_id additionalProperties: {} interactive_url: type: string expires_at: type: string required: - response_type - previews additionalProperties: {} BuyerModelCredential: type: object properties: id: type: string customerId: type: integer minimum: -9007199254740991 maximum: 9007199254740991 advertiserIds: type: array items: type: string isDefault: type: boolean providerType: type: string providerDisplayName: type: string label: type: string status: type: string enum: - ACTIVE - REVOKED - ERROR maskedKey: type: - string - 'null' connectedBy: type: - string - 'null' createdAt: type: string updatedAt: type: string required: - id - customerId - advertiserIds - isDefault - providerType - providerDisplayName - label - status - maskedKey - connectedBy - createdAt - updatedAt additionalProperties: false AssetDimensionWarning: description: Dimensional inconsistency detected on an uploaded asset type: object properties: code: description: FILENAME_DIMENSION_MISMATCH = actual pixel dimensions differ from what the filename claims; UNLIKELY_PRIMARY_CREATIVE = asset is unusually small to be the primary creative type: string enum: - FILENAME_DIMENSION_MISMATCH - UNLIKELY_PRIMARY_CREATIVE message: description: Human-readable description type: string required: - code - message additionalProperties: false ApiError: description: Structured error object type: object properties: code: description: Machine-readable error code type: string message: description: Human-readable error message type: string field: description: Field path associated with the error type: string details: description: Additional error context type: object additionalProperties: {} required: - code - message additionalProperties: false AttachCreativeCollectionBody: description: Attach collection metadata to the campaign workspace. This does not launch or sync creatives by itself. type: object properties: role: default: creative_library description: 'How a campaign uses the collection: working creative library, source assets, approved launch set, or testing set.' type: string enum: - creative_library - source_assets - approved_set - test_set sync_policy: default: manual description: Whether campaign attachment changes are manual or automatically include new collection members. type: string enum: - manual - auto_include_new_members metadata: default: {} type: object additionalProperties: {} CreativeTemplateResponse: description: Creative format template with asset requirements type: object properties: template_id: description: Template identifier type: string name: description: Template name type: string description: description: What this template is for type: string category: description: Template category type: string assets_required: description: Assets required/optional for this template type: array items: $ref: '#/components/schemas/TemplateAssetRequirement' expects_html_wrapper: description: Whether an HTML tag is the primary asset type: boolean supports_tag_input: description: Whether user can paste a tag instead of uploading files type: boolean supported_macros: description: ADCP macros supported by this format type: array items: type: string renders: description: ADCP render specifications type: array items: type: object properties: role: type: string width: type: number height: type: number min_width: type: number max_width: type: number min_height: type: number max_height: type: number aspect_ratio: type: string responsive: type: object properties: width: type: boolean height: type: boolean required: - width - height additionalProperties: false required: - role additionalProperties: false required: - template_id - name - description - category - assets_required - expects_html_wrapper - supports_tag_input additionalProperties: false securitySchemes: bearerAuth: type: http scheme: bearer description: API key or access token