diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 24f2ba75..c640cf00 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,6 +10,7 @@ repos: - id: black language_version: python3.11 args: [--line-length=100] + exclude: ^src/adcp/types/generated_poc/ # Ruff linting (ignoring line-length for now - black handles it) - repo: https://github.com/astral-sh/ruff-pre-commit diff --git a/schemas/cache/account/get-account-financials-response.json b/schemas/cache/account/get-account-financials-response.json index 8bd24327..175c140c 100644 --- a/schemas/cache/account/get-account-financials-response.json +++ b/schemas/cache/account/get-account-financials-response.json @@ -114,15 +114,7 @@ "description": "Overall payment status. current: all obligations met. past_due: one or more invoices overdue. suspended: account suspended due to payment issues." }, "payment_terms": { - "type": "string", - "enum": [ - "net_15", - "net_30", - "net_45", - "net_60", - "net_90", - "prepay" - ], + "$ref": "../enums/payment-terms.json", "description": "Payment terms in effect for this account" }, "invoices": { diff --git a/schemas/cache/account/sync-accounts-request.json b/schemas/cache/account/sync-accounts-request.json index a746aa5e..b9d9b68d 100644 --- a/schemas/cache/account/sync-accounts-request.json +++ b/schemas/cache/account/sync-accounts-request.json @@ -35,28 +35,15 @@ "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "billing": { - "type": "string", - "enum": [ - "operator", - "agent", - "advertiser" - ], - "description": "Who should be invoiced. operator: seller invoices the operator (agency or brand buying direct). agent: agent consolidates billing across brands. advertiser: seller invoices the advertiser directly, even when a different operator places orders on their behalf. The seller must either accept this billing model or reject the request." + "$ref": "../enums/billing-party.json", + "description": "Who should be invoiced. The seller must either accept this billing model or reject the request." }, "billing_entity": { "$ref": "../core/business-entity.json", "description": "Business entity details for the party responsible for payment. The agent provides this so the seller has the legal name, tax IDs, address, and bank details needed for formal B2B invoicing." }, "payment_terms": { - "type": "string", - "enum": [ - "net_15", - "net_30", - "net_45", - "net_60", - "net_90", - "prepay" - ], + "$ref": "../enums/payment-terms.json", "description": "Payment terms for this account. The seller must either accept these terms or reject the account \u2014 terms are never silently remapped. When omitted, the seller applies its default terms." }, "sandbox": { diff --git a/schemas/cache/account/sync-accounts-response.json b/schemas/cache/account/sync-accounts-response.json index 59207501..4dd64af1 100644 --- a/schemas/cache/account/sync-accounts-response.json +++ b/schemas/cache/account/sync-accounts-response.json @@ -59,12 +59,7 @@ "description": "Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). rejected: seller declined the account request. payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: was active, now terminated." }, "billing": { - "type": "string", - "enum": [ - "operator", - "agent", - "advertiser" - ], + "$ref": "../enums/billing-party.json", "description": "Who is invoiced on this account. Matches the requested billing model." }, "billing_entity": { @@ -72,14 +67,7 @@ "description": "Business entity details for the party responsible for payment, echoed from the request. Sellers MAY add fields the agent omitted (e.g., filling in registration_number from a credit check), but MUST NOT return data from a different entity. Bank details are omitted (write-only)." }, "account_scope": { - "type": "string", - "enum": [ - "operator", - "brand", - "operator_brand", - "agent" - ], - "description": "How the seller scoped this account. operator: shared across all brands for this operator. brand: shared across all operators for this brand. operator_brand: dedicated to this operator+brand pair. agent: the agent's default account." + "$ref": "../enums/account-scope.json" }, "setup": { "type": "object", @@ -110,15 +98,7 @@ "description": "Rate card applied to this account" }, "payment_terms": { - "type": "string", - "enum": [ - "net_15", - "net_30", - "net_45", - "net_60", - "net_90", - "prepay" - ], + "$ref": "../enums/payment-terms.json", "description": "Payment terms agreed for this account. When the account is active, these are the binding terms for all invoices on this account." }, "credit_limit": { diff --git a/schemas/cache/adagents.json b/schemas/cache/adagents.json index 40091185..9dd2a68f 100644 --- a/schemas/cache/adagents.json +++ b/schemas/cache/adagents.json @@ -159,7 +159,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized agent's API endpoint URL" + "description": "The authorized agent's API endpoint URL. Callers looking up an agent against this list (e.g., TMP providers validating `seller_agent.agent_url`) MUST compare using the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -269,7 +269,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized agent's API endpoint URL" + "description": "The authorized agent's API endpoint URL. Callers looking up an agent against this list (e.g., TMP providers validating `seller_agent.agent_url`) MUST compare using the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -379,7 +379,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized agent's API endpoint URL" + "description": "The authorized agent's API endpoint URL. Callers looking up an agent against this list (e.g., TMP providers validating `seller_agent.agent_url`) MUST compare using the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -489,7 +489,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized agent's API endpoint URL" + "description": "The authorized agent's API endpoint URL. Callers looking up an agent against this list (e.g., TMP providers validating `seller_agent.agent_url`) MUST compare using the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -600,7 +600,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized signals agent's API endpoint URL" + "description": "The authorized signals agent's API endpoint URL. Callers comparing this URL against a signal-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -654,7 +654,7 @@ "url": { "type": "string", "format": "uri", - "description": "The authorized signals agent's API endpoint URL" + "description": "The authorized signals agent's API endpoint URL. Callers comparing this URL against a signal-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "authorized_for": { "type": "string", @@ -719,7 +719,7 @@ "url": { "type": "string", "format": "uri", - "description": "The agent's API endpoint URL" + "description": "The agent's API endpoint URL. Callers comparing this URL against a feature-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "name": { "type": "string", @@ -785,12 +785,12 @@ ], "examples": [ { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json", "last_updated": "2025-01-15T10:00:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "properties": [ { "property_id": "example_site", @@ -868,7 +868,7 @@ "last_updated": "2025-01-10T12:00:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "contact": { "name": "Meta Advertising Operations", "email": "adops@meta.com", @@ -977,7 +977,7 @@ "last_updated": "2025-01-10T15:30:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "contact": { "name": "Tumblr Advertising" }, @@ -1016,7 +1016,7 @@ "last_updated": "2025-01-10T16:00:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "contact": { "name": "Example Third-Party Sales Agent", "email": "sales@agent.example", @@ -1062,7 +1062,7 @@ "last_updated": "2025-01-10T17:00:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "contact": { "name": "Premium News Publisher", "email": "adops@news.example.com", @@ -1137,7 +1137,7 @@ "last_updated": "2025-01-10T18:00:00Z" }, { - "$schema": "/schemas/3.0.0/adagents.json", + "$schema": "/schemas/3.0.1/adagents.json", "contact": { "name": "Polk Automotive Data", "email": "partnerships@polk.com", diff --git a/schemas/cache/brand.json b/schemas/cache/brand.json index 623e0d2b..b3af7b42 100644 --- a/schemas/cache/brand.json +++ b/schemas/cache/brand.json @@ -831,7 +831,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "Brand agent MCP endpoint URL" + "description": "Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -853,7 +853,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "Rights agent MCP endpoint URL" + "description": "Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -904,7 +904,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "Agent endpoint URL (MCP or A2A)" + "description": "Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -2032,16 +2032,16 @@ ], "examples": [ { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "authoritative_location": "https://adcontextprotocol.org/brand/abc123/brand.json" }, { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "house": "nikeinc.com", "note": "Redirect to house domain for full brand portfolio" }, { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "version": "1.0", "agents": [ { @@ -2052,7 +2052,7 @@ ] }, { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "version": "1.0", "house": { "domain": "pg.com", @@ -2358,7 +2358,7 @@ "last_updated": "2026-01-15T10:00:00Z" }, { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "version": "1.0", "house": { "domain": "nikeinc.com", @@ -2527,7 +2527,7 @@ "last_updated": "2026-01-15T10:00:00Z" }, { - "$schema": "/schemas/3.0.0/brand.json", + "$schema": "/schemas/3.0.1/brand.json", "version": "1.0", "house": { "domain": "mediavine.com", diff --git a/schemas/cache/brand/acquire-rights-request.json b/schemas/cache/brand/acquire-rights-request.json index 88e38d4c..e90261dc 100644 --- a/schemas/cache/brand/acquire-rights-request.json +++ b/schemas/cache/brand/acquire-rights-request.json @@ -60,7 +60,7 @@ "estimated_impressions": { "type": "integer", "minimum": 0, - "description": "Estimated total impressions for the campaign" + "description": "Estimated total impressions for the campaign. Required when the request carries an intent-phase governance_context token AND the selected pricing_option has model: 'cpm' \u2014 the brand agent projects commitment as (pricing_option.price / 1000) \u00d7 estimated_impressions evaluated in pricing_option.currency. Brand agents MUST reject with INVALID_REQUEST (field: campaign.estimated_impressions) when CPM-priced rights are requested under a governance_context and this field is omitted or zero; implementer-chosen defaults are non-conformant. See the acquire_rights task reference for the full validation contract including currency-mismatch handling." }, "start_date": { "type": "string", @@ -70,7 +70,7 @@ "end_date": { "type": "string", "format": "date", - "description": "Campaign end date (ISO 8601)" + "description": "Campaign end date (ISO 8601). Brand agents MUST reject with INVALID_REQUEST (field: campaign.end_date) when end_date is in the past at the time of the request \u2014 acquiring rights for an elapsed window produces a zero-duration grant and is almost always a buyer-side bug." } }, "required": [ diff --git a/schemas/cache/brand/rights-pricing-option.json b/schemas/cache/brand/rights-pricing-option.json index fa5030d5..72e0f613 100644 --- a/schemas/cache/brand/rights-pricing-option.json +++ b/schemas/cache/brand/rights-pricing-option.json @@ -32,15 +32,7 @@ "minItems": 1 }, "period": { - "type": "string", - "enum": [ - "daily", - "weekly", - "monthly", - "quarterly", - "annual", - "one_time" - ], + "$ref": "../enums/rights-billing-period.json", "description": "Billing period for flat_rate and time-based models" }, "impression_cap": { diff --git a/schemas/cache/brand/rights-terms.json b/schemas/cache/brand/rights-terms.json index 0f1e9201..d1f37174 100644 --- a/schemas/cache/brand/rights-terms.json +++ b/schemas/cache/brand/rights-terms.json @@ -17,15 +17,7 @@ "pattern": "^[A-Z]{3}$" }, "period": { - "type": "string", - "enum": [ - "daily", - "weekly", - "monthly", - "quarterly", - "annual", - "one_time" - ] + "$ref": "../enums/rights-billing-period.json" }, "uses": { "type": "array", diff --git a/schemas/cache/bundled/content-standards/calibrate-content-request.json b/schemas/cache/bundled/content-standards/calibrate-content-request.json index 60b50620..0737b887 100644 --- a/schemas/cache/bundled/content-standards/calibrate-content-request.json +++ b/schemas/cache/bundled/content-standards/calibrate-content-request.json @@ -33,15 +33,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -152,31 +152,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -312,19 +288,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -335,19 +299,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -475,31 +427,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -635,19 +563,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -658,19 +574,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -817,31 +721,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -977,19 +857,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1000,19 +868,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1152,31 +1008,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1312,19 +1144,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1335,19 +1155,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1482,31 +1290,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1642,19 +1426,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1665,19 +1437,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1885,10 +1645,67 @@ ] } ] + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.489Z", + "generatedAt": "2026-04-28T12:32:22.827Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/calibrate-content-response.json b/schemas/cache/bundled/content-standards/calibrate-content-response.json index a25c62de..5db601e2 100644 --- a/schemas/cache/bundled/content-standards/calibrate-content-response.json +++ b/schemas/cache/bundled/content-standards/calibrate-content-response.json @@ -9,12 +9,17 @@ "description": "Success response with detailed calibration feedback", "properties": { "verdict": { + "title": "Binary Verdict", + "description": "Strictly two-outcome evaluation result used for overall record-level verdicts in content standards tasks. For per-feature breakdowns that include warning and unevaluated states, see feature-check-status.", "type": "string", "enum": [ "pass", "fail" ], - "description": "Overall pass/fail verdict for the content evaluation" + "enumDescriptions": { + "pass": "The evaluated record meets all applicable content standards", + "fail": "The evaluated record failed one or more content standard checks" + } }, "confidence": { "type": "number", @@ -37,6 +42,8 @@ "description": "Which feature was evaluated. Data features come from the content-standards feature catalog (e.g., 'brand_safety', 'brand_suitability', 'competitor_adjacency'). Record-level structural checks use reserved namespaces: 'record:malformed_artifact'. Reserved prefixes: 'record:', 'delivery:'." }, "status": { + "title": "Feature Check Status", + "description": "Per-feature evaluation outcome in content standards checks. For the two-outcome overall record verdict, see binary-verdict.", "type": "string", "enum": [ "passed", @@ -44,7 +51,12 @@ "warning", "unevaluated" ], - "description": "Evaluation status for this feature" + "enumDescriptions": { + "passed": "Feature met the applicable content standard", + "failed": "Feature did not meet the applicable content standard", + "warning": "Feature is within tolerance but approaching a threshold \u2014 informational, not blocking", + "unevaluated": "Feature was not assessed in this evaluation run (e.g., required data not present)" + } }, "policy_id": { "type": "string", @@ -161,7 +173,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.490Z", + "generatedAt": "2026-04-28T12:32:22.829Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/create-content-standards-request.json b/schemas/cache/bundled/content-standards/create-content-standards-request.json index 1004dcc2..f25d2a14 100644 --- a/schemas/cache/bundled/content-standards/create-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/create-content-standards-request.json @@ -26,53 +26,7 @@ "channels_any": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -197,53 +151,7 @@ "channels": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." }, @@ -377,15 +285,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -496,31 +404,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -656,19 +540,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -679,19 +551,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -819,31 +679,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -979,19 +815,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1002,19 +826,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1161,31 +973,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1321,19 +1109,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1344,19 +1120,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1496,31 +1260,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1656,19 +1396,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1679,19 +1407,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1826,31 +1542,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1986,19 +1678,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2009,19 +1689,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2190,15 +1858,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -2309,31 +1977,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2469,19 +2113,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2492,19 +2124,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2632,31 +2252,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2792,19 +2388,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2815,19 +2399,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2974,31 +2546,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3134,19 +2682,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3157,19 +2693,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3309,31 +2833,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3469,19 +2969,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3492,19 +2980,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3639,31 +3115,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3799,19 +3251,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3822,19 +3262,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4078,10 +3506,116 @@ ] } ] + }, + "MediaChannel": { + "title": "Media Channel", + "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", + "type": "string", + "enum": [ + "display", + "olv", + "social", + "search", + "ctv", + "linear_tv", + "radio", + "streaming_audio", + "podcast", + "dooh", + "ooh", + "print", + "cinema", + "email", + "gaming", + "retail_media", + "influencer", + "affiliate", + "product_placement", + "sponsored_intelligence" + ], + "enumDescriptions": { + "display": "Digital display advertising (banners, native, rich media) across web and app", + "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", + "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", + "search": "Search engine advertising and search networks", + "ctv": "Connected TV and streaming on television screens", + "linear_tv": "Traditional broadcast and cable television", + "radio": "Traditional AM/FM radio broadcast", + "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", + "podcast": "Podcast advertising (host-read or dynamically inserted)", + "dooh": "Digital out-of-home screens in public spaces", + "ooh": "Classic out-of-home (physical billboards, transit, etc.)", + "print": "Newspapers, magazines, and other print publications", + "cinema": "Movie theater advertising", + "email": "Email advertising and sponsored newsletter content", + "gaming": "In-game advertising across platforms", + "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", + "influencer": "Creator and influencer marketing partnerships", + "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", + "product_placement": "Product placement, branded content, and sponsorship integrations", + "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" + } + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.495Z", + "generatedAt": "2026-04-28T12:32:22.838Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/create-content-standards-response.json b/schemas/cache/bundled/content-standards/create-content-standards-response.json index 25db5540..52723942 100644 --- a/schemas/cache/bundled/content-standards/create-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/create-content-standards-response.json @@ -109,7 +109,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.497Z", + "generatedAt": "2026-04-28T12:32:22.840Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/get-content-standards-request.json b/schemas/cache/bundled/content-standards/get-content-standards-request.json index a565f049..a2347b36 100644 --- a/schemas/cache/bundled/content-standards/get-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/get-content-standards-request.json @@ -31,7 +31,7 @@ "standards_id" ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.497Z", + "generatedAt": "2026-04-28T12:32:22.841Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/get-content-standards-response.json b/schemas/cache/bundled/content-standards/get-content-standards-response.json index 9984ef8f..342a79fe 100644 --- a/schemas/cache/bundled/content-standards/get-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/get-content-standards-response.json @@ -32,53 +32,7 @@ "channels_any": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -186,53 +140,7 @@ "channels": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." }, @@ -340,15 +248,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -459,31 +367,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -619,19 +503,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -642,19 +514,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -782,31 +642,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -942,19 +778,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -965,19 +789,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1124,31 +936,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1284,19 +1072,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1307,19 +1083,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1459,31 +1223,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1619,19 +1359,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1642,19 +1370,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1789,31 +1505,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1949,19 +1641,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1972,19 +1652,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2125,15 +1793,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -2244,31 +1912,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2404,19 +2048,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2427,19 +2059,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2567,31 +2187,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2727,19 +2323,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2750,19 +2334,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2909,31 +2481,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3069,19 +2617,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3092,19 +2628,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3244,31 +2768,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3404,19 +2904,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3427,19 +2915,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3574,31 +3050,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3734,19 +3186,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3757,19 +3197,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4307,10 +3735,116 @@ ] } ] + }, + "MediaChannel": { + "title": "Media Channel", + "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", + "type": "string", + "enum": [ + "display", + "olv", + "social", + "search", + "ctv", + "linear_tv", + "radio", + "streaming_audio", + "podcast", + "dooh", + "ooh", + "print", + "cinema", + "email", + "gaming", + "retail_media", + "influencer", + "affiliate", + "product_placement", + "sponsored_intelligence" + ], + "enumDescriptions": { + "display": "Digital display advertising (banners, native, rich media) across web and app", + "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", + "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", + "search": "Search engine advertising and search networks", + "ctv": "Connected TV and streaming on television screens", + "linear_tv": "Traditional broadcast and cable television", + "radio": "Traditional AM/FM radio broadcast", + "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", + "podcast": "Podcast advertising (host-read or dynamically inserted)", + "dooh": "Digital out-of-home screens in public spaces", + "ooh": "Classic out-of-home (physical billboards, transit, etc.)", + "print": "Newspapers, magazines, and other print publications", + "cinema": "Movie theater advertising", + "email": "Email advertising and sponsored newsletter content", + "gaming": "In-game advertising across platforms", + "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", + "influencer": "Creator and influencer marketing partnerships", + "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", + "product_placement": "Product placement, branded content, and sponsorship integrations", + "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" + } + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.502Z", + "generatedAt": "2026-04-28T12:32:22.847Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/get-media-buy-artifacts-request.json b/schemas/cache/bundled/content-standards/get-media-buy-artifacts-request.json index 8fd3f7f7..5aa8cde7 100644 --- a/schemas/cache/bundled/content-standards/get-media-buy-artifacts-request.json +++ b/schemas/cache/bundled/content-standards/get-media-buy-artifacts-request.json @@ -227,7 +227,7 @@ "media_buy_id" ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.505Z", + "generatedAt": "2026-04-28T12:32:22.850Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/get-media-buy-artifacts-response.json b/schemas/cache/bundled/content-standards/get-media-buy-artifacts-response.json index d43d7fcc..94133dae 100644 --- a/schemas/cache/bundled/content-standards/get-media-buy-artifacts-response.json +++ b/schemas/cache/bundled/content-standards/get-media-buy-artifacts-response.json @@ -49,15 +49,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -168,31 +168,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -328,19 +304,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -351,19 +315,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -491,31 +443,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -651,19 +579,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -674,19 +590,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -833,31 +737,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -993,19 +873,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1016,19 +884,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1168,31 +1024,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1328,19 +1160,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1351,19 +1171,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1498,31 +1306,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1658,19 +1442,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1681,19 +1453,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2053,10 +1813,67 @@ ] } ] + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.508Z", + "generatedAt": "2026-04-28T12:32:22.853Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/list-content-standards-request.json b/schemas/cache/bundled/content-standards/list-content-standards-request.json index 1713b182..5b0ddfe4 100644 --- a/schemas/cache/bundled/content-standards/list-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/list-content-standards-request.json @@ -114,7 +114,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.510Z", + "generatedAt": "2026-04-28T12:32:22.854Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/list-content-standards-response.json b/schemas/cache/bundled/content-standards/list-content-standards-response.json index 36eb3dd0..fa0efbfb 100644 --- a/schemas/cache/bundled/content-standards/list-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/list-content-standards-response.json @@ -34,53 +34,7 @@ "channels_any": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -188,53 +142,7 @@ "channels": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." }, @@ -342,15 +250,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -461,31 +369,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -621,19 +505,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -644,19 +516,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -784,31 +644,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -944,19 +780,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -967,19 +791,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1126,31 +938,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1286,19 +1074,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1309,19 +1085,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1461,31 +1225,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1621,19 +1361,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1644,19 +1372,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1791,31 +1507,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1951,19 +1643,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1974,19 +1654,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2127,15 +1795,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -2246,31 +1914,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2406,19 +2050,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2429,19 +2061,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2569,31 +2189,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2729,19 +2325,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2752,19 +2336,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2911,31 +2483,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3071,19 +2619,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3094,19 +2630,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3246,31 +2770,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3406,19 +2906,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3429,19 +2917,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3576,31 +3052,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3736,19 +3188,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3759,19 +3199,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4336,10 +3764,116 @@ ] } ] + }, + "MediaChannel": { + "title": "Media Channel", + "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", + "type": "string", + "enum": [ + "display", + "olv", + "social", + "search", + "ctv", + "linear_tv", + "radio", + "streaming_audio", + "podcast", + "dooh", + "ooh", + "print", + "cinema", + "email", + "gaming", + "retail_media", + "influencer", + "affiliate", + "product_placement", + "sponsored_intelligence" + ], + "enumDescriptions": { + "display": "Digital display advertising (banners, native, rich media) across web and app", + "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", + "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", + "search": "Search engine advertising and search networks", + "ctv": "Connected TV and streaming on television screens", + "linear_tv": "Traditional broadcast and cable television", + "radio": "Traditional AM/FM radio broadcast", + "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", + "podcast": "Podcast advertising (host-read or dynamically inserted)", + "dooh": "Digital out-of-home screens in public spaces", + "ooh": "Classic out-of-home (physical billboards, transit, etc.)", + "print": "Newspapers, magazines, and other print publications", + "cinema": "Movie theater advertising", + "email": "Email advertising and sponsored newsletter content", + "gaming": "In-game advertising across platforms", + "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", + "influencer": "Creator and influencer marketing partnerships", + "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", + "product_placement": "Product placement, branded content, and sponsorship integrations", + "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" + } + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.515Z", + "generatedAt": "2026-04-28T12:32:22.859Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/update-content-standards-request.json b/schemas/cache/bundled/content-standards/update-content-standards-request.json index 163b45ed..729b7367 100644 --- a/schemas/cache/bundled/content-standards/update-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/update-content-standards-request.json @@ -30,53 +30,7 @@ "channels_any": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -198,53 +152,7 @@ "channels": { "type": "array", "items": { - "title": "Media Channel", - "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", - "type": "string", - "enum": [ - "display", - "olv", - "social", - "search", - "ctv", - "linear_tv", - "radio", - "streaming_audio", - "podcast", - "dooh", - "ooh", - "print", - "cinema", - "email", - "gaming", - "retail_media", - "influencer", - "affiliate", - "product_placement", - "sponsored_intelligence" - ], - "enumDescriptions": { - "display": "Digital display advertising (banners, native, rich media) across web and app", - "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", - "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", - "search": "Search engine advertising and search networks", - "ctv": "Connected TV and streaming on television screens", - "linear_tv": "Traditional broadcast and cable television", - "radio": "Traditional AM/FM radio broadcast", - "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", - "podcast": "Podcast advertising (host-read or dynamically inserted)", - "dooh": "Digital out-of-home screens in public spaces", - "ooh": "Classic out-of-home (physical billboards, transit, etc.)", - "print": "Newspapers, magazines, and other print publications", - "cinema": "Movie theater advertising", - "email": "Email advertising and sponsored newsletter content", - "gaming": "In-game advertising across platforms", - "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", - "influencer": "Creator and influencer marketing partnerships", - "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", - "product_placement": "Product placement, branded content, and sponsorship integrations", - "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" - } + "$ref": "#/$defs/MediaChannel" }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." }, @@ -378,15 +286,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -497,31 +405,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -657,19 +541,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -680,19 +552,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -820,31 +680,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -980,19 +816,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1003,19 +827,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1162,31 +974,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1322,19 +1110,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1345,19 +1121,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1497,31 +1261,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1657,19 +1397,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1680,19 +1408,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1827,31 +1543,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1987,19 +1679,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2010,19 +1690,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2191,15 +1859,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -2310,31 +1978,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2470,19 +2114,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2493,19 +2125,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2633,31 +2253,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2793,19 +2389,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2816,19 +2400,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2975,31 +2547,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3135,19 +2683,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3158,19 +2694,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3310,31 +2834,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3470,19 +2970,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3493,19 +2981,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3640,31 +3116,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3800,19 +3252,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3823,19 +3263,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4067,10 +3495,116 @@ ] } ] + }, + "MediaChannel": { + "title": "Media Channel", + "description": "Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.", + "type": "string", + "enum": [ + "display", + "olv", + "social", + "search", + "ctv", + "linear_tv", + "radio", + "streaming_audio", + "podcast", + "dooh", + "ooh", + "print", + "cinema", + "email", + "gaming", + "retail_media", + "influencer", + "affiliate", + "product_placement", + "sponsored_intelligence" + ], + "enumDescriptions": { + "display": "Digital display advertising (banners, native, rich media) across web and app", + "olv": "Online video advertising outside CTV (pre-roll, outstream, in-app video)", + "social": "Social media platforms (Facebook, Instagram, TikTok, LinkedIn, etc.)", + "search": "Search engine advertising and search networks", + "ctv": "Connected TV and streaming on television screens", + "linear_tv": "Traditional broadcast and cable television", + "radio": "Traditional AM/FM radio broadcast", + "streaming_audio": "Digital audio streaming services (Spotify, Pandora, etc.)", + "podcast": "Podcast advertising (host-read or dynamically inserted)", + "dooh": "Digital out-of-home screens in public spaces", + "ooh": "Classic out-of-home (physical billboards, transit, etc.)", + "print": "Newspapers, magazines, and other print publications", + "cinema": "Movie theater advertising", + "email": "Email advertising and sponsored newsletter content", + "gaming": "In-game advertising across platforms", + "retail_media": "Retail media networks and commerce marketplaces (Amazon, Walmart, Instacart)", + "influencer": "Creator and influencer marketing partnerships", + "affiliate": "Affiliate networks, comparison sites, and performance-based partnerships", + "product_placement": "Product placement, branded content, and sponsorship integrations", + "sponsored_intelligence": "Sponsored Intelligence \u2014 advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" + } + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.520Z", + "generatedAt": "2026-04-28T12:32:22.864Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/update-content-standards-response.json b/schemas/cache/bundled/content-standards/update-content-standards-response.json index 989dfbfb..d8a2e242 100644 --- a/schemas/cache/bundled/content-standards/update-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/update-content-standards-response.json @@ -124,7 +124,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.522Z", + "generatedAt": "2026-04-28T12:32:22.865Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/validate-content-delivery-request.json b/schemas/cache/bundled/content-standards/validate-content-delivery-request.json index b9f2e15b..73206faf 100644 --- a/schemas/cache/bundled/content-standards/validate-content-delivery-request.json +++ b/schemas/cache/bundled/content-standards/validate-content-delivery-request.json @@ -53,15 +53,15 @@ "description": "Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique." }, "format_id": { - "title": "Format ID", - "description": "Optional reference to a format definition. Uses the same format registry as creative formats.", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Optional reference to a format definition. Uses the same format registry as creative formats.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -172,31 +172,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -332,19 +308,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -355,19 +319,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -495,31 +447,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -655,19 +583,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -678,19 +594,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -837,31 +741,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -997,19 +877,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1020,19 +888,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1172,31 +1028,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1332,19 +1164,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1355,19 +1175,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1502,31 +1310,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1662,19 +1446,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1685,19 +1457,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1939,10 +1699,67 @@ ] } ] + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.523Z", + "generatedAt": "2026-04-28T12:32:22.867Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/content-standards/validate-content-delivery-response.json b/schemas/cache/bundled/content-standards/validate-content-delivery-response.json index b701876a..e7596d71 100644 --- a/schemas/cache/bundled/content-standards/validate-content-delivery-response.json +++ b/schemas/cache/bundled/content-standards/validate-content-delivery-response.json @@ -39,12 +39,17 @@ "description": "Which delivery record was evaluated" }, "verdict": { + "title": "Binary Verdict", + "description": "Strictly two-outcome evaluation result used for overall record-level verdicts in content standards tasks. For per-feature breakdowns that include warning and unevaluated states, see feature-check-status.", "type": "string", "enum": [ "pass", "fail" ], - "description": "Overall pass/fail verdict for this record" + "enumDescriptions": { + "pass": "The evaluated record meets all applicable content standards", + "fail": "The evaluated record failed one or more content standard checks" + } }, "features": { "type": "array", @@ -57,13 +62,21 @@ "description": "Which feature was evaluated. Data features come from the content-standards feature catalog (e.g., 'brand_safety', 'brand_suitability', 'image_dpi'). Record-level structural checks use reserved namespaces: 'record:malformed_artifact', 'delivery:authorization'. Reserved prefixes: 'record:', 'delivery:'." }, "status": { + "title": "Feature Check Status", + "description": "Per-feature evaluation outcome in content standards checks. For the two-outcome overall record verdict, see binary-verdict.", "type": "string", "enum": [ "passed", "failed", "warning", "unevaluated" - ] + ], + "enumDescriptions": { + "passed": "Feature met the applicable content standard", + "failed": "Feature did not meet the applicable content standard", + "warning": "Feature is within tolerance but approaching a threshold \u2014 informational, not blocking", + "unevaluated": "Feature was not assessed in this evaluation run (e.g., required data not present)" + } }, "policy_id": { "type": "string", @@ -188,7 +201,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.524Z", + "generatedAt": "2026-04-28T12:32:22.868Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/core/tasks-get-request.json b/schemas/cache/bundled/core/tasks-get-request.json index 039ab2bf..7d3dc73e 100644 --- a/schemas/cache/bundled/core/tasks-get-request.json +++ b/schemas/cache/bundled/core/tasks-get-request.json @@ -53,7 +53,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.526Z", + "generatedAt": "2026-04-28T12:32:22.870Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/core/tasks-get-response.json b/schemas/cache/bundled/core/tasks-get-response.json index 0ab8709d..92b818af 100644 --- a/schemas/cache/bundled/core/tasks-get-response.json +++ b/schemas/cache/bundled/core/tasks-get-response.json @@ -65,25 +65,7 @@ ] }, "protocol": { - "title": "AdCP Protocol", - "description": "AdCP protocol this task belongs to", - "type": "string", - "enum": [ - "media-buy", - "signals", - "governance", - "creative", - "brand", - "sponsored-intelligence" - ], - "enumDescriptions": { - "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", - "signals": "Audience signal discovery and activation", - "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", - "creative": "Creative asset management, format discovery, and rendering", - "brand": "Brand identity, rights discovery, and rights acquisition", - "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" - } + "$ref": "#/$defs/AdCPProtocol" }, "status": { "title": "Task Status", @@ -175,25 +157,7 @@ "description": "Additional error context", "properties": { "protocol": { - "title": "AdCP Protocol", - "description": "AdCP protocol where error occurred", - "type": "string", - "enum": [ - "media-buy", - "signals", - "governance", - "creative", - "brand", - "sponsored-intelligence" - ], - "enumDescriptions": { - "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", - "signals": "Audience signal discovery and activation", - "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", - "creative": "Creative asset management, format discovery, and rendering", - "brand": "Brand identity, rights discovery, and rights acquisition", - "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" - } + "$ref": "#/$defs/AdCPProtocol" }, "operation": { "type": "string", @@ -269,8 +233,31 @@ "updated_at" ], "additionalProperties": true, + "$defs": { + "AdCPProtocol": { + "title": "AdCP Protocol", + "description": "AdCP protocol this task belongs to", + "type": "string", + "enum": [ + "media-buy", + "signals", + "governance", + "creative", + "brand", + "sponsored-intelligence" + ], + "enumDescriptions": { + "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", + "signals": "Audience signal discovery and activation", + "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", + "creative": "Creative asset management, format discovery, and rendering", + "brand": "Brand identity, rights discovery, and rights acquisition", + "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" + } + } + }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.526Z", + "generatedAt": "2026-04-28T12:32:22.870Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/core/tasks-list-request.json b/schemas/cache/bundled/core/tasks-list-request.json index 18ff25ee..f35332a4 100644 --- a/schemas/cache/bundled/core/tasks-list-request.json +++ b/schemas/cache/bundled/core/tasks-list-request.json @@ -15,223 +15,35 @@ "description": "Filter criteria for querying tasks", "properties": { "protocol": { - "title": "AdCP Protocol", - "description": "Filter by single AdCP protocol", - "type": "string", - "enum": [ - "media-buy", - "signals", - "governance", - "creative", - "brand", - "sponsored-intelligence" - ], - "enumDescriptions": { - "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", - "signals": "Audience signal discovery and activation", - "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", - "creative": "Creative asset management, format discovery, and rendering", - "brand": "Brand identity, rights discovery, and rights acquisition", - "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" - } + "$ref": "#/$defs/AdCPProtocol" }, "protocols": { "type": "array", "description": "Filter by multiple AdCP protocols", "items": { - "title": "AdCP Protocol", - "description": "AdCP protocols for task categorization \u2014 referenced by tasks-list-request, webhook payloads, and other task-lifecycle surfaces. Values are kebab-case. This enum shares the same axis as supported_protocols (see /schemas/protocol/get-adcp-capabilities-response.json), which uses snake_case on the wire. Compliance testing support is declared via the `capabilities.compliance_testing` block, not as a protocol value.", - "type": "string", - "enum": [ - "media-buy", - "signals", - "governance", - "creative", - "brand", - "sponsored-intelligence" - ], - "enumDescriptions": { - "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", - "signals": "Audience signal discovery and activation", - "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", - "creative": "Creative asset management, format discovery, and rendering", - "brand": "Brand identity, rights discovery, and rights acquisition", - "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" - } + "$ref": "#/$defs/AdCPProtocol" }, "minItems": 1 }, "status": { - "title": "Task Status", - "description": "Filter by single task status", - "type": "string", - "enum": [ - "submitted", - "working", - "input-required", - "completed", - "canceled", - "failed", - "rejected", - "auth-required", - "unknown" - ], - "enumDescriptions": { - "submitted": "Task accepted and queued for long-running execution (hours to days). Client should poll with tasks/get or provide webhook_url at protocol level.", - "working": "Agent is actively processing the task, expect completion within 120 seconds", - "input-required": "Task is paused and waiting for input from the user (e.g., clarification, approval)", - "completed": "Task has been successfully completed", - "canceled": "Task was canceled by the user", - "failed": "Task failed due to an error during execution", - "rejected": "Task was rejected by the agent and was not started", - "auth-required": "Task requires authentication to proceed", - "unknown": "Task is in an unknown or indeterminate state" - } + "$ref": "#/$defs/TaskStatus" }, "statuses": { "type": "array", "description": "Filter by multiple task statuses", "items": { - "title": "Task Status", - "description": "Standardized task status values based on A2A TaskState enum. Indicates the current state of any AdCP operation.", - "type": "string", - "enum": [ - "submitted", - "working", - "input-required", - "completed", - "canceled", - "failed", - "rejected", - "auth-required", - "unknown" - ], - "enumDescriptions": { - "submitted": "Task accepted and queued for long-running execution (hours to days). Client should poll with tasks/get or provide webhook_url at protocol level.", - "working": "Agent is actively processing the task, expect completion within 120 seconds", - "input-required": "Task is paused and waiting for input from the user (e.g., clarification, approval)", - "completed": "Task has been successfully completed", - "canceled": "Task was canceled by the user", - "failed": "Task failed due to an error during execution", - "rejected": "Task was rejected by the agent and was not started", - "auth-required": "Task requires authentication to proceed", - "unknown": "Task is in an unknown or indeterminate state" - } + "$ref": "#/$defs/TaskStatus" }, "minItems": 1 }, "task_type": { - "title": "Task Type", - "description": "Filter by single task type", - "type": "string", - "enum": [ - "create_media_buy", - "update_media_buy", - "sync_creatives", - "activate_signal", - "get_signals", - "create_property_list", - "update_property_list", - "get_property_list", - "list_property_lists", - "delete_property_list", - "sync_accounts", - "get_account_financials", - "get_creative_delivery", - "sync_event_sources", - "sync_audiences", - "sync_catalogs", - "log_event", - "get_brand_identity", - "get_rights", - "acquire_rights" - ], - "enumDescriptions": { - "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", - "update_media_buy": "Media-buy domain: Update campaign settings, package configuration, or delivery parameters", - "sync_creatives": "Media-buy domain: Sync creative assets to publisher's library with upsert semantics", - "activate_signal": "Signals domain: Activate an audience signal on a specific platform or account", - "get_signals": "Signals domain: Discover available audience signals based on natural language description", - "create_property_list": "Property domain: Create a new property list with filters and brand reference", - "update_property_list": "Property domain: Update an existing property list", - "get_property_list": "Property domain: Retrieve a property list with resolved properties", - "list_property_lists": "Property domain: List all accessible property lists", - "delete_property_list": "Property domain: Delete a property list", - "sync_accounts": "Account domain: Sync advertiser accounts with a seller using upsert semantics", - "get_account_financials": "Account domain: Query financial status of an operator-billed account (spend, credit, invoices)", - "get_creative_delivery": "Creative domain: Retrieve variant-level creative delivery data", - "sync_event_sources": "Media-buy domain: Configure event sources on an account with upsert semantics", - "sync_audiences": "Media-buy domain: Manage first-party CRM audiences on an account with delta upsert semantics", - "sync_catalogs": "Media-buy domain: Sync catalog feeds (products, inventory, stores, promotions, offerings) to a platform with approval workflow", - "log_event": "Media-buy domain: Send conversion or marketing events for attribution", - "get_brand_identity": "Brand domain: Retrieve brand identity data (logos, colors, tone, assets, voice config) from a brand agent", - "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", - "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials" - }, - "notes": [ - "Task types map to specific AdCP task operations", - "Each task type belongs to the 'media-buy', 'signals', 'property', 'account', 'creative', or 'brand' domain", - "This enum is used in task management APIs (tasks/list, tasks/get) and webhook payloads", - "New task types require a minor version bump per semantic versioning" - ] + "$ref": "#/$defs/TaskType" }, "task_types": { "type": "array", "description": "Filter by multiple task types", "items": { - "title": "Task Type", - "description": "Valid AdCP task types across all domains. These represent the complete set of operations that can be tracked via the task management system.", - "type": "string", - "enum": [ - "create_media_buy", - "update_media_buy", - "sync_creatives", - "activate_signal", - "get_signals", - "create_property_list", - "update_property_list", - "get_property_list", - "list_property_lists", - "delete_property_list", - "sync_accounts", - "get_account_financials", - "get_creative_delivery", - "sync_event_sources", - "sync_audiences", - "sync_catalogs", - "log_event", - "get_brand_identity", - "get_rights", - "acquire_rights" - ], - "enumDescriptions": { - "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", - "update_media_buy": "Media-buy domain: Update campaign settings, package configuration, or delivery parameters", - "sync_creatives": "Media-buy domain: Sync creative assets to publisher's library with upsert semantics", - "activate_signal": "Signals domain: Activate an audience signal on a specific platform or account", - "get_signals": "Signals domain: Discover available audience signals based on natural language description", - "create_property_list": "Property domain: Create a new property list with filters and brand reference", - "update_property_list": "Property domain: Update an existing property list", - "get_property_list": "Property domain: Retrieve a property list with resolved properties", - "list_property_lists": "Property domain: List all accessible property lists", - "delete_property_list": "Property domain: Delete a property list", - "sync_accounts": "Account domain: Sync advertiser accounts with a seller using upsert semantics", - "get_account_financials": "Account domain: Query financial status of an operator-billed account (spend, credit, invoices)", - "get_creative_delivery": "Creative domain: Retrieve variant-level creative delivery data", - "sync_event_sources": "Media-buy domain: Configure event sources on an account with upsert semantics", - "sync_audiences": "Media-buy domain: Manage first-party CRM audiences on an account with delta upsert semantics", - "sync_catalogs": "Media-buy domain: Sync catalog feeds (products, inventory, stores, promotions, offerings) to a platform with approval workflow", - "log_event": "Media-buy domain: Send conversion or marketing events for attribution", - "get_brand_identity": "Brand domain: Retrieve brand identity data (logos, colors, tone, assets, voice config) from a brand agent", - "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", - "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials" - }, - "notes": [ - "Task types map to specific AdCP task operations", - "Each task type belongs to the 'media-buy', 'signals', 'property', 'account', 'creative', or 'brand' domain", - "This enum is used in task management APIs (tasks/list, tasks/get) and webhook payloads", - "New task types require a minor version bump per semantic versioning" - ] + "$ref": "#/$defs/TaskType" }, "minItems": 1 }, @@ -393,8 +205,113 @@ } } ], + "$defs": { + "AdCPProtocol": { + "title": "AdCP Protocol", + "description": "Filter by single AdCP protocol", + "type": "string", + "enum": [ + "media-buy", + "signals", + "governance", + "creative", + "brand", + "sponsored-intelligence" + ], + "enumDescriptions": { + "media-buy": "Campaign creation, package management, delivery optimization, and conversion tracking", + "signals": "Audience signal discovery and activation", + "governance": "Property governance (identity, authorization, data, selection), brand standards, and compliance", + "creative": "Creative asset management, format discovery, and rendering", + "brand": "Brand identity, rights discovery, and rights acquisition", + "sponsored-intelligence": "AI-mediated commerce and conversational sponsored experiences, including buyer-agent sessions and measurement of AI-surfaced outcomes" + } + }, + "TaskStatus": { + "title": "Task Status", + "description": "Filter by single task status", + "type": "string", + "enum": [ + "submitted", + "working", + "input-required", + "completed", + "canceled", + "failed", + "rejected", + "auth-required", + "unknown" + ], + "enumDescriptions": { + "submitted": "Task accepted and queued for long-running execution (hours to days). Client should poll with tasks/get or provide webhook_url at protocol level.", + "working": "Agent is actively processing the task, expect completion within 120 seconds", + "input-required": "Task is paused and waiting for input from the user (e.g., clarification, approval)", + "completed": "Task has been successfully completed", + "canceled": "Task was canceled by the user", + "failed": "Task failed due to an error during execution", + "rejected": "Task was rejected by the agent and was not started", + "auth-required": "Task requires authentication to proceed", + "unknown": "Task is in an unknown or indeterminate state" + } + }, + "TaskType": { + "title": "Task Type", + "description": "Filter by single task type", + "type": "string", + "enum": [ + "create_media_buy", + "update_media_buy", + "sync_creatives", + "activate_signal", + "get_signals", + "create_property_list", + "update_property_list", + "get_property_list", + "list_property_lists", + "delete_property_list", + "sync_accounts", + "get_account_financials", + "get_creative_delivery", + "sync_event_sources", + "sync_audiences", + "sync_catalogs", + "log_event", + "get_brand_identity", + "get_rights", + "acquire_rights" + ], + "enumDescriptions": { + "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", + "update_media_buy": "Media-buy domain: Update campaign settings, package configuration, or delivery parameters", + "sync_creatives": "Media-buy domain: Sync creative assets to publisher's library with upsert semantics", + "activate_signal": "Signals domain: Activate an audience signal on a specific platform or account", + "get_signals": "Signals domain: Discover available audience signals based on natural language description", + "create_property_list": "Property domain: Create a new property list with filters and brand reference", + "update_property_list": "Property domain: Update an existing property list", + "get_property_list": "Property domain: Retrieve a property list with resolved properties", + "list_property_lists": "Property domain: List all accessible property lists", + "delete_property_list": "Property domain: Delete a property list", + "sync_accounts": "Account domain: Sync advertiser accounts with a seller using upsert semantics", + "get_account_financials": "Account domain: Query financial status of an operator-billed account (spend, credit, invoices)", + "get_creative_delivery": "Creative domain: Retrieve variant-level creative delivery data", + "sync_event_sources": "Media-buy domain: Configure event sources on an account with upsert semantics", + "sync_audiences": "Media-buy domain: Manage first-party CRM audiences on an account with delta upsert semantics", + "sync_catalogs": "Media-buy domain: Sync catalog feeds (products, inventory, stores, promotions, offerings) to a platform with approval workflow", + "log_event": "Media-buy domain: Send conversion or marketing events for attribution", + "get_brand_identity": "Brand domain: Retrieve brand identity data (logos, colors, tone, assets, voice config) from a brand agent", + "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", + "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials" + }, + "notes": [ + "Task types map to specific AdCP task operations", + "Each task type belongs to the 'media-buy', 'signals', 'property', 'account', 'creative', or 'brand' domain", + "This enum is used in task management APIs (tasks/list, tasks/get) and webhook payloads", + "New task types require a minor version bump per semantic versioning" + ] + } + }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.527Z", + "generatedAt": "2026-04-28T12:32:22.871Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/core/tasks-list-response.json b/schemas/cache/bundled/core/tasks-list-response.json index cb8b7282..0b7c7269 100644 --- a/schemas/cache/bundled/core/tasks-list-response.json +++ b/schemas/cache/bundled/core/tasks-list-response.json @@ -251,7 +251,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.527Z", + "generatedAt": "2026-04-28T12:32:22.872Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/get-creative-delivery-request.json b/schemas/cache/bundled/creative/get-creative-delivery-request.json index de20a06d..52ad0900 100644 --- a/schemas/cache/bundled/creative/get-creative-delivery-request.json +++ b/schemas/cache/bundled/creative/get-creative-delivery-request.json @@ -238,7 +238,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.528Z", + "generatedAt": "2026-04-28T12:32:22.873Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/get-creative-delivery-response.json b/schemas/cache/bundled/creative/get-creative-delivery-response.json index d25ebdf2..b9e72750 100644 --- a/schemas/cache/bundled/creative/get-creative-delivery-response.json +++ b/schemas/cache/bundled/creative/get-creative-delivery-response.json @@ -61,7 +61,7 @@ "x-entity": "media_buy" }, "format_id": { - "title": "Format ID", + "title": "Format Reference (Structured Object)", "description": "Format of this creative", "x-entity": "creative_format", "type": "object", @@ -69,7 +69,7 @@ "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -186,69 +186,7 @@ "type": "object", "properties": { "event_type": { - "title": "Event Type", - "description": "The event type", - "type": "string", - "enum": [ - "page_view", - "view_content", - "select_content", - "select_item", - "search", - "share", - "add_to_cart", - "remove_from_cart", - "viewed_cart", - "add_to_wishlist", - "initiate_checkout", - "add_payment_info", - "purchase", - "refund", - "lead", - "qualify_lead", - "close_convert_lead", - "disqualify_lead", - "complete_registration", - "subscribe", - "start_trial", - "app_install", - "app_launch", - "contact", - "schedule", - "donate", - "submit_application", - "custom" - ], - "enumDescriptions": { - "page_view": "User viewed a page", - "view_content": "User viewed specific content (product, article, etc.)", - "select_content": "User selected or clicked on content (article, video, etc.)", - "select_item": "User selected a specific product or item from a list", - "search": "User performed a search", - "share": "User shared content via social or messaging", - "add_to_cart": "User added an item to cart", - "remove_from_cart": "User removed an item from cart", - "viewed_cart": "User viewed their shopping cart", - "add_to_wishlist": "User added an item to a wishlist", - "initiate_checkout": "User started checkout process", - "add_payment_info": "User added payment information", - "purchase": "User completed a purchase", - "refund": "A purchase was fully or partially refunded (adjusts ROAS)", - "lead": "User expressed interest (form submission, signup, etc.)", - "qualify_lead": "Lead qualified by sales or scoring criteria", - "close_convert_lead": "Lead converted to a customer or closed deal", - "disqualify_lead": "Lead disqualified or marked as not viable", - "complete_registration": "User completed account registration", - "subscribe": "User subscribed to a service or newsletter", - "start_trial": "User started a free trial", - "app_install": "User installed an application", - "app_launch": "User launched an application", - "contact": "User initiated contact (call, message, etc.)", - "schedule": "User scheduled an appointment or event", - "donate": "User made a donation", - "submit_application": "User submitted an application (loan, job, etc.)", - "custom": "Custom event type (specify in custom_event_name)" - } + "$ref": "#/$defs/EventType" }, "event_source_id": { "type": "string", @@ -285,25 +223,7 @@ "reach_unit": { "allOf": [ { - "title": "Reach Unit", - "description": "Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.", - "type": "string", - "enum": [ - "individuals", - "households", - "devices", - "accounts", - "cookies", - "custom" - ], - "enumDescriptions": { - "individuals": "Unique people. Panel-based or identity-resolved measurement.", - "households": "Unique households or TV homes.", - "devices": "Unique device identifiers (IDFA, GAID, CTV device ID).", - "accounts": "Unique logged-in accounts (platform-specific identity).", - "cookies": "Unique browser cookies.", - "custom": "Publisher-defined reach unit. Describe in ext." - } + "$ref": "#/$defs/ReachUnit" } ], "description": "Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison." @@ -433,17 +353,7 @@ "maximum": 1 }, "standard": { - "title": "Viewability Standard", - "description": "Viewability measurement standard applied to these metrics.", - "type": "string", - "enum": [ - "mrc", - "groupm" - ], - "enumDescriptions": { - "mrc": "MRC/IAB standard: 50% of pixels in view for 1 continuous second (display) or 2 continuous seconds (video).", - "groupm": "GroupM standard: 100% of pixels in view for 1 continuous second (display) or 50% of video duration." - } + "$ref": "#/$defs/ViewabilityStandard" } }, "additionalProperties": true @@ -486,31 +396,7 @@ "type": "object", "properties": { "action_source": { - "title": "Action Source", - "description": "Where the conversion occurred", - "type": "string", - "enum": [ - "website", - "app", - "offline", - "phone_call", - "chat", - "email", - "in_store", - "system_generated", - "other" - ], - "enumDescriptions": { - "website": "Event occurred on a website", - "app": "Event occurred in a mobile or desktop app", - "offline": "Event occurred offline (imported data)", - "phone_call": "Event originated from a phone call", - "chat": "Event originated from a chat conversation", - "email": "Event originated from an email interaction", - "in_store": "Event occurred at a physical retail location", - "system_generated": "Event generated by an automated system", - "other": "Other source (specify in ext)" - } + "$ref": "#/$defs/ActionSource" }, "event_source_id": { "type": "string", @@ -635,69 +521,7 @@ "type": "object", "properties": { "event_type": { - "title": "Event Type", - "description": "The event type", - "type": "string", - "enum": [ - "page_view", - "view_content", - "select_content", - "select_item", - "search", - "share", - "add_to_cart", - "remove_from_cart", - "viewed_cart", - "add_to_wishlist", - "initiate_checkout", - "add_payment_info", - "purchase", - "refund", - "lead", - "qualify_lead", - "close_convert_lead", - "disqualify_lead", - "complete_registration", - "subscribe", - "start_trial", - "app_install", - "app_launch", - "contact", - "schedule", - "donate", - "submit_application", - "custom" - ], - "enumDescriptions": { - "page_view": "User viewed a page", - "view_content": "User viewed specific content (product, article, etc.)", - "select_content": "User selected or clicked on content (article, video, etc.)", - "select_item": "User selected a specific product or item from a list", - "search": "User performed a search", - "share": "User shared content via social or messaging", - "add_to_cart": "User added an item to cart", - "remove_from_cart": "User removed an item from cart", - "viewed_cart": "User viewed their shopping cart", - "add_to_wishlist": "User added an item to a wishlist", - "initiate_checkout": "User started checkout process", - "add_payment_info": "User added payment information", - "purchase": "User completed a purchase", - "refund": "A purchase was fully or partially refunded (adjusts ROAS)", - "lead": "User expressed interest (form submission, signup, etc.)", - "qualify_lead": "Lead qualified by sales or scoring criteria", - "close_convert_lead": "Lead converted to a customer or closed deal", - "disqualify_lead": "Lead disqualified or marked as not viable", - "complete_registration": "User completed account registration", - "subscribe": "User subscribed to a service or newsletter", - "start_trial": "User started a free trial", - "app_install": "User installed an application", - "app_launch": "User launched an application", - "contact": "User initiated contact (call, message, etc.)", - "schedule": "User scheduled an appointment or event", - "donate": "User made a donation", - "submit_application": "User submitted an application (loan, job, etc.)", - "custom": "Custom event type (specify in custom_event_name)" - } + "$ref": "#/$defs/EventType" }, "event_source_id": { "type": "string", @@ -734,25 +558,7 @@ "reach_unit": { "allOf": [ { - "title": "Reach Unit", - "description": "Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.", - "type": "string", - "enum": [ - "individuals", - "households", - "devices", - "accounts", - "cookies", - "custom" - ], - "enumDescriptions": { - "individuals": "Unique people. Panel-based or identity-resolved measurement.", - "households": "Unique households or TV homes.", - "devices": "Unique device identifiers (IDFA, GAID, CTV device ID).", - "accounts": "Unique logged-in accounts (platform-specific identity).", - "cookies": "Unique browser cookies.", - "custom": "Publisher-defined reach unit. Describe in ext." - } + "$ref": "#/$defs/ReachUnit" } ], "description": "Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison." @@ -882,17 +688,7 @@ "maximum": 1 }, "standard": { - "title": "Viewability Standard", - "description": "Viewability measurement standard applied to these metrics.", - "type": "string", - "enum": [ - "mrc", - "groupm" - ], - "enumDescriptions": { - "mrc": "MRC/IAB standard: 50% of pixels in view for 1 continuous second (display) or 2 continuous seconds (video).", - "groupm": "GroupM standard: 100% of pixels in view for 1 continuous second (display) or 50% of video duration." - } + "$ref": "#/$defs/ViewabilityStandard" } }, "additionalProperties": true @@ -935,31 +731,7 @@ "type": "object", "properties": { "action_source": { - "title": "Action Source", - "description": "Where the conversion occurred", - "type": "string", - "enum": [ - "website", - "app", - "offline", - "phone_call", - "chat", - "email", - "in_store", - "system_generated", - "other" - ], - "enumDescriptions": { - "website": "Event occurred on a website", - "app": "Event occurred in a mobile or desktop app", - "offline": "Event occurred offline (imported data)", - "phone_call": "Event originated from a phone call", - "chat": "Event originated from a chat conversation", - "email": "Event originated from an email interaction", - "in_store": "Event occurred at a physical retail location", - "system_generated": "Event generated by an automated system", - "other": "Other source (specify in ext)" - } + "$ref": "#/$defs/ActionSource" }, "event_source_id": { "type": "string", @@ -1003,15 +775,15 @@ "type": "object", "properties": { "format_id": { - "title": "Format ID", - "description": "Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250}).", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -1094,31 +866,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1254,19 +1002,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1277,19 +1013,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1434,20 +1158,30 @@ "description": "Frame rate as string to preserve precision (e.g., '23.976', '29.97', '30')" }, "frame_rate_type": { + "title": "Frame Rate Type", + "description": "Whether the video uses a constant or variable frame rate. Broadcast and SSAI contexts require constant frame rate for seamless splicing.", "type": "string", "enum": [ "constant", "variable" ], - "description": "Whether the video uses constant (CFR) or variable (VFR) frame rate" + "enumDescriptions": { + "constant": "Constant frame rate (CFR) \u2014 each frame occupies an identical time interval", + "variable": "Variable frame rate (VFR) \u2014 frame intervals may differ" + } }, "scan_type": { + "title": "Scan Type", + "description": "Video scan method. Modern digital delivery requires progressive scan; interlaced is retained for broadcast legacy content.", "type": "string", "enum": [ "progressive", "interlaced" ], - "description": "Scan type of the video" + "enumDescriptions": { + "progressive": "All lines of each frame are drawn in sequence", + "interlaced": "Alternating lines drawn in two passes per frame (legacy broadcast)" + } }, "color_space": { "type": "string", @@ -1494,20 +1228,30 @@ "description": "GOP/keyframe interval in seconds" }, "gop_type": { + "title": "GOP Type", + "description": "Group of Pictures structure. SSAI and broadcast require closed GOPs for clean splice points; open GOPs may produce artifacts at ad boundaries.", "type": "string", "enum": [ "closed", "open" ], - "description": "GOP structure type" + "enumDescriptions": { + "closed": "Each GOP is independently decodable \u2014 required for SSAI and broadcast splicing", + "open": "GOPs may reference frames from adjacent GOPs \u2014 not suitable for splicing" + } }, "moov_atom_position": { + "title": "Moov Atom Position", + "description": "Position of the moov atom in an MP4 container. 'start' enables progressive download without buffering the entire file; required for streaming ad delivery.", "type": "string", "enum": [ "start", "end" ], - "description": "Position of moov atom in MP4 container" + "enumDescriptions": { + "start": "moov atom at beginning of file \u2014 enables progressive download and streaming delivery", + "end": "moov atom at end of file \u2014 requires full download before playback can begin" + } }, "has_audio": { "type": "boolean", @@ -1522,14 +1266,7 @@ "description": "Audio sampling rate in Hz (e.g., 44100, 48000)" }, "audio_channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Audio channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "audio_bit_depth": { "type": "integer", @@ -1577,31 +1314,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1737,19 +1450,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1760,19 +1461,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1902,14 +1591,7 @@ "description": "Sampling rate in Hz (e.g., 44100, 48000, 96000)" }, "channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "bit_depth": { "type": "integer", @@ -1945,31 +1627,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2105,19 +1763,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2128,19 +1774,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2322,31 +1956,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2482,19 +2092,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2505,19 +2103,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2670,31 +2256,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2830,19 +2392,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2853,19 +2403,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2990,31 +2528,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3150,19 +2664,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3173,19 +2675,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3322,31 +2812,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3482,19 +2948,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3505,19 +2959,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3660,31 +3102,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3820,19 +3238,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3843,19 +3249,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3982,151 +3376,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -4141,151 +3391,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -4339,31 +3445,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4499,19 +3581,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4522,19 +3592,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4650,31 +3708,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4810,19 +3844,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4833,19 +3855,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -5009,31 +4019,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -5169,19 +4155,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -5192,19 +4166,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -5499,19 +4461,7 @@ "description": "The disclosure text that must appear in the creative" }, "position": { - "title": "Disclosure Position", - "description": "Where the disclosure should appear within the creative. prominent: clearly visible in the main creative area; footer: at the bottom of visual creatives; audio: spoken in audio/video creatives; subtitle: displayed in the subtitle or closed-caption track; overlay: superimposed on video content; end_card: displayed on video end card; pre_roll: spoken or displayed before main content; companion: in companion ad unit alongside primary creative", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "jurisdictions": { "type": "array", @@ -5536,19 +4486,7 @@ "description": "Language of the disclosure text as a BCP 47 language tag (e.g., 'en', 'fr-CA', 'es'). When omitted, the disclosure is assumed to match the creative's language." }, "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display. When omitted, the creative agent should use the most restrictive persistence mode supported by the target format.", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" } }, "required": [ @@ -5699,69 +4637,7 @@ "type": "array", "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items \u2014 e.g., a job catalog converts via submit_application, a product catalog via purchase. The event's content_ids field carries the item IDs that connect back to catalog items. Use content_id_type to declare what identifier type content_ids values represent.", "items": { - "title": "Event Type", - "description": "Standard marketing event types for event logging, aligned with IAB ECAPI", - "type": "string", - "enum": [ - "page_view", - "view_content", - "select_content", - "select_item", - "search", - "share", - "add_to_cart", - "remove_from_cart", - "viewed_cart", - "add_to_wishlist", - "initiate_checkout", - "add_payment_info", - "purchase", - "refund", - "lead", - "qualify_lead", - "close_convert_lead", - "disqualify_lead", - "complete_registration", - "subscribe", - "start_trial", - "app_install", - "app_launch", - "contact", - "schedule", - "donate", - "submit_application", - "custom" - ], - "enumDescriptions": { - "page_view": "User viewed a page", - "view_content": "User viewed specific content (product, article, etc.)", - "select_content": "User selected or clicked on content (article, video, etc.)", - "select_item": "User selected a specific product or item from a list", - "search": "User performed a search", - "share": "User shared content via social or messaging", - "add_to_cart": "User added an item to cart", - "remove_from_cart": "User removed an item from cart", - "viewed_cart": "User viewed their shopping cart", - "add_to_wishlist": "User added an item to a wishlist", - "initiate_checkout": "User started checkout process", - "add_payment_info": "User added payment information", - "purchase": "User completed a purchase", - "refund": "A purchase was fully or partially refunded (adjusts ROAS)", - "lead": "User expressed interest (form submission, signup, etc.)", - "qualify_lead": "Lead qualified by sales or scoring criteria", - "close_convert_lead": "Lead converted to a customer or closed deal", - "disqualify_lead": "Lead disqualified or marked as not viable", - "complete_registration": "User completed account registration", - "subscribe": "User subscribed to a service or newsletter", - "start_trial": "User started a free trial", - "app_install": "User installed an application", - "app_launch": "User launched an application", - "contact": "User initiated contact (call, message, etc.)", - "schedule": "User scheduled an appointment or event", - "donate": "User made a donation", - "submit_application": "User submitted an application (loan, job, etc.)", - "custom": "Custom event type (specify in custom_event_name)" - } + "$ref": "#/$defs/EventType" }, "minItems": 1, "uniqueItems": true @@ -6270,31 +5146,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -6430,19 +5282,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -6453,19 +5293,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -6788,8 +5616,351 @@ "creatives" ], "additionalProperties": true, + "$defs": { + "EventType": { + "title": "Event Type", + "description": "The event type", + "type": "string", + "enum": [ + "page_view", + "view_content", + "select_content", + "select_item", + "search", + "share", + "add_to_cart", + "remove_from_cart", + "viewed_cart", + "add_to_wishlist", + "initiate_checkout", + "add_payment_info", + "purchase", + "refund", + "lead", + "qualify_lead", + "close_convert_lead", + "disqualify_lead", + "complete_registration", + "subscribe", + "start_trial", + "app_install", + "app_launch", + "contact", + "schedule", + "donate", + "submit_application", + "custom" + ], + "enumDescriptions": { + "page_view": "User viewed a page", + "view_content": "User viewed specific content (product, article, etc.)", + "select_content": "User selected or clicked on content (article, video, etc.)", + "select_item": "User selected a specific product or item from a list", + "search": "User performed a search", + "share": "User shared content via social or messaging", + "add_to_cart": "User added an item to cart", + "remove_from_cart": "User removed an item from cart", + "viewed_cart": "User viewed their shopping cart", + "add_to_wishlist": "User added an item to a wishlist", + "initiate_checkout": "User started checkout process", + "add_payment_info": "User added payment information", + "purchase": "User completed a purchase", + "refund": "A purchase was fully or partially refunded (adjusts ROAS)", + "lead": "User expressed interest (form submission, signup, etc.)", + "qualify_lead": "Lead qualified by sales or scoring criteria", + "close_convert_lead": "Lead converted to a customer or closed deal", + "disqualify_lead": "Lead disqualified or marked as not viable", + "complete_registration": "User completed account registration", + "subscribe": "User subscribed to a service or newsletter", + "start_trial": "User started a free trial", + "app_install": "User installed an application", + "app_launch": "User launched an application", + "contact": "User initiated contact (call, message, etc.)", + "schedule": "User scheduled an appointment or event", + "donate": "User made a donation", + "submit_application": "User submitted an application (loan, job, etc.)", + "custom": "Custom event type (specify in custom_event_name)" + } + }, + "ReachUnit": { + "title": "Reach Unit", + "description": "Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.", + "type": "string", + "enum": [ + "individuals", + "households", + "devices", + "accounts", + "cookies", + "custom" + ], + "enumDescriptions": { + "individuals": "Unique people. Panel-based or identity-resolved measurement.", + "households": "Unique households or TV homes.", + "devices": "Unique device identifiers (IDFA, GAID, CTV device ID).", + "accounts": "Unique logged-in accounts (platform-specific identity).", + "cookies": "Unique browser cookies.", + "custom": "Publisher-defined reach unit. Describe in ext." + } + }, + "ViewabilityStandard": { + "title": "Viewability Standard", + "description": "Viewability measurement standard applied to these metrics.", + "type": "string", + "enum": [ + "mrc", + "groupm" + ], + "enumDescriptions": { + "mrc": "MRC/IAB standard: 50% of pixels in view for 1 continuous second (display) or 2 continuous seconds (video).", + "groupm": "GroupM standard: 100% of pixels in view for 1 continuous second (display) or 50% of video duration." + } + }, + "ActionSource": { + "title": "Action Source", + "description": "Where the conversion occurred", + "type": "string", + "enum": [ + "website", + "app", + "offline", + "phone_call", + "chat", + "email", + "in_store", + "system_generated", + "other" + ], + "enumDescriptions": { + "website": "Event occurred on a website", + "app": "Event occurred in a mobile or desktop app", + "offline": "Event occurred offline (imported data)", + "phone_call": "Event originated from a phone call", + "chat": "Event originated from a chat conversation", + "email": "Event originated from an email interaction", + "in_store": "Event occurred at a physical retail location", + "system_generated": "Event generated by an automated system", + "other": "Other source (specify in ext)" + } + }, + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] + }, + "AudioChannelLayout": { + "title": "Audio Channel Layout", + "description": "Audio channel configuration", + "type": "string", + "enum": [ + "mono", + "stereo", + "5.1", + "7.1" + ] + }, + "UniversalMacro": { + "title": "Universal Macro", + "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", + "type": "string", + "enum": [ + "MEDIA_BUY_ID", + "PACKAGE_ID", + "CREATIVE_ID", + "CACHEBUSTER", + "TIMESTAMP", + "CLICK_URL", + "GDPR", + "GDPR_CONSENT", + "US_PRIVACY", + "GPP_STRING", + "GPP_SID", + "IP_ADDRESS", + "LIMIT_AD_TRACKING", + "DEVICE_TYPE", + "OS", + "OS_VERSION", + "DEVICE_MAKE", + "DEVICE_MODEL", + "USER_AGENT", + "APP_BUNDLE", + "APP_NAME", + "COUNTRY", + "REGION", + "CITY", + "ZIP", + "DMA", + "LAT", + "LONG", + "DEVICE_ID", + "DEVICE_ID_TYPE", + "DOMAIN", + "PAGE_URL", + "REFERRER", + "KEYWORDS", + "PLACEMENT_ID", + "FOLD_POSITION", + "AD_WIDTH", + "AD_HEIGHT", + "VIDEO_ID", + "VIDEO_TITLE", + "VIDEO_DURATION", + "VIDEO_CATEGORY", + "CONTENT_GENRE", + "CONTENT_RATING", + "PLAYER_WIDTH", + "PLAYER_HEIGHT", + "POD_POSITION", + "POD_SIZE", + "AD_BREAK_ID", + "STATION_ID", + "COLLECTION_NAME", + "INSTALLMENT_ID", + "AUDIO_DURATION", + "TMPX", + "AXEM", + "CATALOG_ID", + "SKU", + "GTIN", + "OFFERING_ID", + "JOB_ID", + "HOTEL_ID", + "FLIGHT_ID", + "VEHICLE_ID", + "LISTING_ID", + "STORE_ID", + "PROGRAM_ID", + "DESTINATION_ID", + "CREATIVE_VARIANT_ID", + "APP_ITEM_ID" + ], + "enumDescriptions": { + "MEDIA_BUY_ID": "AdCP media buy identifier", + "PACKAGE_ID": "AdCP package identifier", + "CREATIVE_ID": "AdCP creative identifier", + "CACHEBUSTER": "Random number to prevent caching", + "TIMESTAMP": "Unix timestamp in milliseconds", + "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", + "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", + "GDPR_CONSENT": "IAB TCF 2.0 consent string", + "US_PRIVACY": "US Privacy (CCPA) string", + "GPP_STRING": "Global Privacy Platform consent string", + "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", + "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", + "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", + "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", + "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", + "OS_VERSION": "OS version number", + "DEVICE_MAKE": "Device manufacturer", + "DEVICE_MODEL": "Device model identifier", + "USER_AGENT": "Full user agent string", + "APP_BUNDLE": "App bundle ID (domain or numeric)", + "APP_NAME": "Human-readable app name", + "COUNTRY": "ISO 3166-1 alpha-2 country code", + "REGION": "State/province/region code", + "CITY": "City name", + "ZIP": "Postal code", + "DMA": "Nielsen DMA code (US TV markets)", + "LAT": "Latitude coordinate", + "LONG": "Longitude coordinate", + "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", + "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", + "DOMAIN": "Domain where ad is shown", + "PAGE_URL": "Full page URL (encoded)", + "REFERRER": "HTTP referrer URL", + "KEYWORDS": "Page keywords (comma-separated)", + "PLACEMENT_ID": "Global Placement ID (IAB standard)", + "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", + "AD_WIDTH": "Ad slot width in pixels", + "AD_HEIGHT": "Ad slot height in pixels", + "VIDEO_ID": "Content video identifier", + "VIDEO_TITLE": "Content video title", + "VIDEO_DURATION": "Content duration in seconds", + "VIDEO_CATEGORY": "IAB content category", + "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", + "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", + "PLAYER_WIDTH": "Video player width in pixels", + "PLAYER_HEIGHT": "Video player height in pixels", + "POD_POSITION": "Position within ad break", + "POD_SIZE": "Total ads in the ad break", + "AD_BREAK_ID": "Unique ad break identifier", + "STATION_ID": "Radio station or podcast identifier", + "COLLECTION_NAME": "Program or collection name", + "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", + "AUDIO_DURATION": "Audio content duration in seconds", + "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", + "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", + "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", + "SKU": "Product SKU identifier for the catalog item being rendered", + "GTIN": "Global Trade Item Number for the catalog item being rendered", + "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", + "JOB_ID": "Job posting identifier for the catalog item being rendered", + "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", + "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", + "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", + "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", + "STORE_ID": "Store location identifier for the catalog item being rendered", + "PROGRAM_ID": "Education program identifier for the catalog item being rendered", + "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", + "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", + "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" + } + } + }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.536Z", + "generatedAt": "2026-04-28T12:32:22.882Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/get-creative-features-request.json b/schemas/cache/bundled/creative/get-creative-features-request.json index 65735412..507824c1 100644 --- a/schemas/cache/bundled/creative/get-creative-features-request.json +++ b/schemas/cache/bundled/creative/get-creative-features-request.json @@ -16,15 +16,15 @@ "type": "object", "properties": { "format_id": { - "title": "Format ID", - "description": "Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250}).", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -107,31 +107,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -267,19 +243,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -290,19 +254,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -447,20 +399,30 @@ "description": "Frame rate as string to preserve precision (e.g., '23.976', '29.97', '30')" }, "frame_rate_type": { + "title": "Frame Rate Type", + "description": "Whether the video uses a constant or variable frame rate. Broadcast and SSAI contexts require constant frame rate for seamless splicing.", "type": "string", "enum": [ "constant", "variable" ], - "description": "Whether the video uses constant (CFR) or variable (VFR) frame rate" + "enumDescriptions": { + "constant": "Constant frame rate (CFR) \u2014 each frame occupies an identical time interval", + "variable": "Variable frame rate (VFR) \u2014 frame intervals may differ" + } }, "scan_type": { + "title": "Scan Type", + "description": "Video scan method. Modern digital delivery requires progressive scan; interlaced is retained for broadcast legacy content.", "type": "string", "enum": [ "progressive", "interlaced" ], - "description": "Scan type of the video" + "enumDescriptions": { + "progressive": "All lines of each frame are drawn in sequence", + "interlaced": "Alternating lines drawn in two passes per frame (legacy broadcast)" + } }, "color_space": { "type": "string", @@ -507,20 +469,30 @@ "description": "GOP/keyframe interval in seconds" }, "gop_type": { + "title": "GOP Type", + "description": "Group of Pictures structure. SSAI and broadcast require closed GOPs for clean splice points; open GOPs may produce artifacts at ad boundaries.", "type": "string", "enum": [ "closed", "open" ], - "description": "GOP structure type" + "enumDescriptions": { + "closed": "Each GOP is independently decodable \u2014 required for SSAI and broadcast splicing", + "open": "GOPs may reference frames from adjacent GOPs \u2014 not suitable for splicing" + } }, "moov_atom_position": { + "title": "Moov Atom Position", + "description": "Position of the moov atom in an MP4 container. 'start' enables progressive download without buffering the entire file; required for streaming ad delivery.", "type": "string", "enum": [ "start", "end" ], - "description": "Position of moov atom in MP4 container" + "enumDescriptions": { + "start": "moov atom at beginning of file \u2014 enables progressive download and streaming delivery", + "end": "moov atom at end of file \u2014 requires full download before playback can begin" + } }, "has_audio": { "type": "boolean", @@ -535,14 +507,7 @@ "description": "Audio sampling rate in Hz (e.g., 44100, 48000)" }, "audio_channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Audio channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "audio_bit_depth": { "type": "integer", @@ -590,31 +555,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -750,19 +691,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -773,19 +702,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -915,14 +832,7 @@ "description": "Sampling rate in Hz (e.g., 44100, 48000, 96000)" }, "channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "bit_depth": { "type": "integer", @@ -958,31 +868,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1118,19 +1004,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1141,19 +1015,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1335,31 +1197,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1495,19 +1333,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1518,19 +1344,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1683,31 +1497,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1843,19 +1633,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1866,19 +1644,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2003,31 +1769,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2163,19 +1905,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2186,19 +1916,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2335,31 +2053,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2495,19 +2189,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2518,19 +2200,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2673,31 +2343,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2833,19 +2479,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2856,19 +2490,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2995,151 +2617,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -3154,151 +2632,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -3352,31 +2686,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3512,19 +2822,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3535,19 +2833,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3663,31 +2949,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3823,19 +3085,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3846,19 +3096,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4022,31 +3260,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4182,19 +3396,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4205,19 +3407,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4512,19 +3702,7 @@ "description": "The disclosure text that must appear in the creative" }, "position": { - "title": "Disclosure Position", - "description": "Where the disclosure should appear within the creative. prominent: clearly visible in the main creative area; footer: at the bottom of visual creatives; audio: spoken in audio/video creatives; subtitle: displayed in the subtitle or closed-caption track; overlay: superimposed on video content; end_card: displayed on video end card; pre_roll: spoken or displayed before main content; companion: in companion ad unit alongside primary creative", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "jurisdictions": { "type": "array", @@ -4549,19 +3727,7 @@ "description": "Language of the disclosure text as a BCP 47 language tag (e.g., 'en', 'fr-CA', 'es'). When omitted, the disclosure is assumed to match the creative's language." }, "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display. When omitted, the creative agent should use the most restrictive persistence mode supported by the target format.", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" } }, "required": [ @@ -5283,31 +4449,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -5443,19 +4585,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -5466,19 +4596,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -5748,8 +4866,225 @@ "creative_manifest" ], "additionalProperties": true, + "$defs": { + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] + }, + "AudioChannelLayout": { + "title": "Audio Channel Layout", + "description": "Audio channel configuration", + "type": "string", + "enum": [ + "mono", + "stereo", + "5.1", + "7.1" + ] + }, + "UniversalMacro": { + "title": "Universal Macro", + "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", + "type": "string", + "enum": [ + "MEDIA_BUY_ID", + "PACKAGE_ID", + "CREATIVE_ID", + "CACHEBUSTER", + "TIMESTAMP", + "CLICK_URL", + "GDPR", + "GDPR_CONSENT", + "US_PRIVACY", + "GPP_STRING", + "GPP_SID", + "IP_ADDRESS", + "LIMIT_AD_TRACKING", + "DEVICE_TYPE", + "OS", + "OS_VERSION", + "DEVICE_MAKE", + "DEVICE_MODEL", + "USER_AGENT", + "APP_BUNDLE", + "APP_NAME", + "COUNTRY", + "REGION", + "CITY", + "ZIP", + "DMA", + "LAT", + "LONG", + "DEVICE_ID", + "DEVICE_ID_TYPE", + "DOMAIN", + "PAGE_URL", + "REFERRER", + "KEYWORDS", + "PLACEMENT_ID", + "FOLD_POSITION", + "AD_WIDTH", + "AD_HEIGHT", + "VIDEO_ID", + "VIDEO_TITLE", + "VIDEO_DURATION", + "VIDEO_CATEGORY", + "CONTENT_GENRE", + "CONTENT_RATING", + "PLAYER_WIDTH", + "PLAYER_HEIGHT", + "POD_POSITION", + "POD_SIZE", + "AD_BREAK_ID", + "STATION_ID", + "COLLECTION_NAME", + "INSTALLMENT_ID", + "AUDIO_DURATION", + "TMPX", + "AXEM", + "CATALOG_ID", + "SKU", + "GTIN", + "OFFERING_ID", + "JOB_ID", + "HOTEL_ID", + "FLIGHT_ID", + "VEHICLE_ID", + "LISTING_ID", + "STORE_ID", + "PROGRAM_ID", + "DESTINATION_ID", + "CREATIVE_VARIANT_ID", + "APP_ITEM_ID" + ], + "enumDescriptions": { + "MEDIA_BUY_ID": "AdCP media buy identifier", + "PACKAGE_ID": "AdCP package identifier", + "CREATIVE_ID": "AdCP creative identifier", + "CACHEBUSTER": "Random number to prevent caching", + "TIMESTAMP": "Unix timestamp in milliseconds", + "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", + "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", + "GDPR_CONSENT": "IAB TCF 2.0 consent string", + "US_PRIVACY": "US Privacy (CCPA) string", + "GPP_STRING": "Global Privacy Platform consent string", + "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", + "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", + "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", + "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", + "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", + "OS_VERSION": "OS version number", + "DEVICE_MAKE": "Device manufacturer", + "DEVICE_MODEL": "Device model identifier", + "USER_AGENT": "Full user agent string", + "APP_BUNDLE": "App bundle ID (domain or numeric)", + "APP_NAME": "Human-readable app name", + "COUNTRY": "ISO 3166-1 alpha-2 country code", + "REGION": "State/province/region code", + "CITY": "City name", + "ZIP": "Postal code", + "DMA": "Nielsen DMA code (US TV markets)", + "LAT": "Latitude coordinate", + "LONG": "Longitude coordinate", + "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", + "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", + "DOMAIN": "Domain where ad is shown", + "PAGE_URL": "Full page URL (encoded)", + "REFERRER": "HTTP referrer URL", + "KEYWORDS": "Page keywords (comma-separated)", + "PLACEMENT_ID": "Global Placement ID (IAB standard)", + "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", + "AD_WIDTH": "Ad slot width in pixels", + "AD_HEIGHT": "Ad slot height in pixels", + "VIDEO_ID": "Content video identifier", + "VIDEO_TITLE": "Content video title", + "VIDEO_DURATION": "Content duration in seconds", + "VIDEO_CATEGORY": "IAB content category", + "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", + "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", + "PLAYER_WIDTH": "Video player width in pixels", + "PLAYER_HEIGHT": "Video player height in pixels", + "POD_POSITION": "Position within ad break", + "POD_SIZE": "Total ads in the ad break", + "AD_BREAK_ID": "Unique ad break identifier", + "STATION_ID": "Radio station or podcast identifier", + "COLLECTION_NAME": "Program or collection name", + "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", + "AUDIO_DURATION": "Audio content duration in seconds", + "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", + "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", + "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", + "SKU": "Product SKU identifier for the catalog item being rendered", + "GTIN": "Global Trade Item Number for the catalog item being rendered", + "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", + "JOB_ID": "Job posting identifier for the catalog item being rendered", + "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", + "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", + "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", + "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", + "STORE_ID": "Store location identifier for the catalog item being rendered", + "PROGRAM_ID": "Education program identifier for the catalog item being rendered", + "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", + "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", + "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" + } + } + }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.545Z", + "generatedAt": "2026-04-28T12:32:22.893Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/get-creative-features-response.json b/schemas/cache/bundled/creative/get-creative-features-response.json index b0398be9..c2ba47c0 100644 --- a/schemas/cache/bundled/creative/get-creative-features-response.json +++ b/schemas/cache/bundled/creative/get-creative-features-response.json @@ -223,7 +223,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.548Z", + "generatedAt": "2026-04-28T12:32:22.896Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/list-creative-formats-request.json b/schemas/cache/bundled/creative/list-creative-formats-request.json index b71ab68b..4a542731 100644 --- a/schemas/cache/bundled/creative/list-creative-formats-request.json +++ b/schemas/cache/bundled/creative/list-creative-formats-request.json @@ -14,15 +14,15 @@ "type": "array", "description": "Return only these specific format IDs", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -173,15 +173,15 @@ "type": "array", "description": "Filter to formats whose output_format_ids includes any of these format IDs. Returns formats that can produce these outputs \u2014 inspect each result's input_format_ids to see what inputs they accept.", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -224,15 +224,15 @@ "type": "array", "description": "Filter to formats whose input_format_ids includes any of these format IDs. Returns formats that accept these creatives as input \u2014 inspect each result's output_format_ids to see what they can produce.", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -478,7 +478,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.548Z", + "generatedAt": "2026-04-28T12:32:22.897Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/list-creative-formats-response.json b/schemas/cache/bundled/creative/list-creative-formats-response.json index c0520c31..c9f990d2 100644 --- a/schemas/cache/bundled/creative/list-creative-formats-response.json +++ b/schemas/cache/bundled/creative/list-creative-formats-response.json @@ -13,15 +13,15 @@ "type": "object", "properties": { "format_id": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name", + "title": "Format Reference (Structured Object)", + "description": "This format's own identifier \u2014 a structured object {agent_url, id}, not a string. See /schemas/core/format-id.json for the full shape.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -134,17 +134,7 @@ "description": "Maximum height for responsive renders" }, "unit": { - "title": "Dimension Unit", - "description": "Unit of measurement for width/height values. Defaults to 'px' when absent. Print formats use 'inches' or 'cm'.", - "type": "string", - "enum": [ - "px", - "dp", - "inches", - "cm", - "mm", - "pt" - ] + "$ref": "#/$defs/DimensionUnit" }, "responsive": { "type": "object", @@ -209,6 +199,7 @@ "items": { "oneOf": [ { + "title": "IndividualImageAsset", "description": "Image asset", "allOf": [ { @@ -248,17 +239,7 @@ "description": "Maximum height. Interpretation depends on unit (default: pixels). For exact dimensions, set min_height = max_height." }, "unit": { - "title": "Dimension Unit", - "description": "Unit of measurement for width/height values. Defaults to 'px' when absent. Print formats use 'inches' or 'cm'.", - "type": "string", - "enum": [ - "px", - "dp", - "inches", - "cm", - "mm", - "pt" - ] + "$ref": "#/$defs/DimensionUnit" }, "aspect_ratio": { "type": "string", @@ -383,6 +364,7 @@ } }, { + "title": "IndividualVideoAsset", "description": "Video asset", "allOf": [ { @@ -493,28 +475,13 @@ "description": "Whether the video must include an audio track" }, "frame_rate_type": { - "type": "string", - "enum": [ - "constant", - "variable" - ], - "description": "Required frame rate type. Broadcast and SSAI require constant frame rate for seamless splicing." + "$ref": "#/$defs/FrameRateType" }, "scan_type": { - "type": "string", - "enum": [ - "progressive", - "interlaced" - ], - "description": "Required scan type. Modern delivery requires progressive scan." + "$ref": "#/$defs/ScanType" }, "gop_type": { - "type": "string", - "enum": [ - "closed", - "open" - ], - "description": "Required GOP structure. SSAI and broadcast require closed GOPs for clean splice points." + "$ref": "#/$defs/GOPType" }, "min_gop_interval_seconds": { "type": "number", @@ -527,12 +494,7 @@ "description": "Maximum keyframe interval in seconds. SSAI typically requires 1-2 second intervals." }, "moov_atom_position": { - "type": "string", - "enum": [ - "start", - "end" - ], - "description": "Required moov atom position in MP4 container. 'start' enables progressive download without buffering the entire file." + "$ref": "#/$defs/MoovAtomPosition" }, "audio_codecs": { "type": "array", @@ -562,13 +524,7 @@ "audio_channels": { "type": "array", "items": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ] + "$ref": "#/$defs/AudioChannelLayout" }, "description": "Accepted audio channel configurations" }, @@ -591,6 +547,7 @@ } }, { + "title": "IndividualAudioAsset", "description": "Audio asset", "allOf": [ { @@ -673,6 +630,7 @@ } }, { + "title": "IndividualTextAsset", "description": "Text asset", "allOf": [ { @@ -728,6 +686,7 @@ } }, { + "title": "IndividualMarkdownAsset", "description": "Markdown asset", "allOf": [ { @@ -757,6 +716,7 @@ } }, { + "title": "IndividualHtmlAsset", "description": "HTML asset", "allOf": [ { @@ -809,6 +769,7 @@ } }, { + "title": "IndividualCssAsset", "description": "CSS asset", "allOf": [ { @@ -838,6 +799,7 @@ } }, { + "title": "IndividualJavaScriptAsset", "description": "JavaScript asset", "allOf": [ { @@ -892,6 +854,7 @@ } }, { + "title": "IndividualVastAsset", "description": "VAST asset", "allOf": [ { @@ -927,6 +890,7 @@ } }, { + "title": "IndividualDaastAsset", "description": "DAAST asset", "allOf": [ { @@ -958,6 +922,7 @@ } }, { + "title": "IndividualUrlAsset", "description": "URL asset", "allOf": [ { @@ -1022,6 +987,7 @@ } }, { + "title": "IndividualWebhookAsset", "description": "Webhook asset", "allOf": [ { @@ -1057,6 +1023,7 @@ } }, { + "title": "IndividualBriefAsset", "description": "Brief asset", "allOf": [ { @@ -1073,6 +1040,7 @@ } }, { + "title": "IndividualCatalogAsset", "description": "Catalog asset", "allOf": [ { @@ -1231,17 +1199,7 @@ "description": "Maximum height. Interpretation depends on unit (default: pixels). For exact dimensions, set min_height = max_height." }, "unit": { - "title": "Dimension Unit", - "description": "Unit of measurement for width/height values. Defaults to 'px' when absent. Print formats use 'inches' or 'cm'.", - "type": "string", - "enum": [ - "px", - "dp", - "inches", - "cm", - "mm", - "pt" - ] + "$ref": "#/$defs/DimensionUnit" }, "aspect_ratio": { "type": "string", @@ -1460,28 +1418,13 @@ "description": "Whether the video must include an audio track" }, "frame_rate_type": { - "type": "string", - "enum": [ - "constant", - "variable" - ], - "description": "Required frame rate type. Broadcast and SSAI require constant frame rate for seamless splicing." + "$ref": "#/$defs/FrameRateType" }, "scan_type": { - "type": "string", - "enum": [ - "progressive", - "interlaced" - ], - "description": "Required scan type. Modern delivery requires progressive scan." + "$ref": "#/$defs/ScanType" }, "gop_type": { - "type": "string", - "enum": [ - "closed", - "open" - ], - "description": "Required GOP structure. SSAI and broadcast require closed GOPs for clean splice points." + "$ref": "#/$defs/GOPType" }, "min_gop_interval_seconds": { "type": "number", @@ -1494,12 +1437,7 @@ "description": "Maximum keyframe interval in seconds. SSAI typically requires 1-2 second intervals." }, "moov_atom_position": { - "type": "string", - "enum": [ - "start", - "end" - ], - "description": "Required moov atom position in MP4 container. 'start' enables progressive download without buffering the entire file." + "$ref": "#/$defs/MoovAtomPosition" }, "audio_codecs": { "type": "array", @@ -1529,13 +1467,7 @@ "audio_channels": { "type": "array", "items": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ] + "$ref": "#/$defs/AudioChannelLayout" }, "description": "Accepted audio channel configurations" }, @@ -2033,6 +1965,7 @@ } }, { + "title": "RepeatableGroupAsset", "description": "Repeatable asset group (for carousels, slideshows, playlists, etc.)", "type": "object", "properties": { @@ -2074,6 +2007,7 @@ "items": { "oneOf": [ { + "title": "GroupImageAsset", "description": "Image asset in group", "allOf": [ { @@ -2110,17 +2044,7 @@ "description": "Maximum height. Interpretation depends on unit (default: pixels). For exact dimensions, set min_height = max_height." }, "unit": { - "title": "Dimension Unit", - "description": "Unit of measurement for width/height values. Defaults to 'px' when absent. Print formats use 'inches' or 'cm'.", - "type": "string", - "enum": [ - "px", - "dp", - "inches", - "cm", - "mm", - "pt" - ] + "$ref": "#/$defs/DimensionUnit" }, "aspect_ratio": { "type": "string", @@ -2245,6 +2169,7 @@ } }, { + "title": "GroupVideoAsset", "description": "Video asset in group", "allOf": [ { @@ -2352,28 +2277,13 @@ "description": "Whether the video must include an audio track" }, "frame_rate_type": { - "type": "string", - "enum": [ - "constant", - "variable" - ], - "description": "Required frame rate type. Broadcast and SSAI require constant frame rate for seamless splicing." + "$ref": "#/$defs/FrameRateType" }, "scan_type": { - "type": "string", - "enum": [ - "progressive", - "interlaced" - ], - "description": "Required scan type. Modern delivery requires progressive scan." + "$ref": "#/$defs/ScanType" }, "gop_type": { - "type": "string", - "enum": [ - "closed", - "open" - ], - "description": "Required GOP structure. SSAI and broadcast require closed GOPs for clean splice points." + "$ref": "#/$defs/GOPType" }, "min_gop_interval_seconds": { "type": "number", @@ -2386,12 +2296,7 @@ "description": "Maximum keyframe interval in seconds. SSAI typically requires 1-2 second intervals." }, "moov_atom_position": { - "type": "string", - "enum": [ - "start", - "end" - ], - "description": "Required moov atom position in MP4 container. 'start' enables progressive download without buffering the entire file." + "$ref": "#/$defs/MoovAtomPosition" }, "audio_codecs": { "type": "array", @@ -2421,13 +2326,7 @@ "audio_channels": { "type": "array", "items": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ] + "$ref": "#/$defs/AudioChannelLayout" }, "description": "Accepted audio channel configurations" }, @@ -2450,6 +2349,7 @@ } }, { + "title": "GroupAudioAsset", "description": "Audio asset in group", "allOf": [ { @@ -2529,6 +2429,7 @@ } }, { + "title": "GroupTextAsset", "description": "Text asset in group", "allOf": [ { @@ -2581,6 +2482,7 @@ } }, { + "title": "GroupMarkdownAsset", "description": "Markdown asset in group", "allOf": [ { @@ -2607,6 +2509,7 @@ } }, { + "title": "GroupHtmlAsset", "description": "HTML asset in group", "allOf": [ { @@ -2656,6 +2559,7 @@ } }, { + "title": "GroupCssAsset", "description": "CSS asset in group", "allOf": [ { @@ -2682,6 +2586,7 @@ } }, { + "title": "GroupJavaScriptAsset", "description": "JavaScript asset in group", "allOf": [ { @@ -2733,6 +2638,7 @@ } }, { + "title": "GroupVastAsset", "description": "VAST asset in group", "allOf": [ { @@ -2765,6 +2671,7 @@ } }, { + "title": "GroupDaastAsset", "description": "DAAST asset in group", "allOf": [ { @@ -2793,6 +2700,7 @@ } }, { + "title": "GroupUrlAsset", "description": "URL asset in group", "allOf": [ { @@ -2854,6 +2762,7 @@ } }, { + "title": "GroupWebhookAsset", "description": "Webhook asset in group", "allOf": [ { @@ -3069,15 +2978,15 @@ "type": "array", "description": "Array of format IDs this format accepts as input creative manifests. When present, indicates this format can take existing creatives in these formats as input. Omit for formats that work from raw assets (images, text, etc.) rather than existing creatives.", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -3119,15 +3028,15 @@ "type": "array", "description": "Array of format IDs that this format can produce as output. When present, indicates this format can build creatives in these output formats (e.g., a multi-publisher template format might produce standard display formats across many publishers). Omit for formats that produce a single fixed output (the format itself).", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -3170,7 +3079,7 @@ "description": "Optional standard visual card (300x400px) for displaying this format in user interfaces. Can be rendered via preview_creative or pre-generated.", "properties": { "format_id": { - "title": "Format ID", + "title": "Format Reference (Structured Object)", "description": "Creative format defining the card layout (typically format_card_standard)", "x-entity": "creative_format", "type": "object", @@ -3178,7 +3087,7 @@ "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -3259,19 +3168,7 @@ "type": "array", "description": "Disclosure positions this format can render. Buyers use this to determine whether a format can satisfy their compliance requirements before submitting a creative. When omitted, the format makes no disclosure rendering guarantees \u2014 creative agents SHOULD treat this as incompatible with briefs that require specific disclosure positions. Values correspond to positions on creative-brief.json required_disclosures.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3283,19 +3180,7 @@ "type": "object", "properties": { "position": { - "title": "Disclosure Position", - "description": "The disclosure position", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "persistence": { "type": "array", @@ -3332,7 +3217,7 @@ "description": "Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.", "properties": { "format_id": { - "title": "Format ID", + "title": "Format Reference (Structured Object)", "description": "Creative format defining the detailed card layout (typically format_card_detailed)", "x-entity": "creative_format", "type": "object", @@ -3340,7 +3225,7 @@ "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -4028,6 +3913,97 @@ "asset_type", "required" ] + }, + "DimensionUnit": { + "title": "Dimension Unit", + "description": "Unit of measurement for width/height values. Defaults to 'px' when absent. Print formats use 'inches' or 'cm'.", + "type": "string", + "enum": [ + "px", + "dp", + "inches", + "cm", + "mm", + "pt" + ] + }, + "FrameRateType": { + "title": "Frame Rate Type", + "description": "Required frame rate type. Broadcast and SSAI require constant frame rate for seamless splicing.", + "type": "string", + "enum": [ + "constant", + "variable" + ], + "enumDescriptions": { + "constant": "Constant frame rate (CFR) \u2014 each frame occupies an identical time interval", + "variable": "Variable frame rate (VFR) \u2014 frame intervals may differ" + } + }, + "ScanType": { + "title": "Scan Type", + "description": "Required scan type. Modern delivery requires progressive scan.", + "type": "string", + "enum": [ + "progressive", + "interlaced" + ], + "enumDescriptions": { + "progressive": "All lines of each frame are drawn in sequence", + "interlaced": "Alternating lines drawn in two passes per frame (legacy broadcast)" + } + }, + "GOPType": { + "title": "GOP Type", + "description": "Required GOP structure. SSAI and broadcast require closed GOPs for clean splice points.", + "type": "string", + "enum": [ + "closed", + "open" + ], + "enumDescriptions": { + "closed": "Each GOP is independently decodable \u2014 required for SSAI and broadcast splicing", + "open": "GOPs may reference frames from adjacent GOPs \u2014 not suitable for splicing" + } + }, + "MoovAtomPosition": { + "title": "Moov Atom Position", + "description": "Required moov atom position in MP4 container. 'start' enables progressive download without buffering the entire file.", + "type": "string", + "enum": [ + "start", + "end" + ], + "enumDescriptions": { + "start": "moov atom at beginning of file \u2014 enables progressive download and streaming delivery", + "end": "moov atom at end of file \u2014 requires full download before playback can begin" + } + }, + "AudioChannelLayout": { + "title": "Audio Channel Layout", + "description": "Audio channel configuration for audio and video assets", + "type": "string", + "enum": [ + "mono", + "stereo", + "5.1", + "7.1" + ] + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] } }, "definitions": { @@ -4093,7 +4069,7 @@ } }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.552Z", + "generatedAt": "2026-04-28T12:32:22.903Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/list-creatives-request.json b/schemas/cache/bundled/creative/list-creatives-request.json index 6941ec31..ee2dc9b9 100644 --- a/schemas/cache/bundled/creative/list-creatives-request.json +++ b/schemas/cache/bundled/creative/list-creatives-request.json @@ -278,15 +278,15 @@ "type": "array", "description": "Filter by structured format IDs. Returns creatives that match any of these formats.", "items": { - "title": "Format ID", - "description": "Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.", + "title": "Format Reference (Structured Object)", + "description": "A JSON object \u2014 never a plain string \u2014 that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {\"agent_url\": \"https://creative.adcontextprotocol.org\", \"id\": \"display_300x250\"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -680,7 +680,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-22T09:42:38.554Z", + "generatedAt": "2026-04-28T12:32:22.904Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/list-creatives-response.json b/schemas/cache/bundled/creative/list-creatives-response.json index 92e26c29..1a610d78 100644 --- a/schemas/cache/bundled/creative/list-creatives-response.json +++ b/schemas/cache/bundled/creative/list-creatives-response.json @@ -219,13 +219,19 @@ "x-entity": "operator" }, "billing": { + "title": "Billing Party", + "description": "Who is invoiced on this account. See billing_entity for the invoiced party's business details.", "type": "string", "enum": [ "operator", "agent", "advertiser" ], - "description": "Who is invoiced on this account. operator: seller invoices the operator (agency or brand buying direct). agent: agent consolidates billing. advertiser: seller invoices the advertiser directly, even when a different operator places orders on their behalf. See billing_entity for the invoiced party's business details." + "enumDescriptions": { + "operator": "Seller invoices the operator \u2014 agency or brand buying direct", + "agent": "Agent consolidates billing across brands and is invoiced by the seller", + "advertiser": "Seller invoices the advertiser directly, even when a different operator places orders on their behalf" + } }, "billing_entity": { "title": "Business Entity", @@ -440,6 +446,8 @@ "description": "Identifier for the rate card applied to this account" }, "payment_terms": { + "title": "Payment Terms", + "description": "Payment terms agreed for this account. Binding for all invoices when the account is active.", "type": "string", "enum": [ "net_15", @@ -449,7 +457,14 @@ "net_90", "prepay" ], - "description": "Payment terms agreed for this account. Binding for all invoices when the account is active." + "enumDescriptions": { + "net_15": "Payment due within 15 days of invoice", + "net_30": "Payment due within 30 days of invoice", + "net_45": "Payment due within 45 days of invoice", + "net_60": "Payment due within 60 days of invoice", + "net_90": "Payment due within 90 days of invoice", + "prepay": "Payment required before campaign delivery" + } }, "credit_limit": { "type": "object", @@ -494,6 +509,8 @@ "additionalProperties": true }, "account_scope": { + "title": "Account Scope", + "description": "How the seller scoped a billing account relative to the operator and brand dimensions.", "type": "string", "enum": [ "operator", @@ -501,7 +518,12 @@ "operator_brand", "agent" ], - "description": "How the seller scoped this account. operator: shared across all brands for this operator. brand: shared across all operators for this brand. operator_brand: dedicated to a specific operator+brand combination. agent: the agent's default account with no brand or operator association." + "enumDescriptions": { + "operator": "Account is shared across all brands for this operator", + "brand": "Account is shared across all operators for this brand", + "operator_brand": "Account is dedicated to a specific operator+brand combination", + "agent": "The agent's default account with no brand or operator association" + } }, "governance_agents": { "type": "array", @@ -762,7 +784,7 @@ "description": "Human-readable creative name" }, "format_id": { - "title": "Format ID", + "title": "Format Reference (Structured Object)", "description": "Format identifier specifying which format this creative conforms to", "x-entity": "creative_format", "type": "object", @@ -770,7 +792,7 @@ "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -882,31 +904,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1042,19 +1040,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1065,19 +1051,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1222,20 +1196,30 @@ "description": "Frame rate as string to preserve precision (e.g., '23.976', '29.97', '30')" }, "frame_rate_type": { + "title": "Frame Rate Type", + "description": "Whether the video uses a constant or variable frame rate. Broadcast and SSAI contexts require constant frame rate for seamless splicing.", "type": "string", "enum": [ "constant", "variable" ], - "description": "Whether the video uses constant (CFR) or variable (VFR) frame rate" + "enumDescriptions": { + "constant": "Constant frame rate (CFR) \u2014 each frame occupies an identical time interval", + "variable": "Variable frame rate (VFR) \u2014 frame intervals may differ" + } }, "scan_type": { + "title": "Scan Type", + "description": "Video scan method. Modern digital delivery requires progressive scan; interlaced is retained for broadcast legacy content.", "type": "string", "enum": [ "progressive", "interlaced" ], - "description": "Scan type of the video" + "enumDescriptions": { + "progressive": "All lines of each frame are drawn in sequence", + "interlaced": "Alternating lines drawn in two passes per frame (legacy broadcast)" + } }, "color_space": { "type": "string", @@ -1282,20 +1266,30 @@ "description": "GOP/keyframe interval in seconds" }, "gop_type": { + "title": "GOP Type", + "description": "Group of Pictures structure. SSAI and broadcast require closed GOPs for clean splice points; open GOPs may produce artifacts at ad boundaries.", "type": "string", "enum": [ "closed", "open" ], - "description": "GOP structure type" + "enumDescriptions": { + "closed": "Each GOP is independently decodable \u2014 required for SSAI and broadcast splicing", + "open": "GOPs may reference frames from adjacent GOPs \u2014 not suitable for splicing" + } }, "moov_atom_position": { + "title": "Moov Atom Position", + "description": "Position of the moov atom in an MP4 container. 'start' enables progressive download without buffering the entire file; required for streaming ad delivery.", "type": "string", "enum": [ "start", "end" ], - "description": "Position of moov atom in MP4 container" + "enumDescriptions": { + "start": "moov atom at beginning of file \u2014 enables progressive download and streaming delivery", + "end": "moov atom at end of file \u2014 requires full download before playback can begin" + } }, "has_audio": { "type": "boolean", @@ -1310,14 +1304,7 @@ "description": "Audio sampling rate in Hz (e.g., 44100, 48000)" }, "audio_channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Audio channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "audio_bit_depth": { "type": "integer", @@ -1365,31 +1352,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1525,19 +1488,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1548,19 +1499,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1690,14 +1629,7 @@ "description": "Sampling rate in Hz (e.g., 44100, 48000, 96000)" }, "channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "bit_depth": { "type": "integer", @@ -1733,31 +1665,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1893,19 +1801,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1916,19 +1812,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2110,31 +1994,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2270,19 +2130,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2293,19 +2141,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2458,31 +2294,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2618,19 +2430,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2641,19 +2441,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -2778,31 +2566,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -2938,19 +2702,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -2961,19 +2713,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3110,31 +2850,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3270,19 +2986,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3293,19 +2997,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3448,31 +3140,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -3608,19 +3276,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -3631,19 +3287,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -3770,151 +3414,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -3929,151 +3429,7 @@ "items": { "anyOf": [ { - "title": "Universal Macro", - "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", - "type": "string", - "enum": [ - "MEDIA_BUY_ID", - "PACKAGE_ID", - "CREATIVE_ID", - "CACHEBUSTER", - "TIMESTAMP", - "CLICK_URL", - "GDPR", - "GDPR_CONSENT", - "US_PRIVACY", - "GPP_STRING", - "GPP_SID", - "IP_ADDRESS", - "LIMIT_AD_TRACKING", - "DEVICE_TYPE", - "OS", - "OS_VERSION", - "DEVICE_MAKE", - "DEVICE_MODEL", - "USER_AGENT", - "APP_BUNDLE", - "APP_NAME", - "COUNTRY", - "REGION", - "CITY", - "ZIP", - "DMA", - "LAT", - "LONG", - "DEVICE_ID", - "DEVICE_ID_TYPE", - "DOMAIN", - "PAGE_URL", - "REFERRER", - "KEYWORDS", - "PLACEMENT_ID", - "FOLD_POSITION", - "AD_WIDTH", - "AD_HEIGHT", - "VIDEO_ID", - "VIDEO_TITLE", - "VIDEO_DURATION", - "VIDEO_CATEGORY", - "CONTENT_GENRE", - "CONTENT_RATING", - "PLAYER_WIDTH", - "PLAYER_HEIGHT", - "POD_POSITION", - "POD_SIZE", - "AD_BREAK_ID", - "STATION_ID", - "COLLECTION_NAME", - "INSTALLMENT_ID", - "AUDIO_DURATION", - "TMPX", - "AXEM", - "CATALOG_ID", - "SKU", - "GTIN", - "OFFERING_ID", - "JOB_ID", - "HOTEL_ID", - "FLIGHT_ID", - "VEHICLE_ID", - "LISTING_ID", - "STORE_ID", - "PROGRAM_ID", - "DESTINATION_ID", - "CREATIVE_VARIANT_ID", - "APP_ITEM_ID" - ], - "enumDescriptions": { - "MEDIA_BUY_ID": "AdCP media buy identifier", - "PACKAGE_ID": "AdCP package identifier", - "CREATIVE_ID": "AdCP creative identifier", - "CACHEBUSTER": "Random number to prevent caching", - "TIMESTAMP": "Unix timestamp in milliseconds", - "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", - "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", - "GDPR_CONSENT": "IAB TCF 2.0 consent string", - "US_PRIVACY": "US Privacy (CCPA) string", - "GPP_STRING": "Global Privacy Platform consent string", - "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", - "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", - "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", - "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", - "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", - "OS_VERSION": "OS version number", - "DEVICE_MAKE": "Device manufacturer", - "DEVICE_MODEL": "Device model identifier", - "USER_AGENT": "Full user agent string", - "APP_BUNDLE": "App bundle ID (domain or numeric)", - "APP_NAME": "Human-readable app name", - "COUNTRY": "ISO 3166-1 alpha-2 country code", - "REGION": "State/province/region code", - "CITY": "City name", - "ZIP": "Postal code", - "DMA": "Nielsen DMA code (US TV markets)", - "LAT": "Latitude coordinate", - "LONG": "Longitude coordinate", - "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", - "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", - "DOMAIN": "Domain where ad is shown", - "PAGE_URL": "Full page URL (encoded)", - "REFERRER": "HTTP referrer URL", - "KEYWORDS": "Page keywords (comma-separated)", - "PLACEMENT_ID": "Global Placement ID (IAB standard)", - "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", - "AD_WIDTH": "Ad slot width in pixels", - "AD_HEIGHT": "Ad slot height in pixels", - "VIDEO_ID": "Content video identifier", - "VIDEO_TITLE": "Content video title", - "VIDEO_DURATION": "Content duration in seconds", - "VIDEO_CATEGORY": "IAB content category", - "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", - "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", - "PLAYER_WIDTH": "Video player width in pixels", - "PLAYER_HEIGHT": "Video player height in pixels", - "POD_POSITION": "Position within ad break", - "POD_SIZE": "Total ads in the ad break", - "AD_BREAK_ID": "Unique ad break identifier", - "STATION_ID": "Radio station or podcast identifier", - "COLLECTION_NAME": "Program or collection name", - "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", - "AUDIO_DURATION": "Audio content duration in seconds", - "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", - "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", - "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", - "SKU": "Product SKU identifier for the catalog item being rendered", - "GTIN": "Global Trade Item Number for the catalog item being rendered", - "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", - "JOB_ID": "Job posting identifier for the catalog item being rendered", - "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", - "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", - "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", - "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", - "STORE_ID": "Store location identifier for the catalog item being rendered", - "PROGRAM_ID": "Education program identifier for the catalog item being rendered", - "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", - "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", - "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" - } + "$ref": "#/$defs/UniversalMacro" }, { "type": "string", @@ -4127,31 +3483,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4287,19 +3619,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4310,19 +3630,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4438,31 +3746,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4598,19 +3882,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4621,19 +3893,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -4797,31 +4057,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -4957,19 +4193,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -4980,19 +4204,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -5287,19 +4499,7 @@ "description": "The disclosure text that must appear in the creative" }, "position": { - "title": "Disclosure Position", - "description": "Where the disclosure should appear within the creative. prominent: clearly visible in the main creative area; footer: at the bottom of visual creatives; audio: spoken in audio/video creatives; subtitle: displayed in the subtitle or closed-caption track; overlay: superimposed on video content; end_card: displayed on video end card; pre_roll: spoken or displayed before main content; companion: in companion ad unit alongside primary creative", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "jurisdictions": { "type": "array", @@ -5324,19 +4524,7 @@ "description": "Language of the disclosure text as a BCP 47 language tag (e.g., 'en', 'fr-CA', 'es'). When omitted, the disclosure is assumed to match the creative's language." }, "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display. When omitted, the creative agent should use the most restrictive persistence mode supported by the target format.", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" } }, "required": [ @@ -5996,13 +5184,19 @@ "additionalProperties": true }, "snapshot_unavailable_reason": { - "type": "string", + "title": "Snapshot Unavailable Reason", "description": "Machine-readable reason the snapshot is omitted. Present only when include_snapshot was true and snapshot data is unavailable for this creative.", + "type": "string", "enum": [ "SNAPSHOT_UNSUPPORTED", "SNAPSHOT_TEMPORARILY_UNAVAILABLE", "SNAPSHOT_PERMISSION_DENIED" - ] + ], + "enumDescriptions": { + "SNAPSHOT_UNSUPPORTED": "The seller platform does not support delivery snapshots for this entity", + "SNAPSHOT_TEMPORARILY_UNAVAILABLE": "Snapshot data exists but is temporarily unavailable (e.g., cache miss, pipeline lag)", + "SNAPSHOT_PERMISSION_DENIED": "The caller lacks permission to view snapshot data for this entity" + } }, "items": { "type": "array", @@ -6558,8 +5752,225 @@ } } ], + "$defs": { + "DigitalSourceType": { + "title": "Digital Source Type", + "description": "IPTC-aligned classification of AI involvement in producing this content", + "type": "string", + "enum": [ + "digital_capture", + "digital_creation", + "trained_algorithmic_media", + "composite_with_trained_algorithmic_media", + "algorithmic_media", + "composite_capture", + "composite_synthetic", + "human_edits", + "data_driven_media" + ], + "enumDescriptions": { + "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", + "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", + "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", + "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", + "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", + "composite_capture": "Multiple digital captures composited together without AI", + "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", + "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", + "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" + } + }, + "DisclosurePersistence": { + "title": "Disclosure Persistence", + "description": "How long the disclosure must persist during content playback or display", + "type": "string", + "enum": [ + "continuous", + "initial", + "flexible" + ], + "enumDescriptions": { + "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", + "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", + "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" + } + }, + "DisclosurePosition": { + "title": "Disclosure Position", + "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", + "type": "string", + "enum": [ + "prominent", + "footer", + "audio", + "subtitle", + "overlay", + "end_card", + "pre_roll", + "companion" + ] + }, + "AudioChannelLayout": { + "title": "Audio Channel Layout", + "description": "Audio channel configuration", + "type": "string", + "enum": [ + "mono", + "stereo", + "5.1", + "7.1" + ] + }, + "UniversalMacro": { + "title": "Universal Macro", + "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.", + "type": "string", + "enum": [ + "MEDIA_BUY_ID", + "PACKAGE_ID", + "CREATIVE_ID", + "CACHEBUSTER", + "TIMESTAMP", + "CLICK_URL", + "GDPR", + "GDPR_CONSENT", + "US_PRIVACY", + "GPP_STRING", + "GPP_SID", + "IP_ADDRESS", + "LIMIT_AD_TRACKING", + "DEVICE_TYPE", + "OS", + "OS_VERSION", + "DEVICE_MAKE", + "DEVICE_MODEL", + "USER_AGENT", + "APP_BUNDLE", + "APP_NAME", + "COUNTRY", + "REGION", + "CITY", + "ZIP", + "DMA", + "LAT", + "LONG", + "DEVICE_ID", + "DEVICE_ID_TYPE", + "DOMAIN", + "PAGE_URL", + "REFERRER", + "KEYWORDS", + "PLACEMENT_ID", + "FOLD_POSITION", + "AD_WIDTH", + "AD_HEIGHT", + "VIDEO_ID", + "VIDEO_TITLE", + "VIDEO_DURATION", + "VIDEO_CATEGORY", + "CONTENT_GENRE", + "CONTENT_RATING", + "PLAYER_WIDTH", + "PLAYER_HEIGHT", + "POD_POSITION", + "POD_SIZE", + "AD_BREAK_ID", + "STATION_ID", + "COLLECTION_NAME", + "INSTALLMENT_ID", + "AUDIO_DURATION", + "TMPX", + "AXEM", + "CATALOG_ID", + "SKU", + "GTIN", + "OFFERING_ID", + "JOB_ID", + "HOTEL_ID", + "FLIGHT_ID", + "VEHICLE_ID", + "LISTING_ID", + "STORE_ID", + "PROGRAM_ID", + "DESTINATION_ID", + "CREATIVE_VARIANT_ID", + "APP_ITEM_ID" + ], + "enumDescriptions": { + "MEDIA_BUY_ID": "AdCP media buy identifier", + "PACKAGE_ID": "AdCP package identifier", + "CREATIVE_ID": "AdCP creative identifier", + "CACHEBUSTER": "Random number to prevent caching", + "TIMESTAMP": "Unix timestamp in milliseconds", + "CLICK_URL": "Publisher's click tracking URL (auto-inserted by sales agent)", + "GDPR": "GDPR applicability flag (1=applies, 0=doesn't apply)", + "GDPR_CONSENT": "IAB TCF 2.0 consent string", + "US_PRIVACY": "US Privacy (CCPA) string", + "GPP_STRING": "Global Privacy Platform consent string", + "GPP_SID": "GPP Section ID(s) indicating applicable privacy framework sections", + "IP_ADDRESS": "User IP address (often masked for privacy, may return empty)", + "LIMIT_AD_TRACKING": "Limit Ad Tracking enabled (1=limited, 0=allowed)", + "DEVICE_TYPE": "Device category (mobile, tablet, desktop, ctv, dooh)", + "OS": "Operating system (iOS, Android, tvOS, Roku, etc.)", + "OS_VERSION": "OS version number", + "DEVICE_MAKE": "Device manufacturer", + "DEVICE_MODEL": "Device model identifier", + "USER_AGENT": "Full user agent string", + "APP_BUNDLE": "App bundle ID (domain or numeric)", + "APP_NAME": "Human-readable app name", + "COUNTRY": "ISO 3166-1 alpha-2 country code", + "REGION": "State/province/region code", + "CITY": "City name", + "ZIP": "Postal code", + "DMA": "Nielsen DMA code (US TV markets)", + "LAT": "Latitude coordinate", + "LONG": "Longitude coordinate", + "DEVICE_ID": "Mobile advertising ID (IDFA/AAID)", + "DEVICE_ID_TYPE": "Type of device ID (idfa, aaid)", + "DOMAIN": "Domain where ad is shown", + "PAGE_URL": "Full page URL (encoded)", + "REFERRER": "HTTP referrer URL", + "KEYWORDS": "Page keywords (comma-separated)", + "PLACEMENT_ID": "Global Placement ID (IAB standard)", + "FOLD_POSITION": "Position relative to fold (above_fold, below_fold)", + "AD_WIDTH": "Ad slot width in pixels", + "AD_HEIGHT": "Ad slot height in pixels", + "VIDEO_ID": "Content video identifier", + "VIDEO_TITLE": "Content video title", + "VIDEO_DURATION": "Content duration in seconds", + "VIDEO_CATEGORY": "IAB content category", + "CONTENT_GENRE": "Content genre (news, sports, comedy, etc.)", + "CONTENT_RATING": "Content rating (G, PG, TV-14, etc.)", + "PLAYER_WIDTH": "Video player width in pixels", + "PLAYER_HEIGHT": "Video player height in pixels", + "POD_POSITION": "Position within ad break", + "POD_SIZE": "Total ads in the ad break", + "AD_BREAK_ID": "Unique ad break identifier", + "STATION_ID": "Radio station or podcast identifier", + "COLLECTION_NAME": "Program or collection name", + "INSTALLMENT_ID": "Installment identifier (podcast episode, print issue, etc.)", + "AUDIO_DURATION": "Audio content duration in seconds", + "TMPX": "TMP exposure token \u2014 HPKE-encrypted identity tokens for per-user exposure tracking. Produced by Identity Match, substituted into creative tracking URLs, received by the buyer's impression pixel.", + "AXEM": "AXE contextual metadata (encoded blob). Legacy \u2014 in TMP, use Offer macros for dynamic creative values and TMPX for exposure tracking.", + "CATALOG_ID": "Buyer-defined catalog identifier from the catalog's catalog_id field", + "SKU": "Product SKU identifier for the catalog item being rendered", + "GTIN": "Global Trade Item Number for the catalog item being rendered", + "OFFERING_ID": "AdCP offering identifier for the catalog item being rendered", + "JOB_ID": "Job posting identifier for the catalog item being rendered", + "HOTEL_ID": "Hotel property identifier for the catalog item being rendered", + "FLIGHT_ID": "Flight route identifier for the catalog item being rendered", + "VEHICLE_ID": "Vehicle listing identifier for the catalog item being rendered", + "LISTING_ID": "Real estate listing identifier for the catalog item being rendered", + "STORE_ID": "Store location identifier for the catalog item being rendered", + "PROGRAM_ID": "Education program identifier for the catalog item being rendered", + "DESTINATION_ID": "Travel destination identifier for the catalog item being rendered", + "CREATIVE_VARIANT_ID": "Seller-assigned creative variant identifier, passed through at serve time", + "APP_ITEM_ID": "Mobile app identifier for the catalog item being rendered" + } + } + }, "_bundled": { - "generatedAt": "2026-04-22T09:42:38.559Z", + "generatedAt": "2026-04-28T12:32:22.911Z", "note": "This is a bundled schema with all $ref resolved inline. For the modular version with references, use the parent directory." } } \ No newline at end of file diff --git a/schemas/cache/bundled/creative/preview-creative-request.json b/schemas/cache/bundled/creative/preview-creative-request.json index 03820596..97ae99a1 100644 --- a/schemas/cache/bundled/creative/preview-creative-request.json +++ b/schemas/cache/bundled/creative/preview-creative-request.json @@ -25,15 +25,15 @@ "type": "object", "properties": { "format_id": { - "title": "Format ID", - "description": "Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).", + "title": "Format Reference (Structured Object)", + "description": "Always a structured object {agent_url, id} \u2014 never a plain string. Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250}).", "x-entity": "creative_format", "type": "object", "properties": { "agent_url": { "type": "string", "format": "uri", - "description": "URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)" + "description": "URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization." }, "id": { "type": "string", @@ -116,31 +116,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -276,19 +252,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -299,19 +263,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -456,20 +408,10 @@ "description": "Frame rate as string to preserve precision (e.g., '23.976', '29.97', '30')" }, "frame_rate_type": { - "type": "string", - "enum": [ - "constant", - "variable" - ], - "description": "Whether the video uses constant (CFR) or variable (VFR) frame rate" + "$ref": "#/$defs/FrameRateType" }, "scan_type": { - "type": "string", - "enum": [ - "progressive", - "interlaced" - ], - "description": "Scan type of the video" + "$ref": "#/$defs/ScanType" }, "color_space": { "type": "string", @@ -516,20 +458,10 @@ "description": "GOP/keyframe interval in seconds" }, "gop_type": { - "type": "string", - "enum": [ - "closed", - "open" - ], - "description": "GOP structure type" + "$ref": "#/$defs/GOPType" }, "moov_atom_position": { - "type": "string", - "enum": [ - "start", - "end" - ], - "description": "Position of moov atom in MP4 container" + "$ref": "#/$defs/MoovAtomPosition" }, "has_audio": { "type": "boolean", @@ -544,14 +476,7 @@ "description": "Audio sampling rate in Hz (e.g., 44100, 48000)" }, "audio_channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Audio channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "audio_bit_depth": { "type": "integer", @@ -599,31 +524,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -759,19 +660,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -782,19 +671,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -924,14 +801,7 @@ "description": "Sampling rate in Hz (e.g., 44100, 48000, 96000)" }, "channels": { - "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], - "description": "Channel configuration" + "$ref": "#/$defs/AudioChannelLayout" }, "bit_depth": { "type": "integer", @@ -967,31 +837,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1127,19 +973,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1150,19 +984,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1263,16 +1085,7 @@ "description": "Discriminator identifying this as a VAST asset. See /schemas/creative/asset-types for the registry." }, "vast_version": { - "title": "VAST Version", - "description": "VAST specification version", - "type": "string", - "enum": [ - "2.0", - "3.0", - "4.0", - "4.1", - "4.2" - ] + "$ref": "#/$defs/VASTVersion" }, "vpaid_enabled": { "type": "boolean", @@ -1286,43 +1099,7 @@ "tracking_events": { "type": "array", "items": { - "title": "VAST Tracking Event", - "description": "Tracking events for video ads. Includes IAB VAST 4.2 TrackingEvents, plus flattened representations of Impression, Error, VideoClicks, and ViewableImpression elements. fullscreen/exitFullscreen retained for VAST 2.x/3.x compatibility. measurableImpression is an AdCP extension for MRC measurability signals.", - "type": "string", - "enum": [ - "impression", - "creativeView", - "loaded", - "start", - "firstQuartile", - "midpoint", - "thirdQuartile", - "complete", - "mute", - "unmute", - "pause", - "resume", - "rewind", - "skip", - "playerExpand", - "playerCollapse", - "fullscreen", - "exitFullscreen", - "progress", - "notUsed", - "otherAdInteraction", - "interactiveStart", - "clickTracking", - "customClick", - "close", - "closeLinear", - "error", - "viewable", - "notViewable", - "viewUndetermined", - "measurableImpression", - "viewableImpression" - ] + "$ref": "#/$defs/VASTTrackingEvent" }, "description": "Tracking events supported by this VAST tag" }, @@ -1344,31 +1121,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1504,19 +1257,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1527,19 +1268,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1692,31 +1421,7 @@ "type": "object", "properties": { "digital_source_type": { - "title": "Digital Source Type", - "description": "IPTC-aligned classification of AI involvement in producing this content", - "type": "string", - "enum": [ - "digital_capture", - "digital_creation", - "trained_algorithmic_media", - "composite_with_trained_algorithmic_media", - "algorithmic_media", - "composite_capture", - "composite_synthetic", - "human_edits", - "data_driven_media" - ], - "enumDescriptions": { - "digital_capture": "Captured by a digital device (camera, scanner, screen recording) with no AI involvement", - "digital_creation": "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation", - "trained_algorithmic_media": "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)", - "composite_with_trained_algorithmic_media": "Human-created content combined with AI-generated elements (e.g., photo with AI background)", - "algorithmic_media": "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)", - "composite_capture": "Multiple digital captures composited together without AI", - "composite_synthetic": "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)", - "human_edits": "Content augmented, corrected, or enhanced by humans using non-generative tools", - "data_driven_media": "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)" - } + "$ref": "#/$defs/DigitalSourceType" }, "ai_tool": { "type": "object", @@ -1852,19 +1557,7 @@ "minProperties": 1, "properties": { "persistence": { - "title": "Disclosure Persistence", - "description": "How long the disclosure must persist during content playback or display", - "type": "string", - "enum": [ - "continuous", - "initial", - "flexible" - ], - "enumDescriptions": { - "continuous": "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.", - "initial": "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.", - "flexible": "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion" - } + "$ref": "#/$defs/DisclosurePersistence" }, "min_duration_ms": { "type": "integer", @@ -1875,19 +1568,7 @@ "type": "array", "description": "Preferred disclosure positions in priority order. The first position a format supports should be used.", "items": { - "title": "Disclosure Position", - "description": "Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.", - "type": "string", - "enum": [ - "prominent", - "footer", - "audio", - "subtitle", - "overlay", - "end_card", - "pre_roll", - "companion" - ] + "$ref": "#/$defs/DisclosurePosition" }, "minItems": 1, "uniqueItems": true @@ -1993,14 +1674,7 @@ "description": "URL reference. May be a plain URI or an RFC 6570 URI template carrying AdCP universal macros (e.g., `{SKU}`, `{MEDIA_BUY_ID}`). Buyers MUST NOT pre-encode macro braces at sync time; the ad server URL-encodes substituted values at impression time. See docs/creative/universal-macros.mdx." }, "url_type": { - "title": "URL Asset Type", - "description": "Type of URL asset: 'clickthrough' for user click destination (landing page), 'tracker_pixel' for impression/event tracking via HTTP request (fires GET, expects pixel/204 response), 'tracker_script' for measurement SDKs that must load as