diff --git a/README.md b/README.md index 4cfc73973..7b855b356 100644 --- a/README.md +++ b/README.md @@ -613,6 +613,41 @@ serve(MySeller(), name="my-seller") **Principal contract.** `caller_identity` MUST be a stable, globally-unique identifier per tenant — an opaque buyer ID, not an email or display name. Email reuse after account deletion would cause cross-principal cache collisions. The value is logged at DEBUG (prefix-truncated) and keyed on in the cache; treat it as you would any user-scoping identifier. +### AdCP 3.0.0-rc.4 migration + +**`plan.budget.authority_level` removed.** The single enum (`agent_full` / `agent_limited` / `human_required`) is replaced by two orthogonal fields on `plan.budget`, plus a new top-level flag on `plan`: + +| Old (removed) | New | +|---|---| +| `budget.authority_level: agent_full` | `budget.reallocation_unlimited: true` | +| `budget.authority_level: agent_limited` | `budget.reallocation_threshold: ` (in `budget.currency`) | +| `budget.authority_level: human_required` | Set `plan.human_review_required: true` **and** `budget.reallocation_threshold: 0` | + +`reallocation_threshold` and `reallocation_unlimited` are mutually exclusive — pick one. `plan.human_review_required` is a separate field governing decisions that affect data subjects (targeting, creative, delivery) under GDPR Art 22 / EU AI Act Annex III; set it independently from the budget reallocation autonomy. + +```python +# Before (rc.3 and earlier) +plan = SyncPlansRequest(plans=[{ + "plan_id": "...", + "budget": {"total": 100000, "currency": "USD", "authority_level": "agent_limited"}, +}]) + +# After (rc.4+) +plan = SyncPlansRequest(plans=[{ + "plan_id": "...", + "budget": { + "total": 100000, + "currency": "USD", + "reallocation_threshold": 5000, # agent may reallocate up to $5K per change + }, + "human_review_required": False, # defaults to False; set True for GDPR Art 22 gating +}]) +``` + +Any hand-coded `plan.budget` payload using `authority_level` will fail Pydantic validation against the rc.4 schema with `extra fields not permitted`. The SDK itself has no code references to the old enum; downstream consumers need to update their payloads. + +**`update_rights` task added.** Buyers can now modify an existing rights acquisition without re-acquiring. See `client.update_rights(request)` or the MCP/A2A `update_rights` tool. + ## Available Tools All AdCP tools with full type safety: diff --git a/schemas/cache/a2ui/bound-value.json b/schemas/cache/a2ui/bound-value.json index 94490eaad..3833a4c50 100644 --- a/schemas/cache/a2ui/bound-value.json +++ b/schemas/cache/a2ui/bound-value.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/a2ui/bound-value.json", "title": "A2UI Bound Value", "description": "A value that can be a literal or bound to a path in the data model", "oneOf": [ @@ -12,9 +13,7 @@ "description": "Static string value" } }, - "required": [ - "literalString" - ], + "required": ["literalString"], "additionalProperties": false }, { @@ -26,9 +25,7 @@ "description": "Static number value" } }, - "required": [ - "literalNumber" - ], + "required": ["literalNumber"], "additionalProperties": false }, { @@ -40,9 +37,7 @@ "description": "Static boolean value" } }, - "required": [ - "literalBoolean" - ], + "required": ["literalBoolean"], "additionalProperties": false }, { @@ -54,9 +49,7 @@ "description": "JSON pointer path to value in data model (e.g., '/products/0/title')" } }, - "required": [ - "path" - ], + "required": ["path"], "additionalProperties": false }, { @@ -70,11 +63,8 @@ "type": "string" } }, - "required": [ - "literalString", - "path" - ], + "required": ["literalString", "path"], "additionalProperties": false } ] -} \ No newline at end of file +} diff --git a/schemas/cache/a2ui/component.json b/schemas/cache/a2ui/component.json index 6ddc3b14f..2fdd0d3af 100644 --- a/schemas/cache/a2ui/component.json +++ b/schemas/cache/a2ui/component.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/a2ui/component.json", "title": "A2UI Component", "description": "A component in an A2UI surface", "type": "object", @@ -23,9 +24,6 @@ } } }, - "required": [ - "id", - "component" - ], + "required": ["id", "component"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/a2ui/si-catalog.json b/schemas/cache/a2ui/si-catalog.json index 9596f806a..c38b771d5 100644 --- a/schemas/cache/a2ui/si-catalog.json +++ b/schemas/cache/a2ui/si-catalog.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/a2ui/si-catalog.json", "title": "SI Component Catalog", "description": "A2UI component catalog for Sponsored Intelligence", "definitions": { @@ -8,30 +9,23 @@ "description": "Text display component", "properties": { "text": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Text content to display" }, "variant": { "type": "string", - "enum": [ - "body", - "heading", - "caption", - "label" - ], + "enum": ["body", "heading", "caption", "label"], "default": "body" } }, - "required": [ - "text" - ] + "required": ["text"] }, "Button": { "type": "object", "description": "Interactive button component", "properties": { "label": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Button label text" }, "action": { @@ -46,42 +40,33 @@ "type": "object", "description": "Context data to include with action", "additionalProperties": { - "$ref": "bound-value.json" + "$ref": "/schemas/latest/a2ui/bound-value.json" } } }, - "required": [ - "name" - ] + "required": ["name"] }, "variant": { "type": "string", - "enum": [ - "primary", - "secondary", - "text" - ], + "enum": ["primary", "secondary", "text"], "default": "primary" }, "disabled": { - "$ref": "bound-value.json" + "$ref": "/schemas/latest/a2ui/bound-value.json" } }, - "required": [ - "label", - "action" - ] + "required": ["label", "action"] }, "Link": { "type": "object", "description": "Hyperlink component", "properties": { "label": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Link text" }, "url": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "URL to navigate to" }, "external": { @@ -90,21 +75,18 @@ "default": true } }, - "required": [ - "label", - "url" - ] + "required": ["label", "url"] }, "Image": { "type": "object", "description": "Image display component", "properties": { "src": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Image source URL" }, "alt": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Alt text for accessibility" }, "width": { @@ -116,118 +98,100 @@ "description": "Image height in pixels" } }, - "required": [ - "src", - "alt" - ] + "required": ["src", "alt"] }, "Card": { "type": "object", "description": "Card container for grouped content", "properties": { "title": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Card title" }, "subtitle": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Card subtitle" }, "image": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Card image URL" }, "badge": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Badge text (e.g., 'New', 'Sale')" }, "action": { "type": "object", "description": "Action to trigger on card click", "properties": { - "name": { - "type": "string" - }, + "name": { "type": "string" }, "context": { "type": "object", "additionalProperties": { - "$ref": "bound-value.json" + "$ref": "/schemas/latest/a2ui/bound-value.json" } } }, - "required": [ - "name" - ] + "required": ["name"] }, "children": { "type": "array", "description": "Child component IDs", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, - "required": [ - "title" - ] + "required": ["title"] }, "ProductCard": { "type": "object", "description": "Product display card (SI-specific)", "properties": { "title": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Product name" }, "price": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Price display string" }, "image": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Product image URL" }, "description": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Product description" }, "badge": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Badge text (e.g., 'Best Seller')" }, "ctaLabel": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "CTA button label" }, "action": { "type": "object", "properties": { - "name": { - "type": "string" - }, + "name": { "type": "string" }, "context": { "type": "object", "additionalProperties": { - "$ref": "bound-value.json" + "$ref": "/schemas/latest/a2ui/bound-value.json" } } }, - "required": [ - "name" - ] + "required": ["name"] } }, - "required": [ - "title", - "price" - ] + "required": ["title", "price"] }, "List": { "type": "object", "description": "Data-bound list component", "properties": { "items": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Path to array in data model" }, "template": { @@ -239,28 +203,19 @@ "description": "ID of component to use as template" } }, - "required": [ - "componentId" - ] + "required": ["componentId"] }, "emptyMessage": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Message to show when list is empty" }, "layout": { "type": "string", - "enum": [ - "vertical", - "horizontal", - "grid" - ], + "enum": ["vertical", "horizontal", "grid"], "default": "vertical" } }, - "required": [ - "items", - "template" - ] + "required": ["items", "template"] }, "Row": { "type": "object", @@ -269,9 +224,7 @@ "children": { "type": "array", "description": "Child component IDs", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "gap": { "type": "string", @@ -280,29 +233,16 @@ }, "align": { "type": "string", - "enum": [ - "start", - "center", - "end", - "stretch" - ], + "enum": ["start", "center", "end", "stretch"], "default": "center" }, "justify": { "type": "string", - "enum": [ - "start", - "center", - "end", - "between", - "around" - ], + "enum": ["start", "center", "end", "between", "around"], "default": "start" } }, - "required": [ - "children" - ] + "required": ["children"] }, "Column": { "type": "object", @@ -311,9 +251,7 @@ "children": { "type": "array", "description": "Child component IDs", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "gap": { "type": "string", @@ -322,18 +260,11 @@ }, "align": { "type": "string", - "enum": [ - "start", - "center", - "end", - "stretch" - ], + "enum": ["start", "center", "end", "stretch"], "default": "stretch" } }, - "required": [ - "children" - ] + "required": ["children"] }, "IntegrationAction": { "type": "object", @@ -341,18 +272,15 @@ "properties": { "type": { "type": "string", - "enum": [ - "mcp", - "a2a" - ], + "enum": ["mcp", "a2a"], "description": "Integration type" }, "label": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Button label" }, "url": { - "$ref": "bound-value.json", + "$ref": "/schemas/latest/a2ui/bound-value.json", "description": "Integration endpoint URL" }, "highlighted": { @@ -361,10 +289,7 @@ "default": false } }, - "required": [ - "type", - "label" - ] + "required": ["type", "label"] }, "AppHandoff": { "type": "object", @@ -376,23 +301,14 @@ "additionalProperties": { "type": "object", "properties": { - "appId": { - "type": "string" - }, - "deepLink": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } + "appId": { "type": "string" }, + "deepLink": { "type": "string" }, + "url": { "type": "string", "format": "uri" } } } } }, - "required": [ - "apps" - ] + "required": ["apps"] } }, "type": "object", @@ -423,4 +339,4 @@ } } } -} \ No newline at end of file +} diff --git a/schemas/cache/a2ui/surface.json b/schemas/cache/a2ui/surface.json index 40aba240d..2f42b06d1 100644 --- a/schemas/cache/a2ui/surface.json +++ b/schemas/cache/a2ui/surface.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/a2ui/surface.json", "title": "A2UI Surface", "description": "A contiguous UI region containing components", "type": "object", @@ -17,7 +18,7 @@ "type": "array", "description": "Flat list of components (adjacency list structure)", "items": { - "$ref": "component.json" + "$ref": "/schemas/latest/a2ui/component.json" } }, "rootId": { @@ -30,9 +31,6 @@ "additionalProperties": true } }, - "required": [ - "surfaceId", - "components" - ], + "required": ["surfaceId", "components"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/a2ui/user-action.json b/schemas/cache/a2ui/user-action.json index 9c9a9ccc6..b52c451b3 100644 --- a/schemas/cache/a2ui/user-action.json +++ b/schemas/cache/a2ui/user-action.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/a2ui/user-action.json", "title": "A2UI User Action", "description": "User interaction event sent from client to agent", "type": "object", @@ -26,9 +27,7 @@ "additionalProperties": true } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": true }, "timestamp": { @@ -37,10 +36,6 @@ "description": "When the action occurred" } }, - "required": [ - "surfaceId", - "componentId", - "action" - ], + "required": ["surfaceId", "componentId", "action"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/account/get-account-financials-request.json b/schemas/cache/account/get-account-financials-request.json index c5d0dd324..f39943f39 100644 --- a/schemas/cache/account/get-account-financials-request.json +++ b/schemas/cache/account/get-account-financials-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/get-account-financials-request.json", "title": "Get Account Financials Request", "description": "Request financial status for an operator-billed account. Returns spend summary, credit/balance status, and invoice history. Only applicable when the seller declares account_financials capability.", "type": "object", @@ -11,18 +12,18 @@ "maximum": 99 }, "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Account to query financials for. Must be an operator-billed account." }, "period": { - "$ref": "../core/date-range.json", + "$ref": "/schemas/latest/core/date-range.json", "description": "Date range for the spend summary. Defaults to the current billing cycle if omitted." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -66,4 +67,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/get-account-financials-response.json b/schemas/cache/account/get-account-financials-response.json index 8bd243278..b7a4cccea 100644 --- a/schemas/cache/account/get-account-financials-response.json +++ b/schemas/cache/account/get-account-financials-response.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/get-account-financials-response.json", "title": "Get Account Financials Response", - "description": "Financial status for an operator-billed account. Returns spend summary, credit/balance status, payment status, and invoice history. The level of detail varies by seller \u2014 only account, currency, and period are guaranteed on success.", + "description": "Financial status for an operator-billed account. Returns spend summary, credit/balance status, payment status, and invoice history. The level of detail varies by seller — only account, currency, and period are guaranteed on success.", "type": "object", "oneOf": [ { @@ -10,7 +11,7 @@ "type": "object", "properties": { "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Account reference, echoed from the request" }, "currency": { @@ -19,12 +20,12 @@ "description": "ISO 4217 currency code for all monetary amounts in this response" }, "period": { - "$ref": "../core/date-range.json", + "$ref": "/schemas/latest/core/date-range.json", "description": "The actual period covered by spend data. May differ from the requested period if the seller adjusts to billing cycle boundaries." }, "timezone": { "type": "string", - "description": "IANA timezone of the seller's billing day boundaries (e.g., 'America/New_York'). All dates in this response \u2014 period, invoice periods, due dates \u2014 are calendar dates in this timezone. Buyers in a different timezone should expect spend boundaries to differ from their own calendar day." + "description": "IANA timezone of the seller's billing day boundaries (e.g., 'America/New_York'). All dates in this response — period, invoice periods, due dates — are calendar dates in this timezone. Buyers in a different timezone should expect spend boundaries to differ from their own calendar day." }, "spend": { "type": "object", @@ -41,9 +42,7 @@ "description": "Number of active media buys in the period" } }, - "required": [ - "total_spend" - ] + "required": ["total_spend"] }, "credit": { "type": "object", @@ -65,10 +64,7 @@ "description": "Credit utilization as a percentage (0-100)" } }, - "required": [ - "credit_limit", - "available_credit" - ] + "required": ["credit_limit", "available_credit"] }, "balance": { "type": "object", @@ -94,35 +90,19 @@ "description": "Date of top-up" } }, - "required": [ - "amount", - "date" - ] + "required": ["amount", "date"] } }, - "required": [ - "available" - ] + "required": ["available"] }, "payment_status": { "type": "string", - "enum": [ - "current", - "past_due", - "suspended" - ], + "enum": ["current", "past_due", "suspended"], "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" - ], + "enum": ["net_15", "net_30", "net_45", "net_60", "net_90", "prepay"], "description": "Payment terms in effect for this account" }, "invoices": { @@ -136,7 +116,7 @@ "description": "Seller-assigned invoice identifier" }, "period": { - "$ref": "../core/date-range.json", + "$ref": "/schemas/latest/core/date-range.json", "description": "Billing period covered by this invoice" }, "amount": { @@ -146,13 +126,7 @@ }, "status": { "type": "string", - "enum": [ - "draft", - "issued", - "paid", - "past_due", - "void" - ], + "enum": ["draft", "issued", "paid", "past_due", "void"], "description": "Invoice status" }, "due_date": { @@ -166,90 +140,59 @@ "description": "Date payment was received. Present when status is 'paid'." } }, - "required": [ - "invoice_id", - "amount", - "status" - ] + "required": ["invoice_id", "amount", "status"] } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "account", - "currency", - "period", - "timezone" - ], + "required": ["account", "currency", "period", "timezone"], "additionalProperties": true, "not": { - "required": [ - "errors" - ] + "required": ["errors"] } }, { "title": "GetAccountFinancialsError", - "description": "Operation failed \u2014 financials not available", + "description": "Operation failed — financials not available", "type": "object", "properties": { "errors": { "type": "array", "description": "Operation-level errors", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "account" - ] - }, - { - "required": [ - "currency" - ] - }, - { - "required": [ - "period" - ] - }, - { - "required": [ - "timezone" - ] - } + { "required": ["account"] }, + { "required": ["currency"] }, + { "required": ["period"] }, + { "required": ["timezone"] } ] } } ], "examples": [ { - "description": "Credit account \u2014 current, with invoice history", + "description": "Credit account — current, with invoice history", "data": { - "account": { - "account_id": "acc_acme_001" - }, + "account": { "account_id": "acc_acme_001" }, "currency": "USD", "period": { "start": "2026-02-01", @@ -257,12 +200,12 @@ }, "timezone": "America/New_York", "spend": { - "total_spend": 45230.0, + "total_spend": 45230.00, "media_buy_count": 3 }, "credit": { - "credit_limit": 100000.0, - "available_credit": 54770.0, + "credit_limit": 100000.00, + "available_credit": 54770.00, "utilization_percent": 45.23 }, "payment_status": "current", @@ -270,11 +213,8 @@ "invoices": [ { "invoice_id": "inv_2026_01", - "period": { - "start": "2026-01-01", - "end": "2026-01-31" - }, - "amount": 38500.0, + "period": { "start": "2026-01-01", "end": "2026-01-31" }, + "amount": 38500.00, "status": "paid", "due_date": "2026-02-28", "paid_date": "2026-02-15" @@ -286,9 +226,7 @@ "description": "Prepay account with low balance", "data": { "account": { - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com" }, "currency": "USD", @@ -298,13 +236,13 @@ }, "timezone": "America/Los_Angeles", "spend": { - "total_spend": 8200.0, + "total_spend": 8200.00, "media_buy_count": 2 }, "balance": { - "available": 1800.0, + "available": 1800.00, "last_top_up": { - "amount": 10000.0, + "amount": 10000.00, "date": "2026-02-01" } }, @@ -313,7 +251,7 @@ } }, { - "description": "Agent-billed account \u2014 not supported", + "description": "Agent-billed account — not supported", "data": { "errors": [ { @@ -324,4 +262,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/list-accounts-request.json b/schemas/cache/account/list-accounts-request.json index 0d2dbe0f7..0d3e1694b 100644 --- a/schemas/cache/account/list-accounts-request.json +++ b/schemas/cache/account/list-accounts-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/list-accounts-request.json", "title": "List Accounts Request", "description": "Request parameters for listing accounts accessible to the authenticated agent", "type": "object", @@ -23,19 +24,19 @@ "description": "Filter accounts by status. Omit to return accounts in all statuses." }, "pagination": { - "$ref": "../core/pagination-request.json" + "$ref": "/schemas/latest/core/pagination-request.json" }, "sandbox": { "type": "boolean", "description": "Filter by sandbox status. true returns only sandbox accounts, false returns only production accounts. Omit to return all accounts. Primarily used with explicit accounts (require_operator_auth: true) where sandbox accounts are pre-existing test accounts on the platform." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/account/list-accounts-response.json b/schemas/cache/account/list-accounts-response.json index bd282efaf..a1597f5d9 100644 --- a/schemas/cache/account/list-accounts-response.json +++ b/schemas/cache/account/list-accounts-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/list-accounts-response.json", "title": "List Accounts Response", "description": "Response payload for list_accounts task", "type": "object", @@ -8,29 +9,27 @@ "type": "array", "description": "Array of accounts accessible to the authenticated agent", "items": { - "$ref": "../core/account.json" + "$ref": "/schemas/latest/core/account.json" } }, "errors": { "type": "array", "description": "Task-specific errors and warnings", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" } }, "pagination": { - "$ref": "../core/pagination-response.json" + "$ref": "/schemas/latest/core/pagination-response.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "accounts" - ], + "required": ["accounts"], "additionalProperties": true, "examples": [ { @@ -42,9 +41,7 @@ "name": "Acme c/o Pinnacle", "advertiser": "Acme Corp", "billing_proxy": "Pinnacle Media", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "pinnacle-media.com", "billing": "operator", "account_scope": "operator_brand", @@ -55,10 +52,7 @@ "name": "Nova c/o Pinnacle", "advertiser": "Nova Brands", "billing_proxy": "Pinnacle Media", - "brand": { - "domain": "nova-brands.com", - "brand_id": "spark" - }, + "brand": { "domain": "nova-brands.com", "brand_id": "spark" }, "operator": "pinnacle-media.com", "billing": "operator", "account_scope": "operator_brand", @@ -68,9 +62,7 @@ "account_id": "acc_pinnacle", "name": "Pinnacle", "advertiser": "Pinnacle Media", - "brand": { - "domain": "pinnacle-media.com" - }, + "brand": { "domain": "pinnacle-media.com" }, "operator": "pinnacle-media.com", "billing": "operator", "account_scope": "operator", @@ -91,9 +83,7 @@ "account_id": "acc_acme_direct", "name": "Acme", "advertiser": "Acme Corp", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com", "billing": "operator", "account_scope": "brand", @@ -104,4 +94,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/report-usage-request.json b/schemas/cache/account/report-usage-request.json index 09195b5bf..e708d4858 100644 --- a/schemas/cache/account/report-usage-request.json +++ b/schemas/cache/account/report-usage-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/report-usage-request.json", "title": "Report Usage Request", "description": "Reports how a vendor's service was consumed after campaign delivery. Used by orchestrators (DSPs, storefronts) to inform vendor agents (signals, governance, creative) what was used so the vendor can track earned revenue and verify billing. Records can span multiple accounts and campaigns in a single request.", "type": "object", @@ -15,7 +16,7 @@ "description": "Client-generated unique key for this request. If a request with the same key has already been accepted, the server returns the original response without re-processing. MUST be unique per (seller, request) pair to prevent cross-seller correlation. Use a fresh UUID v4 for each request. Prevents duplicate billing on retries." }, "reporting_period": { - "$ref": "../core/datetime-range.json", + "$ref": "/schemas/latest/core/datetime-range.json", "description": "The time range covered by this usage report. Applies to all records in the request." }, "usage": { @@ -26,7 +27,7 @@ "type": "object", "properties": { "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Account for this usage record." }, "media_buy_id": { @@ -87,10 +88,10 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -156,4 +157,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/report-usage-response.json b/schemas/cache/account/report-usage-response.json index 1254d33dd..1f7abdf0f 100644 --- a/schemas/cache/account/report-usage-response.json +++ b/schemas/cache/account/report-usage-response.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/report-usage-response.json", "title": "Report Usage Response", - "description": "Response from report_usage. Partial acceptance is valid \u2014 records that pass validation are stored even when others fail.", + "description": "Response from report_usage. Partial acceptance is valid — records that pass validation are stored even when others fail.", "type": "object", "properties": { "accepted": { @@ -13,7 +14,7 @@ "type": "array", "description": "Validation errors for individual records. The field property identifies which record failed (e.g., 'usage[1].pricing_option_id').", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" } }, "sandbox": { @@ -21,15 +22,13 @@ "description": "When true, the account is a sandbox account and no billing occurred." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "accepted" - ], + "required": ["accepted"], "additionalProperties": true, "examples": [ { @@ -39,7 +38,7 @@ } }, { - "description": "Partial acceptance \u2014 one record failed validation", + "description": "Partial acceptance — one record failed validation", "data": { "accepted": 1, "errors": [ @@ -52,4 +51,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/sync-accounts-request.json b/schemas/cache/account/sync-accounts-request.json index 5337f6195..5308b6541 100644 --- a/schemas/cache/account/sync-accounts-request.json +++ b/schemas/cache/account/sync-accounts-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/sync-accounts-request.json", "title": "Sync Accounts Request", "description": "Sync advertiser accounts with a seller using upsert semantics. The agent declares which brands it represents, who operates on each brand's behalf, and the billing model. The seller provisions or links accounts accordingly, returning per-account status.", "type": "object", @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. Natural per-account upsert keys (brand, operator) handle resource-level dedup, but the envelope triggers onboarding webhooks, billing setup, and audit events \u2014 this key prevents those side effects from firing twice on retry. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", + "description": "Client-generated unique key for at-most-once execution. Natural per-account upsert keys (brand, operator) handle resource-level dedup, but the envelope triggers onboarding webhooks, billing setup, and audit events — this key prevents those side effects from firing twice on retry. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -25,7 +26,7 @@ "description": "An advertiser account the agent wants to operate on the seller", "properties": { "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference identifying the advertiser. Uses the brand's house domain and optional brand_id from brand.json." }, "operator": { @@ -43,7 +44,7 @@ "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." }, "billing_entity": { - "$ref": "../core/business-entity.json", + "$ref": "/schemas/latest/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": { @@ -56,14 +57,14 @@ "net_90", "prepay" ], - "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." + "description": "Payment terms for this account. The seller must either accept these terms or reject the account — terms are never silently remapped. When omitted, the seller applies its default terms." }, "sandbox": { "type": "boolean", "description": "When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to implicit accounts (require_operator_auth: false). For explicit accounts, sandbox accounts are pre-existing test accounts discovered via list_accounts." }, "preferred_reporting_protocol": { - "$ref": "../enums/cloud-storage-protocol.json", + "$ref": "/schemas/latest/enums/cloud-storage-protocol.json", "description": "Buyer's preferred cloud storage protocol for offline reporting delivery. The seller provisions the account's reporting_bucket using this protocol if supported. When omitted, the seller chooses from its supported offline_delivery_protocols. Only meaningful when the seller's reporting_delivery_methods includes 'offline'." } }, @@ -79,7 +80,7 @@ "delete_missing": { "type": "boolean", "default": false, - "description": "When true, accounts previously synced by this agent but not included in this request will be deactivated. Scoped to the authenticated agent \u2014 does not affect accounts managed by other agents. Use with caution." + "description": "When true, accounts previously synced by this agent but not included in this request will be deactivated. Scoped to the authenticated agent — does not affect accounts managed by other agents. Use with caution." }, "dry_run": { "type": "boolean", @@ -87,14 +88,14 @@ "description": "When true, preview what would change without applying. Returns what would be created/updated/deactivated." }, "push_notification_config": { - "$ref": "../core/push-notification-config.json", + "$ref": "/schemas/latest/core/push-notification-config.json", "description": "Webhook for async notifications when account status changes (e.g., pending_approval transitions to active)." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -209,4 +210,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/sync-accounts-response.json b/schemas/cache/account/sync-accounts-response.json index 000ad803f..33ea6ba0e 100644 --- a/schemas/cache/account/sync-accounts-response.json +++ b/schemas/cache/account/sync-accounts-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/sync-accounts-response.json", "title": "Sync Accounts Response", "description": "Response from account sync operation. Returns per-account results with status and billing, or operation-level errors on complete failure.", "type": "object", @@ -24,7 +25,7 @@ "description": "Seller-assigned account identifier. Use this in subsequent create_media_buy and other account-scoped operations." }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference, echoed from the request" }, "operator": { @@ -67,17 +68,12 @@ "description": "Who is invoiced on this account. Matches the requested billing model." }, "billing_entity": { - "$ref": "../core/business-entity.json", + "$ref": "/schemas/latest/core/business-entity.json", "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" - ], + "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." }, "setup": { @@ -141,7 +137,7 @@ "type": "array", "description": "Per-account errors (only present when action is 'failed')", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" } }, "warnings": { @@ -166,10 +162,10 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -191,15 +187,15 @@ "type": "array", "description": "Operation-level errors (e.g., authentication failure, service unavailable)", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -224,15 +220,12 @@ ], "examples": [ { - "description": "Mixed results \u2014 one active, one pending approval", + "description": "Mixed results — one active, one pending approval", "data": { "accounts": [ { "account_id": "acc_spark_001", - "brand": { - "domain": "nova-brands.com", - "brand_id": "spark" - }, + "brand": { "domain": "nova-brands.com", "brand_id": "spark" }, "operator": "pinnacle-media.com", "name": "Spark (via Pinnacle)", "action": "created", @@ -242,10 +235,7 @@ }, { "account_id": "acc_glow_pending", - "brand": { - "domain": "nova-brands.com", - "brand_id": "glow" - }, + "brand": { "domain": "nova-brands.com", "brand_id": "glow" }, "operator": "pinnacle-media.com", "name": "Glow", "action": "created", @@ -262,14 +252,11 @@ } }, { - "description": "Rejected account \u2014 no account_id assigned", + "description": "Rejected account — no account_id assigned", "data": { "accounts": [ { - "brand": { - "domain": "acme-corp.com", - "brand_id": "clearance" - }, + "brand": { "domain": "acme-corp.com", "brand_id": "clearance" }, "operator": "acme-corp.com", "action": "created", "status": "rejected", @@ -281,13 +268,11 @@ } }, { - "description": "Unsupported billing \u2014 seller rejects the request", + "description": "Unsupported billing — seller rejects the request", "data": { "accounts": [ { - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com", "action": "failed", "status": "rejected", @@ -307,9 +292,7 @@ "accounts": [ { "account_id": "acc_acme_direct_bill", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "pinnacle-media.com", "name": "Acme Corp (billed direct)", "action": "created", @@ -340,13 +323,11 @@ } }, { - "description": "Unsupported payment terms \u2014 seller rejects the request", + "description": "Unsupported payment terms — seller rejects the request", "data": { "accounts": [ { - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com", "action": "failed", "status": "rejected", @@ -361,4 +342,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/sync-governance-request.json b/schemas/cache/account/sync-governance-request.json index 1162d45c5..92781d7c4 100644 --- a/schemas/cache/account/sync-governance-request.json +++ b/schemas/cache/account/sync-governance-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/sync-governance-request.json", "title": "Sync Governance Request", "description": "Sync governance agent endpoints against specific accounts. The seller persists these governance agents and calls them for approval during media buy lifecycle events via check_governance. Uses replace semantics: each call replaces any previously synced agents on the specified accounts. The seller MUST verify that the authenticated agent has authority over each referenced account before persisting governance agents.", "type": "object", @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. `account` gives resource-level dedup, but governance changes emit audit events and can trigger reapproval flows \u2014 this key prevents those side effects from firing twice on retry. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", + "description": "Client-generated unique key for at-most-once execution. `account` gives resource-level dedup, but governance changes emit audit events and can trigger reapproval flows — this key prevents those side effects from firing twice on retry. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -24,7 +25,7 @@ "type": "object", "properties": { "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Account to sync governance agents for. Use account_id for explicit accounts or brand + operator for implicit accounts." }, "governance_agents": { @@ -46,7 +47,7 @@ "schemes": { "type": "array", "items": { - "$ref": "../enums/auth-scheme.json" + "$ref": "/schemas/latest/enums/auth-scheme.json" }, "minItems": 1, "maxItems": 1 @@ -94,10 +95,10 @@ "maxItems": 100 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -165,4 +166,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/account/sync-governance-response.json b/schemas/cache/account/sync-governance-response.json index 7e20d597d..1e0de34ac 100644 --- a/schemas/cache/account/sync-governance-response.json +++ b/schemas/cache/account/sync-governance-response.json @@ -1,12 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/account/sync-governance-response.json", "title": "Sync Governance Response", "description": "Response from governance agent sync. Returns per-account results confirming sync, or operation-level errors on complete failure.", "type": "object", "oneOf": [ { "title": "SyncGovernanceSuccess", - "description": "Sync processed \u2014 individual accounts may have errors", + "description": "Sync processed — individual accounts may have errors", "type": "object", "properties": { "accounts": { @@ -16,15 +17,12 @@ "type": "object", "properties": { "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Account reference, echoed from request" }, "status": { "type": "string", - "enum": [ - "synced", - "failed" - ], + "enum": ["synced", "failed"], "description": "Sync result. synced: governance agents persisted. failed: could not complete (see errors)." }, "governance_agents": { @@ -41,18 +39,12 @@ }, "categories": { "type": "array", - "items": { - "type": "string", - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_]*$" - }, + "items": { "type": "string", "maxLength": 64, "pattern": "^[a-z][a-z0-9_]*$" }, "description": "Governance categories this agent handles.", "maxItems": 20 } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": false } }, @@ -60,32 +52,25 @@ "type": "array", "description": "Per-account errors (only present when status is 'failed')", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" } } }, - "required": [ - "account", - "status" - ], + "required": ["account", "status"], "additionalProperties": true } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "accounts" - ], + "required": ["accounts"], "additionalProperties": true, "not": { - "required": [ - "errors" - ] + "required": ["errors"] } }, { @@ -97,25 +82,21 @@ "type": "array", "description": "Operation-level errors (e.g., authentication failure, service unavailable)", "items": { - "$ref": "../core/error.json" + "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { - "required": [ - "accounts" - ] + "required": ["accounts"] } } ], @@ -125,30 +106,22 @@ "data": { "accounts": [ { - "account": { - "account_id": "acct-social-001" - }, + "account": { "account_id": "acct-social-001" }, "status": "synced", "governance_agents": [ { "url": "https://governance.pinnacle-media.com/budget", - "categories": [ - "budget_authority" - ] + "categories": ["budget_authority"] } ] }, { - "account": { - "account_id": "acct-social-002" - }, + "account": { "account_id": "acct-social-002" }, "status": "synced", "governance_agents": [ { "url": "https://governance.pinnacle-media.com/compliance", - "categories": [ - "geo_compliance" - ] + "categories": ["geo_compliance"] } ] } @@ -156,27 +129,21 @@ } }, { - "description": "Partial failure \u2014 one account not found", + "description": "Partial failure — one account not found", "data": { "accounts": [ { - "account": { - "account_id": "acct-social-001" - }, + "account": { "account_id": "acct-social-001" }, "status": "synced", "governance_agents": [ { "url": "https://governance.pinnacle-media.com/budget", - "categories": [ - "budget_authority" - ] + "categories": ["budget_authority"] } ] }, { - "account": { - "account_id": "acct-unknown" - }, + "account": { "account_id": "acct-unknown" }, "status": "failed", "errors": [ { @@ -189,4 +156,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/adagents.json b/schemas/cache/adagents.json index 5d5ee763c..030d5e937 100644 --- a/schemas/cache/adagents.json +++ b/schemas/cache/adagents.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/adagents.json", "title": "AdCP Agents Authorization", "description": "Declaration of authorized agents for advertising inventory and data signals. Hosted at /.well-known/adagents.json on publisher domains (for properties) or data provider domains (for signals). Can either contain the full structure inline or reference an authoritative URL.", "oneOf": [ @@ -85,7 +86,7 @@ "type": "array", "description": "Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.", "items": { - "$ref": "core/property.json" + "$ref": "/schemas/latest/core/property.json" }, "minItems": 1 }, @@ -93,14 +94,14 @@ "type": "array", "description": "Collections produced or distributed by this publisher. Declares the content programs whose inventory is sold through authorized agents. Products in get_products responses reference these collections by collection_id.", "items": { - "$ref": "core/collection.json" + "$ref": "/schemas/latest/core/collection.json" } }, "placements": { "type": "array", "description": "Canonical placement definitions for properties in this file. Products SHOULD reuse these placement_id values when exposing inventory in get_products, and authorized agents can scope authorization to these placement IDs.", "items": { - "$ref": "core/placement-definition.json" + "$ref": "/schemas/latest/core/placement-definition.json" }, "minItems": 1 }, @@ -176,7 +177,7 @@ "type": "array", "description": "Property IDs this agent is authorized for. Resolved against the top-level properties array in this file", "items": { - "$ref": "core/property-id.json" + "$ref": "/schemas/latest/core/property-id.json" }, "minItems": 1 }, @@ -184,7 +185,7 @@ "type": "array", "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.", "items": { - "$ref": "core/collection-selector.json" + "$ref": "/schemas/latest/core/collection-selector.json" }, "minItems": 1 }, @@ -207,11 +208,7 @@ }, "delegation_type": { "type": "string", - "enum": [ - "direct", - "delegated", - "ad_network" - ], + "enum": ["direct", "delegated", "ad_network"], "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint." }, "exclusive": { @@ -242,15 +239,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -286,7 +283,7 @@ "type": "array", "description": "Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching", "items": { - "$ref": "core/property-tag.json" + "$ref": "/schemas/latest/core/property-tag.json" }, "minItems": 1 }, @@ -294,7 +291,7 @@ "type": "array", "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.", "items": { - "$ref": "core/collection-selector.json" + "$ref": "/schemas/latest/core/collection-selector.json" }, "minItems": 1 }, @@ -317,11 +314,7 @@ }, "delegation_type": { "type": "string", - "enum": [ - "direct", - "delegated", - "ad_network" - ], + "enum": ["direct", "delegated", "ad_network"], "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint." }, "exclusive": { @@ -352,15 +345,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -396,7 +389,7 @@ "type": "array", "description": "Specific properties this agent is authorized for (alternative to property_ids/property_tags)", "items": { - "$ref": "core/property.json" + "$ref": "/schemas/latest/core/property.json" }, "minItems": 1 }, @@ -404,7 +397,7 @@ "type": "array", "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.", "items": { - "$ref": "core/collection-selector.json" + "$ref": "/schemas/latest/core/collection-selector.json" }, "minItems": 1 }, @@ -427,11 +420,7 @@ }, "delegation_type": { "type": "string", - "enum": [ - "direct", - "delegated", - "ad_network" - ], + "enum": ["direct", "delegated", "ad_network"], "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint." }, "exclusive": { @@ -462,15 +451,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -506,7 +495,7 @@ "type": "array", "description": "Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell", "items": { - "$ref": "core/publisher-property-selector.json" + "$ref": "/schemas/latest/core/publisher-property-selector.json" }, "minItems": 1 }, @@ -514,7 +503,7 @@ "type": "array", "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.", "items": { - "$ref": "core/collection-selector.json" + "$ref": "/schemas/latest/core/collection-selector.json" }, "minItems": 1 }, @@ -537,11 +526,7 @@ }, "delegation_type": { "type": "string", - "enum": [ - "direct", - "delegated", - "ad_network" - ], + "enum": ["direct", "delegated", "ad_network"], "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint." }, "exclusive": { @@ -572,15 +557,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -626,15 +611,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -680,15 +665,15 @@ "type": "array", "description": "Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.", "items": { - "$ref": "core/agent-signing-key.json" + "$ref": "/schemas/latest/core/agent-signing-key.json" }, "minItems": 1 }, "encryption_keys": { "type": "array", - "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.", + "description": "X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base — read replicas encrypt with this public key, only the master can decrypt.", "items": { - "$ref": "core/agent-encryption-key.json" + "$ref": "/schemas/latest/core/agent-encryption-key.json" }, "minItems": 1 } @@ -738,11 +723,7 @@ "description": "Optional publisher identifier at this agent (for lookup)" } }, - "required": [ - "url", - "name", - "features" - ], + "required": ["url", "name", "features"], "additionalProperties": true } }, @@ -750,7 +731,7 @@ "type": "array", "description": "Signal catalog published by this data provider. Signals agents reference these signals via data_provider_domain + signal_id.", "items": { - "$ref": "core/signal-definition.json" + "$ref": "/schemas/latest/core/signal-definition.json" }, "minItems": 1 }, @@ -789,12 +770,12 @@ "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json", "last_updated": "2025-01-15T10:00:00Z" }, - { - "$schema": "/schemas/latest/adagents.json", - "properties": [ { - "property_id": "example_site", - "property_type": "website", + "$schema": "/schemas/latest/adagents.json", + "properties": [ + { + "property_id": "example_site", + "property_type": "website", "name": "Example Site", "identifiers": [ { @@ -802,65 +783,52 @@ "value": "example.com" } ], - "publisher_domain": "example.com" - } - ], - "placements": [ - { - "placement_id": "homepage_banner", - "name": "Homepage Banner", - "tags": [ - "homepage", - "display", - "premium" - ], - "property_ids": [ - "example_site" + "publisher_domain": "example.com" + } ], - "format_ids": [ + "placements": [ { - "agent_url": "https://creative.example.com", - "id": "display_728x90" + "placement_id": "homepage_banner", + "name": "Homepage Banner", + "tags": ["homepage", "display", "premium"], + "property_ids": ["example_site"], + "format_ids": [ + { + "agent_url": "https://creative.example.com", + "id": "display_728x90" + } + ] } - ] - } - ], - "placement_tags": { - "homepage": { - "name": "Homepage", - "description": "Placements that render on the homepage" - }, - "display": { - "name": "Display", - "description": "Standard display placements" - }, - "premium": { - "name": "Premium", - "description": "Premium monetization placements" - } - }, - "authorized_agents": [ - { - "url": "https://agent.example.com", - "authorized_for": "Official sales agent", - "authorization_type": "property_tags", - "property_tags": [ - "all" - ], - "placement_ids": [ - "homepage_banner" ], - "delegation_type": "direct", - "exclusive": true, - "countries": [ - "US", - "CA" + "placement_tags": { + "homepage": { + "name": "Homepage", + "description": "Placements that render on the homepage" + }, + "display": { + "name": "Display", + "description": "Standard display placements" + }, + "premium": { + "name": "Premium", + "description": "Premium monetization placements" + } + }, + "authorized_agents": [ + { + "url": "https://agent.example.com", + "authorized_for": "Official sales agent", + "authorization_type": "property_tags", + "property_tags": ["all"], + "placement_ids": ["homepage_banner"], + "delegation_type": "direct", + "exclusive": true, + "countries": ["US", "CA"], + "effective_from": "2025-01-01T00:00:00Z" + } ], - "effective_from": "2025-01-01T00:00:00Z" - } - ], - "tags": { - "all": { + "tags": { + "all": { "name": "All Properties", "description": "All properties in this file" } @@ -895,11 +863,7 @@ "meta_network", "social_media" ], - "supported_channels": [ - "social", - "display", - "olv" - ], + "supported_channels": ["social", "display", "olv"], "publisher_domain": "instagram.com" }, { @@ -919,11 +883,7 @@ "meta_network", "social_media" ], - "supported_channels": [ - "social", - "display", - "olv" - ], + "supported_channels": ["social", "display", "olv"], "publisher_domain": "facebook.com" }, { @@ -943,10 +903,7 @@ "meta_network", "messaging" ], - "supported_channels": [ - "social", - "display" - ], + "supported_channels": ["social", "display"], "publisher_domain": "whatsapp.com" } ], @@ -1078,10 +1035,7 @@ "value": "news.example.com" } ], - "tags": [ - "premium", - "news" - ], + "tags": ["premium", "news"], "publisher_domain": "news.example.com" } ], @@ -1100,37 +1054,25 @@ "url": "https://sales.news.example.com", "authorized_for": "All news properties", "authorization_type": "property_tags", - "property_tags": [ - "news" - ] + "property_tags": ["news"] } ], "property_features": [ { "url": "https://api.scope3.com", "name": "Scope3", - "features": [ - "carbon_score", - "sustainability_grade" - ], + "features": ["carbon_score", "sustainability_grade"], "publisher_id": "pub_news_12345" }, { "url": "https://api.tagtoday.net", "name": "TAG", - "features": [ - "tag_certified_against_fraud", - "tag_brand_safety_certified" - ] + "features": ["tag_certified_against_fraud", "tag_brand_safety_certified"] }, { "url": "https://api.onetrust.com", "name": "OneTrust", - "features": [ - "gdpr_compliant", - "tcf_registered", - "ccpa_compliant" - ], + "features": ["gdpr_compliant", "tcf_registered", "ccpa_compliant"], "publisher_id": "ot_news_67890" } ], @@ -1150,10 +1092,7 @@ "description": "Consumers modeled as likely to purchase a Tesla in the next 12 months based on vehicle registration, financial, and behavioral data", "value_type": "binary", "category": "purchase_intent", - "tags": [ - "automotive", - "premium" - ] + "tags": ["automotive", "premium"] }, { "id": "vehicle_ownership", @@ -1161,18 +1100,8 @@ "description": "Current vehicle make owned by the consumer", "value_type": "categorical", "category": "ownership", - "allowed_values": [ - "tesla", - "bmw", - "mercedes", - "audi", - "lexus", - "other_luxury", - "non_luxury" - ], - "tags": [ - "automotive" - ] + "allowed_values": ["tesla", "bmw", "mercedes", "audi", "lexus", "other_luxury", "non_luxury"], + "tags": ["automotive"] }, { "id": "purchase_propensity", @@ -1180,14 +1109,8 @@ "description": "Likelihood score of purchasing any new vehicle in the next 6 months", "value_type": "numeric", "category": "purchase_intent", - "range": { - "min": 0, - "max": 1, - "unit": "score" - }, - "tags": [ - "automotive" - ] + "range": { "min": 0, "max": 1, "unit": "score" }, + "tags": ["automotive"] } ], "signal_tags": { @@ -1205,20 +1128,16 @@ "url": "https://liveramp.com/.well-known/adcp/signals", "authorized_for": "All Polk automotive signals via LiveRamp", "authorization_type": "signal_tags", - "signal_tags": [ - "automotive" - ] + "signal_tags": ["automotive"] }, { "url": "https://the-trade-desk.com/.well-known/adcp/signals", "authorized_for": "Polk premium signals only", "authorization_type": "signal_ids", - "signal_ids": [ - "likely_tesla_buyers" - ] + "signal_ids": ["likely_tesla_buyers"] } ], "last_updated": "2025-01-15T10:00:00Z" } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand.json b/schemas/cache/brand.json index 48ab4bbc9..7535d722f 100644 --- a/schemas/cache/brand.json +++ b/schemas/cache/brand.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand.json", "title": "Brand Discovery", "description": "Brand identity and discovery file. Hosted at /.well-known/brand.json on house domains. Contains the full brand portfolio with identity, creative assets, and digital properties. Brands are identified by house + brand_id (like properties are identified by publisher + property_id). Supports variants: house portfolio (full brand data), brand agent (agent provides brand info via MCP), house redirect (pointer to house domain), or authoritative location redirect.", "definitions": { @@ -25,12 +26,7 @@ }, "keller_type": { "type": "string", - "enum": [ - "master", - "sub_brand", - "endorsed", - "independent" - ], + "enum": ["master", "sub_brand", "endorsed", "independent"], "description": "Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)" }, "logo": { @@ -44,57 +40,32 @@ }, "orientation": { "type": "string", - "enum": [ - "square", - "horizontal", - "vertical", - "stacked" - ], + "enum": ["square", "horizontal", "vertical", "stacked"], "description": "Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements" }, "background": { "type": "string", - "enum": [ - "dark-bg", - "light-bg", - "transparent-bg" - ], + "enum": ["dark-bg", "light-bg", "transparent-bg"], "description": "Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background" }, "variant": { "type": "string", - "enum": [ - "primary", - "secondary", - "icon", - "wordmark", - "full-lockup" - ], + "enum": ["primary", "secondary", "icon", "wordmark", "full-lockup"], "description": "Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo" }, "tags": { "type": "array", "description": "Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "usage": { "type": "string", "description": "Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')" }, - "width": { - "type": "integer", - "description": "Width in pixels" - }, - "height": { - "type": "integer", - "description": "Height in pixels" - } + "width": { "type": "integer", "description": "Width in pixels" }, + "height": { "type": "integer", "description": "Height in pixels" } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": true }, "hex_color": { @@ -104,152 +75,80 @@ }, "color_value": { "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } + { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, + { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 } ] }, "colors": { "type": "object", - "description": "Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity \u2014 heading, body, label, border, divider, surface_1, surface_2, etc.", + "description": "Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity — heading, body, label, border, divider, surface_1, surface_2, etc.", "properties": { - "primary": { - "$ref": "#/definitions/color_value" - }, - "secondary": { - "$ref": "#/definitions/color_value" - }, - "accent": { - "$ref": "#/definitions/color_value" - }, - "background": { - "$ref": "#/definitions/color_value" - }, - "text": { - "$ref": "#/definitions/color_value" - }, - "heading": { - "$ref": "#/definitions/color_value" - }, - "body": { - "$ref": "#/definitions/color_value" - }, - "label": { - "$ref": "#/definitions/color_value" - }, - "border": { - "$ref": "#/definitions/color_value" - }, - "divider": { - "$ref": "#/definitions/color_value" - }, - "surface_1": { - "$ref": "#/definitions/color_value" - }, - "surface_2": { - "$ref": "#/definitions/color_value" - } + "primary": { "$ref": "#/definitions/color_value" }, + "secondary": { "$ref": "#/definitions/color_value" }, + "accent": { "$ref": "#/definitions/color_value" }, + "background": { "$ref": "#/definitions/color_value" }, + "text": { "$ref": "#/definitions/color_value" }, + "heading": { "$ref": "#/definitions/color_value" }, + "body": { "$ref": "#/definitions/color_value" }, + "label": { "$ref": "#/definitions/color_value" }, + "border": { "$ref": "#/definitions/color_value" }, + "divider": { "$ref": "#/definitions/color_value" }, + "surface_1": { "$ref": "#/definitions/color_value" }, + "surface_2": { "$ref": "#/definitions/color_value" } }, - "additionalProperties": { - "$ref": "#/definitions/color_value" - } + "additionalProperties": { "$ref": "#/definitions/color_value" } }, "font_file": { "type": "object", "description": "A font file with weight, style, and variable font metadata", "properties": { - "url": { - "type": "string", - "format": "uri", - "pattern": "^https://", - "description": "HTTPS URL to the font file (WOFF2, TTF, or OTF)" - }, - "weight": { - "type": "integer", - "minimum": 100, - "maximum": 900, - "description": "CSS numeric font-weight for static fonts (100-900)" - }, + "url": { "type": "string", "format": "uri", "pattern": "^https://", "description": "HTTPS URL to the font file (WOFF2, TTF, or OTF)" }, + "weight": { "type": "integer", "minimum": 100, "maximum": 900, "description": "CSS numeric font-weight for static fonts (100-900)" }, "weight_range": { "type": "array", - "items": { - "type": "integer", - "minimum": 100, - "maximum": 900 - }, + "items": { "type": "integer", "minimum": 100, "maximum": 900 }, "minItems": 2, "maxItems": 2, "description": "Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts." }, "style": { "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], + "enum": ["normal", "italic", "oblique"], "description": "CSS font-style" } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": true }, "font_role": { "description": "A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).", "oneOf": [ - { - "type": "string", - "description": "CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')" - }, + { "type": "string", "description": "CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')" }, { "type": "object", "description": "Structured font with family name, downloadable font files, and typographic metadata", "properties": { - "family": { - "type": "string", - "description": "CSS font-family name (e.g., 'Brand Sans')" - }, + "family": { "type": "string", "description": "CSS font-family name (e.g., 'Brand Sans')" }, "files": { "type": "array", - "items": { - "$ref": "#/definitions/font_file" - }, + "items": { "$ref": "#/definitions/font_file" }, "maxItems": 36, "description": "Font files for different weights and styles" }, "opentype_features": { "type": "array", - "items": { - "type": "string", - "pattern": "^[a-z0-9]{4}$" - }, + "items": { "type": "string", "pattern": "^[a-z0-9]{4}$" }, "maxItems": 20, "description": "OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec." }, "fallbacks": { "type": "array", - "items": { - "type": "string", - "maxLength": 100 - }, + "items": { "type": "string", "maxLength": 100 }, "maxItems": 10, "description": "Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])" } }, - "required": [ - "family" - ], + "required": ["family"], "additionalProperties": true } ] @@ -259,82 +158,40 @@ "description": "Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.", "maxProperties": 20, "properties": { - "primary": { - "$ref": "#/definitions/font_role", - "description": "Primary font family" - }, - "secondary": { - "$ref": "#/definitions/font_role", - "description": "Secondary font family" - } + "primary": { "$ref": "#/definitions/font_role", "description": "Primary font family" }, + "secondary": { "$ref": "#/definitions/font_role", "description": "Secondary font family" } }, - "additionalProperties": { - "$ref": "#/definitions/font_role" - } + "additionalProperties": { "$ref": "#/definitions/font_role" } }, "asset": { "type": "object", "description": "Brand asset (image, video, audio, text)", "properties": { - "asset_id": { - "type": "string", - "description": "Unique identifier" - }, + "asset_id": { "type": "string", "description": "Unique identifier" }, "asset_type": { - "$ref": "enums/asset-content-type.json", + "$ref": "/schemas/latest/enums/asset-content-type.json", "description": "Type of asset content" }, - "url": { - "type": "string", - "format": "uri", - "description": "URL to CDN-hosted asset file" - }, + "url": { "type": "string", "format": "uri", "description": "URL to CDN-hosted asset file" }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')" }, - "name": { - "type": "string", - "description": "Human-readable name" - }, - "description": { - "type": "string", - "description": "Asset description or usage notes" - }, - "width": { - "type": "integer", - "description": "Image/video width in pixels" - }, - "height": { - "type": "integer", - "description": "Image/video height in pixels" - }, - "duration_seconds": { - "type": "number", - "description": "Video/audio duration in seconds" - }, - "file_size_bytes": { - "type": "integer", - "description": "File size in bytes" - }, - "format": { - "type": "string", - "description": "File format (e.g., 'jpg', 'mp4', 'mp3')" - }, + "name": { "type": "string", "description": "Human-readable name" }, + "description": { "type": "string", "description": "Asset description or usage notes" }, + "width": { "type": "integer", "description": "Image/video width in pixels" }, + "height": { "type": "integer", "description": "Image/video height in pixels" }, + "duration_seconds": { "type": "number", "description": "Video/audio duration in seconds" }, + "file_size_bytes": { "type": "integer", "description": "File size in bytes" }, + "format": { "type": "string", "description": "File format (e.g., 'jpg', 'mp4', 'mp3')" }, "metadata": { "type": "object", "description": "Additional asset-specific metadata", "additionalProperties": true } }, - "required": [ - "asset_id", - "asset_type", - "url" - ], + "required": ["asset_id", "asset_type", "url"], "additionalProperties": true }, "property": { @@ -343,16 +200,7 @@ "properties": { "type": { "type": "string", - "enum": [ - "website", - "mobile_app", - "ctv_app", - "desktop_app", - "dooh", - "podcast", - "radio", - "streaming_audio" - ], + "enum": ["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "streaming_audio"], "description": "Property type" }, "identifier": { @@ -362,15 +210,7 @@ }, "store": { "type": "string", - "enum": [ - "apple", - "google", - "amazon", - "roku", - "samsung", - "lg", - "other" - ], + "enum": ["apple", "google", "amazon", "roku", "samsung", "lg", "other"], "description": "App store for mobile/CTV apps" }, "region": { @@ -385,46 +225,27 @@ }, "relationship": { "type": "string", - "enum": [ - "owned", - "direct", - "delegated", - "ad_network" - ], + "enum": ["owned", "direct", "delegated", "ad_network"], "default": "owned", - "description": "How this brand relates to the property, using the same vocabulary as adagents.json delegation_type. 'owned': the brand owns and operates this property (default). 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property \u2014 they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange \u2014 they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json." + "description": "How this brand relates to the property, using the same vocabulary as adagents.json delegation_type. 'owned': the brand owns and operates this property (default). 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property — they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange — they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json." } }, - "required": [ - "type", - "identifier" - ], + "required": ["type", "identifier"], "additionalProperties": true }, "product_catalog": { "type": "object", "description": "Product catalog for e-commerce brands", "properties": { - "feed_url": { - "type": "string", - "format": "uri", - "description": "URL to product catalog feed" - }, + "feed_url": { "type": "string", "format": "uri", "description": "URL to product catalog feed" }, "feed_format": { "type": "string", - "enum": [ - "google_merchant_center", - "facebook_catalog", - "openai_product_feed", - "custom" - ], + "enum": ["google_merchant_center", "facebook_catalog", "openai_product_feed", "custom"], "description": "Format of the product feed" }, "categories": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Product categories available in the catalog" }, "last_updated": { @@ -434,49 +255,56 @@ }, "update_frequency": { "type": "string", - "enum": [ - "realtime", - "hourly", - "daily", - "weekly" - ], + "enum": ["realtime", "hourly", "daily", "weekly"], "description": "How frequently the product catalog is updated" }, "agentic_checkout": { "type": "object", "description": "Agentic checkout endpoint configuration", "properties": { - "endpoint": { - "type": "string", - "format": "uri", - "description": "Base URL for checkout session API" - }, - "spec": { - "type": "string", - "enum": [ - "openai_agentic_checkout_v1" - ], - "description": "Checkout API specification" - }, + "endpoint": { "type": "string", "format": "uri", "description": "Base URL for checkout session API" }, + "spec": { "type": "string", "enum": ["openai_agentic_checkout_v1"], "description": "Checkout API specification" }, "supported_payment_providers": { "type": "array", "description": "Payment providers supported by this checkout endpoint", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, - "required": [ - "endpoint", - "spec" - ] + "required": ["endpoint", "spec"] } }, - "required": [ - "feed_url" - ], + "required": ["feed_url"], "additionalProperties": true }, + "data_subject_contestation": { + "type": "object", + "description": "Contact point where a data subject can request human intervention, express their view, or contest an automated decision — satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://", + "description": "HTTPS URL to a human-accessible contestation form or information page." + }, + "email": { + "type": "string", + "format": "email", + "description": "Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3))." + }, + "languages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns." + } + }, + "anyOf": [ + { "required": ["url"] }, + { "required": ["email"] } + ], + "additionalProperties": false + }, "brand": { "type": "object", "description": "A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id.", @@ -493,14 +321,10 @@ "names": { "type": "array", "description": "Localized brand names. Multiple entries per language allowed for aliases.", - "items": { - "$ref": "#/definitions/localized_name" - }, + "items": { "$ref": "#/definitions/localized_name" }, "minItems": 1 }, - "keller_type": { - "$ref": "#/definitions/keller_type" - }, + "keller_type": { "$ref": "#/definitions/keller_type" }, "parent_brand": { "$ref": "#/definitions/brand_id", "description": "Parent brand ID for sub-brands and endorsed brands" @@ -511,11 +335,9 @@ }, "industries": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "minItems": 1, - "description": "Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does \u2014 not what regulatory regimes apply (use policy_categories for that)." + "description": "Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does — not what regulatory regimes apply (use policy_categories for that)." }, "target_audience": { "type": "string", @@ -523,17 +345,11 @@ }, "logos": { "type": "array", - "items": { - "$ref": "#/definitions/logo" - }, + "items": { "$ref": "#/definitions/logo" }, "description": "Brand logo assets" }, - "colors": { - "$ref": "#/definitions/colors" - }, - "fonts": { - "$ref": "#/definitions/fonts" - }, + "colors": { "$ref": "#/definitions/colors" }, + "fonts": { "$ref": "#/definitions/fonts" }, "tone": { "description": "Brand voice and messaging tone guidelines", "oneOf": [ @@ -545,30 +361,21 @@ "type": "object", "description": "Structured brand voice guidelines", "properties": { - "voice": { - "type": "string", - "description": "High-level voice descriptor (e.g., 'warm and inviting', 'professional and trustworthy')" - }, + "voice": { "type": "string", "description": "High-level voice descriptor (e.g., 'warm and inviting', 'professional and trustworthy')" }, "attributes": { "type": "array", "description": "Personality traits that characterize the brand voice", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "dos": { "type": "array", "description": "Guidance for copy generation - what TO do", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "donts": { "type": "array", "description": "Guardrails to avoid brand violations - what NOT to do", - "items": { - "type": "string" - } + "items": { "type": "string" } } } } @@ -583,9 +390,7 @@ { "type": "array", "description": "Localized taglines with BCP 47 locale codes", - "items": { - "$ref": "#/definitions/localized_name" - }, + "items": { "$ref": "#/definitions/localized_name" }, "minItems": 1 } ], @@ -593,45 +398,33 @@ }, "assets": { "type": "array", - "items": { - "$ref": "#/definitions/asset" - }, + "items": { "$ref": "#/definitions/asset" }, "description": "Brand asset library" }, "properties": { "type": "array", - "items": { - "$ref": "#/definitions/property" - }, - "description": "Digital properties associated with this brand \u2014 owned, managed, or represented" - }, - "product_catalog": { - "$ref": "#/definitions/product_catalog" + "items": { "$ref": "#/definitions/property" }, + "description": "Digital properties associated with this brand — owned, managed, or represented" }, + "product_catalog": { "$ref": "#/definitions/product_catalog" }, "privacy_policy_url": { "type": "string", "format": "uri", "description": "URL to the brand's privacy policy" }, + "data_subject_contestation": { + "$ref": "#/definitions/data_subject_contestation" + }, "disclaimers": { "type": "array", "items": { "type": "object", "properties": { - "text": { - "type": "string" - }, - "context": { - "type": "string" - }, - "required": { - "type": "boolean", - "default": true - } + "text": { "type": "string" }, + "context": { "type": "string" }, + "required": { "type": "boolean", "default": true } }, - "required": [ - "text" - ] + "required": ["text"] }, "description": "Legal disclaimers for creatives" }, @@ -639,16 +432,9 @@ "type": "object", "description": "TTS voice synthesis configuration for AI-generated audio", "properties": { - "provider": { - "type": "string" - }, - "voice_id": { - "type": "string" - }, - "settings": { - "type": "object", - "additionalProperties": true - } + "provider": { "type": "string" }, + "voice_id": { "type": "string" }, + "settings": { "type": "object", "additionalProperties": true } }, "additionalProperties": true }, @@ -656,16 +442,9 @@ "type": "object", "description": "Visual avatar configuration", "properties": { - "provider": { - "type": "string" - }, - "avatar_id": { - "type": "string" - }, - "settings": { - "type": "object", - "additionalProperties": true - } + "provider": { "type": "string" }, + "avatar_id": { "type": "string" }, + "settings": { "type": "object", "additionalProperties": true } }, "additionalProperties": true }, @@ -691,15 +470,8 @@ "type": "object", "description": "Brand-level contact information", "properties": { - "email": { - "type": "string", - "format": "email", - "description": "Contact email" - }, - "phone": { - "type": "string", - "description": "Contact phone number" - } + "email": { "type": "string", "format": "email", "description": "Contact email" }, + "phone": { "type": "string", "description": "Contact phone number" } } }, "collections": { @@ -717,7 +489,7 @@ "description": "Human-readable collection name" }, "role": { - "$ref": "enums/talent-role.json", + "$ref": "/schemas/latest/enums/talent-role.json", "description": "This person's role on the collection" }, "seller_agent_url": { @@ -726,17 +498,12 @@ "description": "URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products." } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": true } } }, - "required": [ - "id", - "names" - ], + "required": ["id", "names"], "additionalProperties": true }, "house": { @@ -755,28 +522,23 @@ "names": { "type": "array", "description": "Localized house names including legal name, stock symbol, etc.", - "items": { - "$ref": "#/definitions/localized_name" - } + "items": { "$ref": "#/definitions/localized_name" } }, "architecture": { "type": "string", - "enum": [ - "branded_house", - "house_of_brands", - "hybrid" - ], + "enum": ["branded_house", "house_of_brands", "hybrid"], "description": "Brand architecture model: branded_house (Google), house_of_brands (P&G), hybrid (Nike)" }, "agents": { "$ref": "#/definitions/agents", "description": "House-level agents that apply to all brands unless overridden at the brand level" + }, + "data_subject_contestation": { + "$ref": "#/definitions/data_subject_contestation", + "description": "House-level fallback contestation contact. Governance agents resolve in order: brand.data_subject_contestation → house.data_subject_contestation → missing (critical finding when human review required)." } }, - "required": [ - "domain", - "name" - ], + "required": ["domain", "name"], "additionalProperties": true }, "brand_agent": { @@ -795,10 +557,7 @@ "pattern": "^[a-z0-9_]+$" } }, - "required": [ - "url", - "id" - ], + "required": ["url", "id"], "additionalProperties": true }, "rights_agent": { @@ -819,17 +578,13 @@ "available_uses": { "type": "array", "description": "Rights uses available for licensing through this agent", - "items": { - "$ref": "enums/right-use.json" - }, + "items": { "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, "right_types": { "type": "array", "description": "Types of rights available", - "items": { - "$ref": "enums/right-type.json" - }, + "items": { "$ref": "/schemas/latest/enums/right-type.json" }, "minItems": 1 }, "countries": { @@ -841,11 +596,7 @@ } } }, - "required": [ - "url", - "id", - "available_uses" - ], + "required": ["url", "id", "available_uses"], "additionalProperties": true }, "brand_agent_entry": { @@ -853,7 +604,7 @@ "description": "An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.", "properties": { "type": { - "$ref": "enums/brand-agent-type.json", + "$ref": "/schemas/latest/enums/brand-agent-type.json", "description": "Functional role of this agent" }, "url": { @@ -896,17 +647,13 @@ "available_uses": { "type": "array", "description": "For rights agents: rights uses available for licensing", - "items": { - "$ref": "enums/right-use.json" - }, + "items": { "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, "right_types": { "type": "array", "description": "For rights agents: types of rights available", - "items": { - "$ref": "enums/right-type.json" - }, + "items": { "$ref": "/schemas/latest/enums/right-type.json" }, "minItems": 1 }, "countries": { @@ -918,19 +665,13 @@ } } }, - "required": [ - "type", - "url", - "id" - ], + "required": ["type", "url", "id"], "additionalProperties": true }, "agents": { "type": "array", "description": "Agents declared by this brand or house. One agent per type.", - "items": { - "$ref": "#/definitions/brand_agent_entry" - }, + "items": { "$ref": "#/definitions/brand_agent_entry" }, "maxItems": 20 }, "authorized_operator": { @@ -959,10 +700,7 @@ } } }, - "required": [ - "domain", - "brands" - ], + "required": ["domain", "brands"], "additionalProperties": true }, "photography_style": { @@ -971,12 +709,7 @@ "properties": { "realism": { "type": "string", - "enum": [ - "natural", - "stylized", - "hyperreal", - "abstract" - ], + "enum": ["natural", "stylized", "hyperreal", "abstract"], "description": "Level of photographic realism" }, "lighting": { @@ -985,29 +718,17 @@ }, "color_temperature": { "type": "string", - "enum": [ - "warm", - "neutral", - "cool" - ], + "enum": ["warm", "neutral", "cool"], "description": "Overall color temperature of photography" }, "contrast": { "type": "string", - "enum": [ - "low", - "medium", - "high" - ], + "enum": ["low", "medium", "high"], "description": "Contrast level in photography" }, "depth_of_field": { "type": "string", - "enum": [ - "shallow", - "medium", - "deep" - ], + "enum": ["shallow", "medium", "deep"], "description": "Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus" }, "subject": { @@ -1018,19 +739,11 @@ "type": "object", "description": "People photography guidelines", "properties": { - "age_range": { - "type": "string", - "description": "Target age range (e.g., '20-35')" - }, - "diversity": { - "type": "string", - "description": "Diversity representation (e.g., 'mixed', 'varied')" - }, + "age_range": { "type": "string", "description": "Target age range (e.g., '20-35')" }, + "diversity": { "type": "string", "description": "Diversity representation (e.g., 'mixed', 'varied')" }, "mood": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Mood descriptors (e.g., ['confident', 'relaxed'])" } }, @@ -1038,12 +751,7 @@ }, "product_focus": { "type": "string", - "enum": [ - "in-use", - "isolated", - "lifestyle", - "detail" - ], + "enum": ["in-use", "isolated", "lifestyle", "detail"], "description": "How products are shown" }, "setting": { @@ -1082,9 +790,7 @@ }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Additional style descriptors" } }, @@ -1096,27 +802,12 @@ "properties": { "style_type": { "type": "string", - "enum": [ - "flat_illustration", - "geometric", - "gradient_mesh", - "editorial_collage", - "hand_drawn", - "minimal_line_art", - "3d_render", - "isometric", - "photographic_composite" - ], + "enum": ["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"], "description": "Primary graphic style" }, "stroke_style": { "type": "string", - "enum": [ - "rounded", - "square", - "mixed", - "none" - ], + "enum": ["rounded", "square", "mixed", "none"], "description": "Stroke end/join style" }, "stroke_weight": { @@ -1129,9 +820,7 @@ }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Additional style descriptors" } }, @@ -1139,7 +828,7 @@ }, "border_radius": { "type": "object", - "description": "Named border radius presets for UI components and layout elements. One of the most visible brand differentiators \u2014 Airbnb uses generous 20px, Stripe uses precise 4\u20138px, Spotify uses pill/999px.", + "description": "Named border radius presets for UI components and layout elements. One of the most visible brand differentiators — Airbnb uses generous 20px, Stripe uses precise 4–8px, Spotify uses pill/999px.", "properties": { "none": { "type": "string", @@ -1168,7 +857,7 @@ }, "elevation": { "type": "object", - "description": "Named shadow/elevation levels. Brands use elevation as identity \u2014 from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.", + "description": "Named shadow/elevation levels. Brands use elevation as identity — from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.", "properties": { "none": { "type": "string", @@ -1197,36 +886,18 @@ "properties": { "unit": { "type": "string", - "description": "Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational \u2014 agents should use the named scale values, not compute from this." + "description": "Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational — agents should use the named scale values, not compute from this." }, "scale": { "type": "object", "description": "Named spacing scale built from the base unit", "properties": { - "xs": { - "type": "string", - "description": "Extra small spacing (e.g., '4px')" - }, - "sm": { - "type": "string", - "description": "Small spacing (e.g., '8px')" - }, - "md": { - "type": "string", - "description": "Medium spacing (e.g., '16px')" - }, - "lg": { - "type": "string", - "description": "Large spacing (e.g., '24px')" - }, - "xl": { - "type": "string", - "description": "Extra large spacing (e.g., '32px')" - }, - "2xl": { - "type": "string", - "description": "Section-level spacing (e.g., '48px', '64px')" - } + "xs": { "type": "string", "description": "Extra small spacing (e.g., '4px')" }, + "sm": { "type": "string", "description": "Small spacing (e.g., '8px')" }, + "md": { "type": "string", "description": "Medium spacing (e.g., '16px')" }, + "lg": { "type": "string", "description": "Large spacing (e.g., '24px')" }, + "xl": { "type": "string", "description": "Extra large spacing (e.g., '32px')" }, + "2xl": { "type": "string", "description": "Section-level spacing (e.g., '48px', '64px')" } }, "additionalProperties": { "type": "string" @@ -1245,9 +916,7 @@ }, "secondary_shapes": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Secondary shapes in the brand vocabulary" }, "usage": { @@ -1274,14 +943,7 @@ "properties": { "style": { "type": "string", - "enum": [ - "outline", - "filled", - "duotone", - "flat", - "glyph", - "hand_drawn" - ], + "enum": ["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"], "description": "Icon rendering style" }, "stroke_weight": { @@ -1290,11 +952,7 @@ }, "corner_style": { "type": "string", - "enum": [ - "rounded", - "square", - "mixed" - ], + "enum": ["rounded", "square", "mixed"], "description": "Corner style for icon paths" }, "usage": { @@ -1325,12 +983,7 @@ "properties": { "gradient_style": { "type": "string", - "enum": [ - "linear", - "radial", - "conic", - "none" - ], + "enum": ["linear", "radial", "conic", "none"], "description": "Gradient type for overlays" }, "gradient_direction": { @@ -1350,23 +1003,12 @@ "properties": { "style": { "type": "string", - "enum": [ - "none", - "subtle_grain", - "noise", - "paper", - "fabric", - "concrete" - ], + "enum": ["none", "subtle_grain", "noise", "paper", "fabric", "concrete"], "description": "Texture style applied to creative assets" }, "intensity": { "type": "string", - "enum": [ - "low", - "medium", - "high" - ], + "enum": ["low", "medium", "high"], "description": "Texture intensity" } }, @@ -1380,15 +1022,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "solid_color", - "gradient", - "blurred_photo", - "image", - "video", - "pattern", - "transparent" - ] + "enum": ["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"] }, "description": "Permitted background types" } @@ -1406,39 +1040,19 @@ "type": "string", "description": "Colorway name (e.g., 'primary', 'inverted', 'subtle')" }, - "foreground": { - "$ref": "#/definitions/hex_color" - }, - "background": { - "$ref": "#/definitions/hex_color" - }, - "accent": { - "$ref": "#/definitions/hex_color" - }, - "border": { - "$ref": "#/definitions/hex_color" - }, - "cta_foreground": { - "$ref": "#/definitions/hex_color", - "description": "CTA text/icon color, if different from foreground" - }, - "cta_background": { - "$ref": "#/definitions/hex_color", - "description": "CTA button/container color, if different from accent" - }, + "foreground": { "$ref": "#/definitions/hex_color" }, + "background": { "$ref": "#/definitions/hex_color" }, + "accent": { "$ref": "#/definitions/hex_color" }, + "border": { "$ref": "#/definitions/hex_color" }, + "cta_foreground": { "$ref": "#/definitions/hex_color", "description": "CTA text/icon color, if different from foreground" }, + "cta_background": { "$ref": "#/definitions/hex_color", "description": "CTA button/container color, if different from accent" }, "channels": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways." } }, - "required": [ - "name", - "foreground", - "background" - ], + "required": ["name", "foreground", "background"], "additionalProperties": true }, "type_scale_entry": { @@ -1449,30 +1063,13 @@ "type": "string", "description": "Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback." }, - "size": { - "type": "string", - "description": "Font size (e.g., '48px', '2rem')" - }, - "weight": { - "type": "string", - "description": "Font weight (e.g., '700', 'bold')" - }, - "line_height": { - "type": "string", - "description": "Line height (e.g., '1.2', '56px')" - }, - "letter_spacing": { - "type": "string", - "description": "Letter spacing (e.g., '-0.02em', '0.5px')" - }, + "size": { "type": "string", "description": "Font size (e.g., '48px', '2rem')" }, + "weight": { "type": "string", "description": "Font weight (e.g., '700', 'bold')" }, + "line_height": { "type": "string", "description": "Line height (e.g., '1.2', '56px')" }, + "letter_spacing": { "type": "string", "description": "Letter spacing (e.g., '-0.02em', '0.5px')" }, "text_transform": { "type": "string", - "enum": [ - "none", - "uppercase", - "lowercase", - "capitalize" - ], + "enum": ["none", "uppercase", "lowercase", "capitalize"], "description": "Text transformation" } }, @@ -1484,23 +1081,12 @@ "properties": { "transition_style": { "type": "string", - "enum": [ - "cut", - "dissolve", - "slide", - "wipe", - "zoom", - "fade" - ], + "enum": ["cut", "dissolve", "slide", "wipe", "zoom", "fade"], "description": "Primary transition style between scenes" }, "animation_speed": { "type": "string", - "enum": [ - "slow", - "moderate", - "fast" - ], + "enum": ["slow", "moderate", "fast"], "description": "Overall animation pacing" }, "easing": { @@ -1509,23 +1095,12 @@ }, "text_entrance": { "type": "string", - "enum": [ - "fade", - "typewriter", - "slide_up", - "slide_left", - "scale", - "none" - ], + "enum": ["fade", "typewriter", "slide_up", "slide_left", "scale", "none"], "description": "How text enters the frame" }, "pacing": { "type": "string", - "enum": [ - "lingering", - "moderate", - "fast_cuts" - ], + "enum": ["lingering", "moderate", "fast_cuts"], "description": "Overall editing rhythm" }, "kinetic_typography": { @@ -1534,9 +1109,7 @@ }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Additional motion style descriptors" } }, @@ -1548,15 +1121,7 @@ "properties": { "preferred_position": { "type": "string", - "enum": [ - "top-left", - "top-center", - "top-right", - "bottom-left", - "bottom-center", - "bottom-right", - "center" - ], + "enum": ["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"], "description": "Preferred logo position in layouts" }, "min_clear_space": { @@ -1569,11 +1134,7 @@ }, "background_contrast": { "type": "string", - "enum": [ - "light_only", - "dark_only", - "any" - ], + "enum": ["light_only", "dark_only", "any"], "description": "Permitted background contrast behind logo" } }, @@ -1589,15 +1150,7 @@ }, "type": { "type": "string", - "enum": [ - "border", - "divider", - "frame", - "watermark", - "pattern", - "texture_overlay", - "decorative" - ], + "enum": ["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"], "description": "Element type" }, "description": { @@ -1606,18 +1159,12 @@ }, "orientation": { "type": "string", - "enum": [ - "horizontal", - "vertical", - "any" - ], + "enum": ["horizontal", "vertical", "any"], "description": "Preferred orientation when used in layouts" }, "colors": { "type": "array", - "items": { - "$ref": "#/definitions/hex_color" - }, + "items": { "$ref": "#/definitions/hex_color" }, "description": "Colors this element may appear in" }, "max_per_layout": { @@ -1625,9 +1172,7 @@ "description": "Maximum instances per layout" } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": true }, "asset_library": { @@ -1640,13 +1185,7 @@ }, "type": { "type": "string", - "enum": [ - "icon_set", - "illustration_system", - "image_library", - "video_library", - "template_library" - ], + "enum": ["icon_set", "illustration_system", "image_library", "video_library", "template_library"], "description": "Type of asset library" }, "url": { @@ -1664,9 +1203,7 @@ "properties": { "roles": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)" }, "palettes": { @@ -1680,16 +1217,11 @@ }, "colors": { "type": "object", - "additionalProperties": { - "$ref": "#/definitions/hex_color" - }, + "additionalProperties": { "$ref": "#/definitions/hex_color" }, "description": "Map of role names to hex color values" } }, - "required": [ - "name", - "colors" - ], + "required": ["name", "colors"], "additionalProperties": true }, "description": "Named color palettes mapping roles to specific colors" @@ -1698,58 +1230,31 @@ "additionalProperties": true } }, - "required": [ - "name", - "url" - ], + "required": ["name", "url"], "additionalProperties": true }, "visual_guidelines": { "type": "object", "description": "Structured visual rules for generative creative systems. Defines how brand photography, graphics, typography, and composition should be produced to maintain brand consistency at scale.", "properties": { - "photography": { - "$ref": "#/definitions/photography_style" - }, - "graphic_style": { - "$ref": "#/definitions/graphic_style" - }, - "shapes": { - "$ref": "#/definitions/brand_shapes" - }, - "iconography": { - "$ref": "#/definitions/iconography" - }, - "composition": { - "$ref": "#/definitions/composition_rules" - }, - "border_radius": { - "$ref": "#/definitions/border_radius" - }, - "elevation": { - "$ref": "#/definitions/elevation" - }, - "spacing": { - "$ref": "#/definitions/spacing" - }, + "photography": { "$ref": "#/definitions/photography_style" }, + "graphic_style": { "$ref": "#/definitions/graphic_style" }, + "shapes": { "$ref": "#/definitions/brand_shapes" }, + "iconography": { "$ref": "#/definitions/iconography" }, + "composition": { "$ref": "#/definitions/composition_rules" }, + "border_radius": { "$ref": "#/definitions/border_radius" }, + "elevation": { "$ref": "#/definitions/elevation" }, + "spacing": { "$ref": "#/definitions/spacing" }, "graphic_elements": { "type": "array", - "items": { - "$ref": "#/definitions/graphic_element" - }, + "items": { "$ref": "#/definitions/graphic_element" }, "description": "Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)" }, - "motion": { - "$ref": "#/definitions/motion_guidelines" - }, - "logo_placement": { - "$ref": "#/definitions/logo_placement" - }, + "motion": { "$ref": "#/definitions/motion_guidelines" }, + "logo_placement": { "$ref": "#/definitions/logo_placement" }, "colorways": { "type": "array", - "items": { - "$ref": "#/definitions/colorway" - }, + "items": { "$ref": "#/definitions/colorway" }, "description": "Named color pairings for consistent foreground/background combinations" }, "type_scale": { @@ -1760,38 +1265,22 @@ "type": "string", "description": "Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes." }, - "heading": { - "$ref": "#/definitions/type_scale_entry" - }, - "subheading": { - "$ref": "#/definitions/type_scale_entry" - }, - "body": { - "$ref": "#/definitions/type_scale_entry" - }, - "caption": { - "$ref": "#/definitions/type_scale_entry" - }, - "cta": { - "$ref": "#/definitions/type_scale_entry" - } + "heading": { "$ref": "#/definitions/type_scale_entry" }, + "subheading": { "$ref": "#/definitions/type_scale_entry" }, + "body": { "$ref": "#/definitions/type_scale_entry" }, + "caption": { "$ref": "#/definitions/type_scale_entry" }, + "cta": { "$ref": "#/definitions/type_scale_entry" } }, - "additionalProperties": { - "$ref": "#/definitions/type_scale_entry" - } + "additionalProperties": { "$ref": "#/definitions/type_scale_entry" } }, "asset_libraries": { "type": "array", - "items": { - "$ref": "#/definitions/asset_library" - }, + "items": { "$ref": "#/definitions/asset_library" }, "description": "References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation." }, "restrictions": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')" } }, @@ -1801,23 +1290,11 @@ "type": "object", "description": "Contact information", "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "email": { - "type": "string", - "format": "email", - "maxLength": 255 - }, - "domain": { - "$ref": "#/definitions/domain" - } + "name": { "type": "string", "minLength": 1, "maxLength": 255 }, + "email": { "type": "string", "format": "email", "maxLength": 255 }, + "domain": { "$ref": "#/definitions/domain" } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": true } }, @@ -1827,23 +1304,16 @@ "title": "Authoritative Location Redirect", "description": "Redirects to a hosted brand.json file at another URL", "properties": { - "$schema": { - "type": "string" - }, + "$schema": { "type": "string" }, "authoritative_location": { "type": "string", "format": "uri", "pattern": "^https://", "description": "HTTPS URL of the authoritative brand.json file" }, - "last_updated": { - "type": "string", - "format": "date-time" - } + "last_updated": { "type": "string", "format": "date-time" } }, - "required": [ - "authoritative_location" - ], + "required": ["authoritative_location"], "additionalProperties": false }, { @@ -1851,9 +1321,7 @@ "title": "House Redirect", "description": "Redirects to the house domain that contains the full brand portfolio", "properties": { - "$schema": { - "type": "string" - }, + "$schema": { "type": "string" }, "house": { "$ref": "#/definitions/domain", "description": "House domain to fetch brand portfolio from" @@ -1863,17 +1331,10 @@ "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code if this is a regional domain" }, - "note": { - "type": "string" - }, - "last_updated": { - "type": "string", - "format": "date-time" - } + "note": { "type": "string" }, + "last_updated": { "type": "string", "format": "date-time" } }, - "required": [ - "house" - ], + "required": ["house"], "additionalProperties": false }, { @@ -1881,38 +1342,22 @@ "title": "Brand Agent", "description": "Brand represented by agents that provide brand info via MCP", "properties": { - "$schema": { - "type": "string" - }, - "version": { - "type": "string" - }, - "agents": { - "$ref": "#/definitions/agents" - }, + "$schema": { "type": "string" }, + "version": { "type": "string" }, + "agents": { "$ref": "#/definitions/agents" }, "brand_agent": { "$ref": "#/definitions/brand_agent", "deprecated": true }, - "contact": { - "$ref": "#/definitions/contact" + "contact": { "$ref": "#/definitions/contact" }, + "data_subject_contestation": { + "$ref": "#/definitions/data_subject_contestation" }, - "last_updated": { - "type": "string", - "format": "date-time" - } + "last_updated": { "type": "string", "format": "date-time" } }, "anyOf": [ - { - "required": [ - "agents" - ] - }, - { - "required": [ - "brand_agent" - ] - } + { "required": ["agents"] }, + { "required": ["brand_agent"] } ], "additionalProperties": false }, @@ -1921,65 +1366,37 @@ "title": "House Portfolio", "description": "Full house/brand portfolio with hierarchy, creative assets, and properties", "properties": { - "$schema": { - "type": "string" - }, - "version": { - "type": "string" - }, - "house": { - "$ref": "#/definitions/house" - }, + "$schema": { "type": "string" }, + "version": { "type": "string" }, + "house": { "$ref": "#/definitions/house" }, "brands": { "type": "array", "description": "Brands owned by this house", - "items": { - "$ref": "#/definitions/brand" - }, + "items": { "$ref": "#/definitions/brand" }, "minItems": 1 }, - "contact": { - "$ref": "#/definitions/contact" - }, + "contact": { "$ref": "#/definitions/contact" }, "authorized_operators": { "type": "array", "description": "Entities authorized to represent brands from this house. Third parties (sellers, platforms) can verify an operator's authorization by checking this list. Operators are identified by domain.", - "items": { - "$ref": "#/definitions/authorized_operator" - } + "items": { "$ref": "#/definitions/authorized_operator" } }, "trademarks": { "type": "array", "items": { "type": "object", "properties": { - "registry": { - "type": "string" - }, - "number": { - "type": "string" - }, - "mark": { - "type": "string" - } + "registry": { "type": "string" }, + "number": { "type": "string" }, + "mark": { "type": "string" } }, - "required": [ - "registry", - "number", - "mark" - ], + "required": ["registry", "number", "mark"], "additionalProperties": true } }, - "last_updated": { - "type": "string", - "format": "date-time" - } + "last_updated": { "type": "string", "format": "date-time" } }, - "required": [ - "house", - "brands" - ], + "required": ["house", "brands"], "additionalProperties": false } ], @@ -2018,11 +1435,7 @@ "id": "pg_governance", "description": "Brand safety and compliance for all P&G brands", "jwks_uri": "https://agents.pg.com/.well-known/jwks.json", - "scope": [ - "spend_authority", - "delivery_monitor", - "brand_safety" - ] + "scope": ["spend_authority", "delivery_monitor", "brand_safety"] } ] }, @@ -2030,21 +1443,9 @@ { "id": "tide", "url": "https://tide.com", - "names": [ - { - "en_US": "Tide" - }, - { - "es_MX": "Tide" - }, - { - "zh_CN": "\u6c70\u6e0d" - } - ], + "names": [{"en_US": "Tide"}, {"es_MX": "Tide"}, {"zh_CN": "汰渍"}], "keller_type": "master", - "industries": [ - "cpg" - ], + "industries": ["cpg"], "description": "Laundry detergent brand", "logos": [ { @@ -2062,40 +1463,14 @@ "usage": "Full lockup for dark backgrounds" } ], - "colors": { - "primary": "#FF6600", - "secondary": "#0066CC", - "background": "#FFFFFF", - "text": "#1A1A1A", - "heading": "#FF6600", - "body": "#333333", - "label": "#666666", - "border": "#E5E5E5", - "divider": "#F0F0F0", - "surface_1": "#F9F9F9", - "surface_2": "#EFEFEF" - }, + "colors": {"primary": "#FF6600", "secondary": "#0066CC", "background": "#FFFFFF", "text": "#1A1A1A", "heading": "#FF6600", "body": "#333333", "label": "#666666", "border": "#E5E5E5", "divider": "#F0F0F0", "surface_1": "#F9F9F9", "surface_2": "#EFEFEF"}, "tone": { "voice": "clean, fresh, trustworthy", - "attributes": [ - "reliable", - "family-friendly", - "confident" - ], - "dos": [ - "Use simple, direct language", - "Emphasize cleaning power" - ], - "donts": [ - "Avoid technical jargon", - "Don't be overly serious" - ] + "attributes": ["reliable", "family-friendly", "confident"], + "dos": ["Use simple, direct language", "Emphasize cleaning power"], + "donts": ["Avoid technical jargon", "Don't be overly serious"] }, - "tagline": [ - { - "en_US": "Tide's In, Dirt's Out" - } - ], + "tagline": [{"en_US": "Tide's In, Dirt's Out"}], "visual_guidelines": { "photography": { "realism": "natural", @@ -2107,11 +1482,7 @@ "people": { "age_range": "25-45", "diversity": "mixed", - "mood": [ - "confident", - "relaxed", - "happy" - ] + "mood": ["confident", "relaxed", "happy"] }, "product_focus": "in-use", "setting": "indoor" @@ -2121,11 +1492,7 @@ "crop_style": "waist-up", "perspective": "eye-level" }, - "preferred_aspect_ratios": [ - "16:9", - "4:5", - "1:1" - ] + "preferred_aspect_ratios": ["16:9", "4:5", "1:1"] }, "graphic_style": { "style_type": "flat_illustration", @@ -2135,9 +1502,7 @@ }, "shapes": { "primary_shape": "circle", - "secondary_shapes": [ - "rounded_rectangle" - ], + "secondary_shapes": ["rounded_rectangle"], "usage": { "max_per_layout": 2, "overlap_allowed": false @@ -2162,11 +1527,7 @@ "style": "none" }, "backgrounds": { - "types_allowed": [ - "solid_color", - "gradient", - "blurred_photo" - ] + "types_allowed": ["solid_color", "gradient", "blurred_photo"] } }, "border_radius": { @@ -2258,16 +1619,8 @@ ] }, "properties": [ - { - "type": "website", - "identifier": "tide.com", - "primary": true - }, - { - "type": "mobile_app", - "store": "apple", - "identifier": "com.pg.tide" - } + {"type": "website", "identifier": "tide.com", "primary": true}, + {"type": "mobile_app", "store": "apple", "identifier": "com.pg.tide"} ], "contact": { "email": "brands@pg.com" @@ -2276,15 +1629,9 @@ { "id": "pampers", "url": "https://pampers.com", - "names": [ - { - "en_US": "Pampers" - } - ], + "names": [{"en_US": "Pampers"}], "keller_type": "master", - "industries": [ - "cpg" - ], + "industries": ["cpg"], "logos": [ { "url": "https://cdn.pg.com/pampers/logo.png", @@ -2292,15 +1639,9 @@ "variant": "primary" } ], - "colors": { - "primary": "#00A0D2" - }, + "colors": {"primary": "#00A0D2"}, "properties": [ - { - "type": "website", - "identifier": "pampers.com", - "primary": true - } + {"type": "website", "identifier": "pampers.com", "primary": true} ] } ], @@ -2322,17 +1663,7 @@ { "id": "nike", "url": "https://nike.com", - "names": [ - { - "en_US": "Nike" - }, - { - "zh_CN": "\u8010\u514b" - }, - { - "ja_JP": "\u30ca\u30a4\u30ad" - } - ], + "names": [{"en_US": "Nike"}, {"zh_CN": "耐克"}, {"ja_JP": "ナイキ"}], "keller_type": "master", "logos": [ { @@ -2350,48 +1681,19 @@ "usage": "Full logo with wordmark for light backgrounds" } ], - "colors": { - "primary": "#111111", - "accent": "#FF6600" - }, + "colors": {"primary": "#111111", "accent": "#FF6600"}, "tone": "inspirational, bold, athletic", - "tagline": [ - { - "en_US": "Just Do It" - } - ], + "tagline": [{"en_US": "Just Do It"}], "properties": [ - { - "type": "website", - "identifier": "nike.com", - "primary": true - }, - { - "type": "website", - "identifier": "nike.cn", - "region": "CN" - }, - { - "type": "mobile_app", - "store": "apple", - "identifier": "com.nike.omega" - } + {"type": "website", "identifier": "nike.com", "primary": true}, + {"type": "website", "identifier": "nike.cn", "region": "CN"}, + {"type": "mobile_app", "store": "apple", "identifier": "com.nike.omega"} ] }, { "id": "air_jordan", "url": "https://jordan.com", - "names": [ - { - "en_US": "Air Jordan" - }, - { - "en_US": "Jordan" - }, - { - "en_US": "Jumpman" - } - ], + "names": [{"en_US": "Air Jordan"}, {"en_US": "Jordan"}, {"en_US": "Jumpman"}], "keller_type": "endorsed", "parent_brand": "nike", "logos": [ @@ -2402,20 +1704,10 @@ "variant": "icon" } ], - "colors": { - "primary": "#CE1141", - "secondary": "#111111" - }, + "colors": {"primary": "#CE1141", "secondary": "#111111"}, "properties": [ - { - "type": "website", - "identifier": "jordan.com", - "primary": true - }, - { - "type": "website", - "identifier": "jumpman23.com" - } + {"type": "website", "identifier": "jordan.com", "primary": true}, + {"type": "website", "identifier": "jumpman23.com"} ], "brand_agent": { "url": "https://dam.nike.com/mcp", @@ -2425,11 +1717,7 @@ { "id": "converse", "url": "https://converse.com", - "names": [ - { - "en_US": "Converse" - } - ], + "names": [{"en_US": "Converse"}], "keller_type": "independent", "logos": [ { @@ -2439,42 +1727,24 @@ } ], "properties": [ - { - "type": "website", - "identifier": "converse.com", - "primary": true - } + {"type": "website", "identifier": "converse.com", "primary": true} ] } ], "authorized_operators": [ { "domain": "wpp.com", - "brands": [ - "nike", - "air_jordan" - ], - "countries": [ - "US", - "GB", - "DE", - "FR" - ] + "brands": ["nike", "air_jordan"], + "countries": ["US", "GB", "DE", "FR"] }, { "domain": "dentsu.co.jp", - "brands": [ - "nike" - ], - "countries": [ - "JP" - ] + "brands": ["nike"], + "countries": ["JP"] }, { "domain": "nike.com", - "brands": [ - "*" - ] + "brands": ["*"] } ], "last_updated": "2026-01-15T10:00:00Z" @@ -2491,33 +1761,13 @@ { "id": "mediavine", "url": "https://mediavine.com", - "names": [ - { - "en_US": "Mediavine" - } - ], + "names": [{"en_US": "Mediavine"}], "keller_type": "master", "properties": [ - { - "type": "website", - "identifier": "mediavine.com", - "primary": true - }, - { - "type": "website", - "identifier": "thehollywoodgossip.com", - "relationship": "delegated" - }, - { - "type": "website", - "identifier": "foodfanatic.com", - "relationship": "delegated" - }, - { - "type": "website", - "identifier": "thebiglead.com", - "relationship": "delegated" - } + {"type": "website", "identifier": "mediavine.com", "primary": true}, + {"type": "website", "identifier": "thehollywoodgossip.com", "relationship": "delegated"}, + {"type": "website", "identifier": "foodfanatic.com", "relationship": "delegated"}, + {"type": "website", "identifier": "thebiglead.com", "relationship": "delegated"} ], "agents": [ { @@ -2531,4 +1781,4 @@ "last_updated": "2026-01-15T10:00:00Z" } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand/acquire-rights-request.json b/schemas/cache/brand/acquire-rights-request.json index 24805599c..0b0ce57d1 100644 --- a/schemas/cache/brand/acquire-rights-request.json +++ b/schemas/cache/brand/acquire-rights-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/acquire-rights-request.json", "title": "Acquire Rights Request", - "description": "Binding contractual request to acquire rights from a brand agent. Parallels create_media_buy \u2014 the buyer selects a pricing_option_id from a get_rights response and provides campaign details. The agent clears against existing contracts and returns terms, generation credentials, and disclosure requirements.", + "description": "Binding contractual request to acquire rights from a brand agent. Parallels create_media_buy — the buyer selects a pricing_option_id from a get_rights response and provides campaign details. The agent clears against existing contracts and returns terms, generation credentials, and disclosure requirements.", "type": "object", "properties": { "adcp_major_version": { @@ -19,7 +20,7 @@ "description": "Selected pricing option from the rights offering" }, "buyer": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "The buyer's brand identity" }, "campaign": { @@ -34,7 +35,7 @@ "type": "array", "description": "Specific rights uses for this campaign", "items": { - "$ref": "../enums/right-use.json" + "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, @@ -50,7 +51,7 @@ "type": "array", "description": "Creative formats that will be produced", "items": { - "$ref": "../core/format-id.json" + "$ref": "/schemas/latest/core/format-id.json" } }, "estimated_impressions": { @@ -76,11 +77,11 @@ "additionalProperties": true }, "revocation_webhook": { - "$ref": "../core/push-notification-config.json", + "$ref": "/schemas/latest/core/push-notification-config.json", "description": "Webhook for rights revocation notifications. If the rights holder needs to revoke rights (talent scandal, contract violation, etc.), they POST a revocation-notification to this URL. The buyer is responsible for stopping creative delivery upon receipt." }, "push_notification_config": { - "$ref": "../core/push-notification-config.json", + "$ref": "/schemas/latest/core/push-notification-config.json", "description": "Webhook for async status updates if the acquisition requires approval. The rights agent sends a webhook notification when the status transitions to acquired or rejected." }, "idempotency_key": { @@ -91,10 +92,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -106,4 +107,4 @@ "revocation_webhook" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/acquire-rights-response.json b/schemas/cache/brand/acquire-rights-response.json index 07eb5ff1c..7fb8f4f6b 100644 --- a/schemas/cache/brand/acquire-rights-response.json +++ b/schemas/cache/brand/acquire-rights-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/acquire-rights-response.json", "title": "Acquire Rights Response", "description": "Result of a rights acquisition request. Returns one of three statuses: acquired (with terms and generation credentials), pending_approval (requires rights holder review), or rejected (with reason). Uses discriminated union on status field.", "type": "object", @@ -21,22 +22,20 @@ "description": "Brand identifier of the rights subject" }, "terms": { - "$ref": "rights-terms.json", + "$ref": "/schemas/latest/brand/rights-terms.json", "description": "Agreed contractual terms" }, "generation_credentials": { "type": "array", "description": "Scoped credentials for generating rights-cleared content", "items": { - "$ref": "../core/generation-credential.json" + "$ref": "/schemas/latest/core/generation-credential.json" } }, "restrictions": { "type": "array", "description": "Usage restrictions and requirements", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "disclosure": { "type": "object", @@ -51,13 +50,11 @@ "description": "Disclosure text to include with the creative" } }, - "required": [ - "required" - ], + "required": ["required"], "additionalProperties": true }, "approval_webhook": { - "$ref": "../core/push-notification-config.json", + "$ref": "/schemas/latest/core/push-notification-config.json", "description": "Authenticated webhook for submitting creatives for approval. POST a creative-approval-request to the URL using the provided authentication. The response is a creative-approval-response." }, "usage_reporting_url": { @@ -66,30 +63,19 @@ "description": "Endpoint for reporting usage against these rights" }, "rights_constraint": { - "$ref": "../core/rights-constraint.json", - "description": "Pre-built rights constraint for embedding in creative manifests. Populated from the agreed terms \u2014 the buyer does not need to construct it manually." + "$ref": "/schemas/latest/core/rights-constraint.json", + "description": "Pre-built rights constraint for embedding in creative manifests. Populated from the agreed terms — the buyer does not need to construct it manually." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "rights_id", - "status", - "brand_id", - "terms", - "generation_credentials", - "rights_constraint" - ], + "required": ["rights_id", "status", "brand_id", "terms", "generation_credentials", "rights_constraint"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "AcquireRightsPendingApproval", @@ -114,23 +100,15 @@ "description": "Expected time for approval decision (e.g., '48h', '3 business days')" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "rights_id", - "status", - "brand_id" - ], + "required": ["rights_id", "status", "brand_id"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "AcquireRightsRejected", @@ -148,65 +126,46 @@ }, "reason": { "type": "string", - "description": "Why the rights request was rejected. May be sanitized to protect confidential brand rules \u2014 e.g., 'This violates our public figures brand guidelines' rather than naming the specific rule." + "description": "Why the rights request was rejected. May be sanitized to protect confidential brand rules — e.g., 'This violates our public figures brand guidelines' rather than naming the specific rule." }, "suggestions": { "type": "array", - "description": "Actionable alternatives the buyer can try. If present, the rejection is fixable \u2014 the buyer can adjust their request. If absent, the rejection is final for this talent/rights combination.", - "items": { - "type": "string" - } + "description": "Actionable alternatives the buyer can try. If present, the rejection is fixable — the buyer can adjust their request. If absent, the rejection is final for this talent/rights combination.", + "items": { "type": "string" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "rights_id", - "status", - "brand_id", - "reason" - ], + "required": ["rights_id", "status", "brand_id", "reason"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "AcquireRightsError", "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "status" - ] - } + { "required": ["status"] } ] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand/creative-approval-request.json b/schemas/cache/brand/creative-approval-request.json index cf2eaf43d..7be0690d3 100644 --- a/schemas/cache/brand/creative-approval-request.json +++ b/schemas/cache/brand/creative-approval-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/creative-approval-request.json", "title": "Creative Approval Request", "description": "Payload submitted by the buyer to the approval_webhook URL from acquire_rights. Contains the creative for rights holder review before distribution.", "type": "object", @@ -24,7 +25,7 @@ "description": "URL where the creative asset can be retrieved for review" }, "creative_format": { - "$ref": "../core/format-id.json", + "$ref": "/schemas/latest/core/format-id.json", "description": "Format of the creative being submitted" }, "description": { @@ -44,10 +45,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -56,4 +57,4 @@ "creative_url" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/creative-approval-response.json b/schemas/cache/brand/creative-approval-response.json index 18cf23137..037668a3b 100644 --- a/schemas/cache/brand/creative-approval-response.json +++ b/schemas/cache/brand/creative-approval-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/creative-approval-response.json", "title": "Creative Approval Response", "description": "Response from the approval_webhook after reviewing a submitted creative. Uses discriminated union on status field: approved, rejected, or pending_review.", "type": "object", @@ -30,27 +31,18 @@ "conditions": { "type": "array", "description": "Conditions on the approval (e.g., 'approved for NL market only')", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "status", - "rights_id" - ], + "required": ["status", "rights_id"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "CreativeRejected", @@ -78,28 +70,18 @@ "suggestions": { "type": "array", "description": "Actionable feedback for revision. If present, the buyer can revise and resubmit the creative. If absent, the rejection is final for this creative concept.", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "status", - "rights_id", - "reason" - ], + "required": ["status", "rights_id", "reason"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "CreativePendingReview", @@ -130,53 +112,38 @@ "description": "URL to poll for updated approval status. GET this URL to receive a creative-approval-response. Poll at reasonable intervals (suggested: every 5 minutes, back off after 1 hour to every 30 minutes). Stop polling after estimated_response_time has elapsed and the status is still pending_review." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "status", - "rights_id" - ], + "required": ["status", "rights_id"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "CreativeApprovalError", "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "status" - ] - } + { "required": ["status"] } ] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand/get-brand-identity-request.json b/schemas/cache/brand/get-brand-identity-request.json index 554e5bebd..ffe611238 100644 --- a/schemas/cache/brand/get-brand-identity-request.json +++ b/schemas/cache/brand/get-brand-identity-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/get-brand-identity-request.json", "title": "Get Brand Identity Request", "description": "Request brand identity data from a brand agent. Core identity (house, names, description, logos) is always public. Linked accounts get deeper data: high-res assets, voice configs, tone guidelines, and rights availability.", "type": "object", @@ -41,14 +42,14 @@ "description": "Intended use case, so the agent can tailor the response. A 'voice_synthesis' use case returns voice configs; a 'likeness' use case returns high-res photos and appearance guidelines." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "brand_id" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/get-brand-identity-response.json b/schemas/cache/brand/get-brand-identity-response.json index 160a6ccf9..58dbe701a 100644 --- a/schemas/cache/brand/get-brand-identity-response.json +++ b/schemas/cache/brand/get-brand-identity-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/get-brand-identity-response.json", "title": "Get Brand Identity Response", "description": "Brand identity data from a brand agent. Core identity (house, names, description, logos) is always public. Authorized callers receive richer data (high-res assets, voice synthesis, tone guidelines, rights availability). Includes available_fields to signal what the caller could unlock by linking their account.", "type": "object", @@ -24,10 +25,7 @@ "description": "House display name" } }, - "required": [ - "domain", - "name" - ], + "required": ["domain", "name"], "additionalProperties": true }, "names": { @@ -47,20 +45,13 @@ }, "industries": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "minItems": 1, "description": "Brand industries." }, "keller_type": { "type": "string", - "enum": [ - "master", - "sub_brand", - "endorsed", - "independent" - ], + "enum": ["master", "sub_brand", "endorsed", "independent"], "description": "Brand architecture type: master (primary brand of house), sub_brand (carries parent name), endorsed (independent identity backed by parent), independent (operates separately)" }, "logos": { @@ -69,64 +60,32 @@ "items": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "URL to the logo asset" - }, + "url": { "type": "string", "format": "uri", "description": "URL to the logo asset" }, "orientation": { "type": "string", - "enum": [ - "square", - "horizontal", - "vertical", - "stacked" - ], + "enum": ["square", "horizontal", "vertical", "stacked"], "description": "Logo aspect ratio orientation" }, "background": { "type": "string", - "enum": [ - "dark-bg", - "light-bg", - "transparent-bg" - ], + "enum": ["dark-bg", "light-bg", "transparent-bg"], "description": "Background compatibility" }, "variant": { "type": "string", - "enum": [ - "primary", - "secondary", - "icon", - "wordmark", - "full-lockup" - ], + "enum": ["primary", "secondary", "icon", "wordmark", "full-lockup"], "description": "Logo variant type" }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Additional semantic tags" }, - "usage": { - "type": "string", - "description": "When to use this logo variant" - }, - "width": { - "type": "integer", - "description": "Width in pixels" - }, - "height": { - "type": "integer", - "description": "Height in pixels" - } + "usage": { "type": "string", "description": "When to use this logo variant" }, + "width": { "type": "integer", "description": "Width in pixels" }, + "height": { "type": "integer", "description": "Height in pixels" } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": true } }, @@ -134,86 +93,11 @@ "type": "object", "description": "Brand color palette. Each role accepts a single hex color or an array of hex colors. Shape matches brand.json colors definition.", "properties": { - "primary": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } - ] - }, - "secondary": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } - ] - }, - "accent": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } - ] - }, - "background": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } - ] - }, - "text": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - { - "type": "array", - "items": { - "type": "string", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "minItems": 1 - } - ] - } + "primary": { "oneOf": [{ "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }] }, + "secondary": { "oneOf": [{ "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }] }, + "accent": { "oneOf": [{ "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }] }, + "background": { "oneOf": [{ "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }] }, + "text": { "oneOf": [{ "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }] } }, "additionalProperties": true }, @@ -224,101 +108,56 @@ "definitions": { "font_role": { "oneOf": [ - { - "type": "string" - }, + { "type": "string" }, { "type": "object", "properties": { - "family": { - "type": "string", - "description": "CSS font-family name" - }, + "family": { "type": "string", "description": "CSS font-family name" }, "files": { "type": "array", "items": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "pattern": "^https://", - "description": "HTTPS URL to the font file" - }, - "weight": { - "type": "integer", - "minimum": 100, - "maximum": 900, - "description": "CSS numeric font-weight" - }, + "url": { "type": "string", "format": "uri", "pattern": "^https://", "description": "HTTPS URL to the font file" }, + "weight": { "type": "integer", "minimum": 100, "maximum": 900, "description": "CSS numeric font-weight" }, "weight_range": { "type": "array", - "items": { - "type": "integer", - "minimum": 100, - "maximum": 900 - }, + "items": { "type": "integer", "minimum": 100, "maximum": 900 }, "minItems": 2, "maxItems": 2, "description": "Variable font weight axis range as [min, max]" }, - "style": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "description": "CSS font-style" - } + "style": { "type": "string", "enum": ["normal", "italic", "oblique"], "description": "CSS font-style" } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": true }, "maxItems": 36 }, "opentype_features": { "type": "array", - "items": { - "type": "string", - "pattern": "^[a-z0-9]{4}$" - }, + "items": { "type": "string", "pattern": "^[a-z0-9]{4}$" }, "maxItems": 20, "description": "OpenType feature tags to enable (e.g., ['ss01', 'tnum'])" }, "fallbacks": { "type": "array", - "items": { - "type": "string", - "maxLength": 100 - }, + "items": { "type": "string", "maxLength": 100 }, "maxItems": 10, "description": "Ordered fallback font-family names for script coverage" } }, - "required": [ - "family" - ], + "required": ["family"], "additionalProperties": true } ] } }, "properties": { - "primary": { - "$ref": "#/oneOf/0/properties/fonts/definitions/font_role", - "description": "Primary font family" - }, - "secondary": { - "$ref": "#/oneOf/0/properties/fonts/definitions/font_role", - "description": "Secondary font family" - } + "primary": { "$ref": "#/oneOf/0/properties/fonts/definitions/font_role", "description": "Primary font family" }, + "secondary": { "$ref": "#/oneOf/0/properties/fonts/definitions/font_role", "description": "Secondary font family" } }, - "additionalProperties": { - "$ref": "#/oneOf/0/properties/fonts/definitions/font_role" - } + "additionalProperties": { "$ref": "#/oneOf/0/properties/fonts/definitions/font_role" } }, "visual_guidelines": { "type": "object", @@ -329,29 +168,20 @@ "type": "object", "description": "Brand voice and messaging guidelines", "properties": { - "voice": { - "type": "string", - "description": "Brand personality described as comma-separated adjectives (e.g., 'enthusiastic, warm, competitive')" - }, + "voice": { "type": "string", "description": "Brand personality described as comma-separated adjectives (e.g., 'enthusiastic, warm, competitive')" }, "attributes": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Personality traits that characterize the brand voice, used as prompt guidance" }, "dos": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Approved messaging approaches, content themes, and reference points" }, "donts": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Prohibited topics, competitor references, and phrasings to avoid" } }, @@ -384,12 +214,8 @@ "type": "object", "description": "Voice synthesis configuration for AI-generated audio", "properties": { - "provider": { - "type": "string" - }, - "voice_id": { - "type": "string" - }, + "provider": { "type": "string" }, + "voice_id": { "type": "string" }, "settings": { "type": "object", "additionalProperties": true @@ -403,60 +229,26 @@ "items": { "type": "object", "properties": { - "asset_id": { - "type": "string", - "description": "Unique identifier" - }, + "asset_id": { "type": "string", "description": "Unique identifier" }, "asset_type": { - "$ref": "../enums/asset-content-type.json", + "$ref": "/schemas/latest/enums/asset-content-type.json", "description": "Type of asset content" }, - "url": { - "type": "string", - "format": "uri", - "description": "URL to CDN-hosted asset file" - }, + "url": { "type": "string", "format": "uri", "description": "URL to CDN-hosted asset file" }, "tags": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "description": "Tags for discovery" }, - "name": { - "type": "string", - "description": "Human-readable name" - }, - "description": { - "type": "string", - "description": "Asset description or usage notes" - }, - "width": { - "type": "integer", - "description": "Image/video width in pixels" - }, - "height": { - "type": "integer", - "description": "Image/video height in pixels" - }, - "duration_seconds": { - "type": "number", - "description": "Video/audio duration in seconds" - }, - "file_size_bytes": { - "type": "integer", - "description": "File size in bytes" - }, - "format": { - "type": "string", - "description": "File format (e.g., 'jpg', 'mp4')" - } + "name": { "type": "string", "description": "Human-readable name" }, + "description": { "type": "string", "description": "Asset description or usage notes" }, + "width": { "type": "integer", "description": "Image/video width in pixels" }, + "height": { "type": "integer", "description": "Image/video height in pixels" }, + "duration_seconds": { "type": "number", "description": "Video/audio duration in seconds" }, + "file_size_bytes": { "type": "integer", "description": "File size in bytes" }, + "format": { "type": "string", "description": "File format (e.g., 'jpg', 'mp4')" } }, - "required": [ - "asset_id", - "asset_type", - "url" - ], + "required": ["asset_id", "asset_type", "url"], "additionalProperties": true } }, @@ -466,9 +258,7 @@ "properties": { "available_uses": { "type": "array", - "items": { - "$ref": "../enums/right-use.json" - } + "items": { "$ref": "/schemas/latest/enums/right-use.json" } }, "countries": { "type": "array", @@ -486,14 +276,10 @@ "pattern": "^[A-Z]{2}$" } }, - "exclusivity_model": { - "type": "string" - }, + "exclusivity_model": { "type": "string" }, "content_restrictions": { "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "additionalProperties": true @@ -520,64 +306,40 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "brand_id", - "house", - "names" - ], + "required": ["brand_id", "house", "names"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "GetBrandIdentityError", "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "brand_id" - ] - }, - { - "required": [ - "house" - ] - }, - { - "required": [ - "names" - ] - } + { "required": ["brand_id"] }, + { "required": ["house"] }, + { "required": ["names"] } ] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand/get-rights-request.json b/schemas/cache/brand/get-rights-request.json index d2766409c..af5ef8ed9 100644 --- a/schemas/cache/brand/get-rights-request.json +++ b/schemas/cache/brand/get-rights-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/get-rights-request.json", "title": "Get Rights Request", - "description": "Search for licensable rights across a brand agent's roster. Returns matches with pricing. Discovery is natural-language-first \u2014 no taxonomy for categories. The agent interprets intent from the query and filters based on the buyer's brand compatibility.", + "description": "Search for licensable rights across a brand agent's roster. Returns matches with pricing. Discovery is natural-language-first — no taxonomy for categories. The agent interprets intent from the query and filters based on the buyer's brand compatibility.", "type": "object", "properties": { "adcp_major_version": { @@ -19,12 +20,12 @@ "type": "array", "description": "Rights uses being requested. The agent returns options covering these uses, potentially bundled into composite pricing.", "items": { - "$ref": "../enums/right-use.json" + "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, "buyer_brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "The buyer's brand. The agent fetches the buyer's brand.json for compatibility filtering (e.g., dietary conflicts, competitor exclusions)." }, "countries": { @@ -40,7 +41,7 @@ "description": "Search within a specific brand's rights. If omitted, searches across the agent's full roster." }, "right_type": { - "$ref": "../enums/right-type.json", + "$ref": "/schemas/latest/enums/right-type.json", "description": "Filter by type of rights (talent, music, stock_media, etc.)" }, "include_excluded": { @@ -49,14 +50,14 @@ "default": false }, "pagination": { - "$ref": "../core/pagination-request.json", + "$ref": "/schemas/latest/core/pagination-request.json", "description": "Pagination parameters for large result sets" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -64,4 +65,4 @@ "uses" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/get-rights-response.json b/schemas/cache/brand/get-rights-response.json index f402b02f6..75823da17 100644 --- a/schemas/cache/brand/get-rights-response.json +++ b/schemas/cache/brand/get-rights-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/get-rights-response.json", "title": "Get Rights Response", "description": "Licensable rights matching the search criteria, with pricing options. Each result is a complete snapshot of current availability (stateless, DDEX PIE pattern). Excluded results explain why they were filtered out.", "type": "object", @@ -30,7 +31,7 @@ "description": "Description of the rights subject" }, "right_type": { - "$ref": "../enums/right-type.json" + "$ref": "/schemas/latest/enums/right-type.json" }, "match_score": { "type": "number", @@ -41,16 +42,12 @@ "match_reasons": { "type": "array", "description": "Human-readable reasons for the match", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "available_uses": { "type": "array", "description": "Rights uses available for licensing", - "items": { - "$ref": "../enums/right-use.json" - } + "items": { "$ref": "/schemas/latest/enums/right-use.json" } }, "countries": { "type": "array", @@ -79,9 +76,7 @@ "existing_exclusives": { "type": "array", "description": "Active exclusivity commitments that may affect availability. Implementers should use vague descriptions ('exclusive commitment in this category') rather than specific deal terms to protect confidential business relationships.", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, "additionalProperties": true @@ -90,16 +85,14 @@ "type": "array", "description": "Available pricing options for these rights", "items": { - "$ref": "rights-pricing-option.json" + "$ref": "/schemas/latest/brand/rights-pricing-option.json" }, "minItems": 1 }, "content_restrictions": { "type": "array", "description": "Content restrictions or approval requirements", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "preview_assets": { "type": "array", @@ -107,28 +100,15 @@ "items": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri" - }, - "usage": { - "type": "string" - } + "url": { "type": "string", "format": "uri" }, + "usage": { "type": "string" } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": true } } }, - "required": [ - "rights_id", - "brand_id", - "name", - "available_uses", - "pricing_options" - ], + "required": ["rights_id", "brand_id", "name", "available_uses", "pricing_options"], "additionalProperties": true } }, @@ -138,12 +118,8 @@ "items": { "type": "object", "properties": { - "brand_id": { - "type": "string" - }, - "name": { - "type": "string" - }, + "brand_id": { "type": "string" }, + "name": { "type": "string" }, "reason": { "type": "string", "description": "Why this result was excluded. May be sanitized to protect confidential brand rules." @@ -151,65 +127,46 @@ "suggestions": { "type": "array", "description": "Actionable alternatives if the exclusion is fixable (e.g., 'Available in BE and DE markets'). Absent if the exclusion is final.", - "items": { - "type": "string" - } + "items": { "type": "string" } } }, - "required": [ - "brand_id", - "reason" - ], + "required": ["brand_id", "reason"], "additionalProperties": true } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "rights" - ], + "required": ["rights"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "GetRightsError", "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "rights" - ] - } + { "required": ["rights"] } ] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/brand/revocation-notification.json b/schemas/cache/brand/revocation-notification.json index 9bb1fbde0..f5b62ee0f 100644 --- a/schemas/cache/brand/revocation-notification.json +++ b/schemas/cache/brand/revocation-notification.json @@ -1,12 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/revocation-notification.json", "title": "Revocation Notification", - "description": "Payload sent by a rights holder to a buyer's revocation_webhook when rights are revoked. The buyer must cease creative delivery by effective_at. Partial revocation is supported \u2014 if revoked_uses is present, only those uses are revoked.", + "description": "Payload sent by a rights holder to a buyer's revocation_webhook when rights are revoked. The buyer must cease creative delivery by effective_at. Partial revocation is supported — if revoked_uses is present, only those uses are revoked.", "type": "object", "properties": { "notification_id": { "type": "string", - "description": "Unique identifier for this notification. Buyers use this for deduplication \u2014 the same revocation may be delivered multiple times." + "description": "Unique identifier for this notification. Buyers use this for deduplication — the same revocation may be delivered multiple times." }, "rights_id": { "type": "string", @@ -29,23 +30,17 @@ "type": "array", "description": "If present, only these uses are revoked (partial revocation). If absent, all uses under the grant are revoked.", "items": { - "$ref": "../enums/right-use.json" + "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "notification_id", - "rights_id", - "brand_id", - "reason", - "effective_at" - ], + "required": ["notification_id", "rights_id", "brand_id", "reason", "effective_at"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/rights-pricing-option.json b/schemas/cache/brand/rights-pricing-option.json index 0a251b18b..c88ef8642 100644 --- a/schemas/cache/brand/rights-pricing-option.json +++ b/schemas/cache/brand/rights-pricing-option.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/rights-pricing-option.json", "title": "Rights Pricing Option", - "description": "A pricing option for licensable rights. Separate from media-buy pricing options \u2014 rights pricing includes period, impression caps, overage rates, and use-type scoping.", + "description": "A pricing option for licensable rights. Separate from media-buy pricing options — rights pricing includes period, impression caps, overage rates, and use-type scoping.", "type": "object", "properties": { "pricing_option_id": { @@ -9,7 +10,7 @@ "description": "Unique identifier for this pricing option. Referenced in acquire_rights and report_usage." }, "model": { - "$ref": "../enums/pricing-model.json", + "$ref": "/schemas/latest/enums/pricing-model.json", "description": "Pricing model (cpm, flat_rate, etc.)" }, "price": { @@ -26,20 +27,13 @@ "type": "array", "description": "Which rights uses this pricing option covers. A single option can bundle multiple uses (e.g., likeness + voice).", "items": { - "$ref": "../enums/right-use.json" + "$ref": "/schemas/latest/enums/right-use.json" }, "minItems": 1 }, "period": { "type": "string", - "enum": [ - "daily", - "weekly", - "monthly", - "quarterly", - "annual", - "one_time" - ], + "enum": ["daily", "weekly", "monthly", "quarterly", "annual", "one_time"], "description": "Billing period for flat_rate and time-based models" }, "impression_cap": { @@ -57,15 +51,9 @@ "description": "Human-readable description of this pricing option" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "pricing_option_id", - "model", - "price", - "currency", - "uses" - ], + "required": ["pricing_option_id", "model", "price", "currency", "uses"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/rights-terms.json b/schemas/cache/brand/rights-terms.json index f50e7763c..b906fad8a 100644 --- a/schemas/cache/brand/rights-terms.json +++ b/schemas/cache/brand/rights-terms.json @@ -1,36 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/rights-terms.json", "title": "Rights Terms", "description": "Contractual terms for a rights grant. Shared between acquire_rights and update_rights responses.", "type": "object", "properties": { - "pricing_option_id": { - "type": "string" - }, - "amount": { - "type": "number", - "minimum": 0 - }, + "pricing_option_id": { "type": "string" }, + "amount": { "type": "number", "minimum": 0 }, "currency": { "type": "string", "pattern": "^[A-Z]{3}$" }, "period": { "type": "string", - "enum": [ - "daily", - "weekly", - "monthly", - "quarterly", - "annual", - "one_time" - ] + "enum": ["daily", "weekly", "monthly", "quarterly", "annual", "one_time"] }, "uses": { "type": "array", - "items": { - "$ref": "../enums/right-use.json" - } + "items": { "$ref": "/schemas/latest/enums/right-use.json" } }, "impression_cap": { "type": "integer", @@ -52,9 +39,7 @@ "type": "object", "description": "Exclusivity terms if applicable", "properties": { - "scope": { - "type": "string" - }, + "scope": { "type": "string" }, "countries": { "type": "array", "items": { @@ -66,11 +51,6 @@ "additionalProperties": true } }, - "required": [ - "pricing_option_id", - "amount", - "currency", - "uses" - ], + "required": ["pricing_option_id", "amount", "currency", "uses"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/update-rights-request.json b/schemas/cache/brand/update-rights-request.json index 90323293e..9a2fba080 100644 --- a/schemas/cache/brand/update-rights-request.json +++ b/schemas/cache/brand/update-rights-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/update-rights-request.json", "title": "Update Rights Request", - "description": "Modify an existing rights grant \u2014 extend dates, adjust impression caps, change pricing, or pause/resume. Parallels update_media_buy. Only the fields provided are updated; omitted fields remain unchanged.", + "description": "Modify an existing rights grant — extend dates, adjust impression caps, change pricing, or pause/resume. Parallels update_media_buy. Only the fields provided are updated; omitted fields remain unchanged.", "type": "object", "properties": { "adcp_major_version": { @@ -33,7 +34,7 @@ "description": "Pause or resume the rights grant. When paused, generation credentials are suspended and creative delivery should stop. When resumed, credentials are re-activated." }, "push_notification_config": { - "$ref": "../core/push-notification-config.json", + "$ref": "/schemas/latest/core/push-notification-config.json", "description": "Webhook for async update notifications if the update requires approval" }, "idempotency_key": { @@ -44,10 +45,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -55,4 +56,4 @@ "rights_id" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/brand/update-rights-response.json b/schemas/cache/brand/update-rights-response.json index 5bca70983..3776fa4f9 100644 --- a/schemas/cache/brand/update-rights-response.json +++ b/schemas/cache/brand/update-rights-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/brand/update-rights-response.json", "title": "Update Rights Response", "description": "Result of a rights update request. Returns updated terms and re-issued credentials on success, or errors if the update cannot be applied.", "type": "object", @@ -12,18 +13,18 @@ "description": "Rights grant identifier" }, "terms": { - "$ref": "rights-terms.json", + "$ref": "/schemas/latest/brand/rights-terms.json", "description": "Updated contractual terms (same shape as acquire_rights acquired response)" }, "generation_credentials": { "type": "array", "description": "Re-issued credentials reflecting updated terms (new expiration dates, adjusted caps)", "items": { - "$ref": "../core/generation-credential.json" + "$ref": "/schemas/latest/core/generation-credential.json" } }, "rights_constraint": { - "$ref": "../core/rights-constraint.json", + "$ref": "/schemas/latest/core/rights-constraint.json", "description": "Updated rights constraint for re-embedding in creative manifests" }, "paused": { @@ -31,66 +32,44 @@ "description": "Whether the grant is currently paused. Included when the update changes pause state." }, "implementation_date": { - "type": [ - "string", - "null" - ], + "type": ["string", "null"], "format": "date-time", "description": "When changes take effect (null if pending approval from rights holder)" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "rights_id", - "terms" - ], + "required": ["rights_id", "terms"], "additionalProperties": true, - "not": { - "required": [ - "errors" - ] - } + "not": { "required": ["errors"] } }, { "title": "UpdateRightsError", "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ], + "required": ["errors"], "additionalProperties": true, "not": { "anyOf": [ - { - "required": [ - "rights_id" - ] - }, - { - "required": [ - "terms" - ] - } + { "required": ["rights_id"] }, + { "required": ["terms"] } ] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/bundled/content-standards/calibrate-content-request.json b/schemas/cache/bundled/content-standards/calibrate-content-request.json index 97ad32a0c..102d71539 100644 --- a/schemas/cache/bundled/content-standards/calibrate-content-request.json +++ b/schemas/cache/bundled/content-standards/calibrate-content-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/calibrate-content-request.json", "title": "Calibrate Content Request", "description": "Request parameters for evaluating content during calibration. Multi-turn dialogue is handled at the protocol layer via contextId.", "type": "object", @@ -327,7 +328,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -376,7 +377,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -650,7 +651,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -699,7 +700,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -992,7 +993,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1041,7 +1042,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1327,7 +1328,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1376,7 +1377,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1476,7 +1477,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -1657,7 +1658,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1706,7 +1707,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1886,7 +1887,7 @@ "artifact" ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.167Z", + "generatedAt": "2026-04-19T02:29:11.511Z", "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 03707b939..e6116f6b9 100644 --- a/schemas/cache/bundled/content-standards/calibrate-content-response.json +++ b/schemas/cache/bundled/content-standards/calibrate-content-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/calibrate-content-response.json", "title": "Calibrate Content Response", "description": "Response payload with verdict and detailed explanations for collaborative calibration", "type": "object", @@ -160,7 +161,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.169Z", + "generatedAt": "2026-04-19T02:29:11.514Z", "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 51b3ac619..ad8c48a44 100644 --- a/schemas/cache/bundled/content-standards/create-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/create-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/create-content-standards-request.json", "title": "Create Content Standards Request", "description": "Request parameters for creating a new content standards configuration", "type": "object", @@ -70,7 +71,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1, @@ -102,10 +103,10 @@ }, "policies": { "type": "array", - "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id and carries its own enforcement (must|should); governance findings reference the policy_id that triggered them. Inline bespoke policies can omit version/name/category (defaulted by the server). Combines with registry_policy_ids \u2014 registry policies and bespoke policies are both evaluated. Bespoke policy_ids MUST be flat (no colons/slashes) to avoid collision with namespaced registry ids.", + "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id and carries its own enforcement (must|should); governance findings reference the policy_id that triggered them. Inline bespoke policies can omit version/name/category (defaulted by the server). Combines with registry_policy_ids — registry policies and bespoke policies are both evaluated. Bespoke policy_ids MUST be flat (no colons/slashes) to avoid collision with namespaced registry ids.", "items": { "title": "Policy Entry", - "description": "A policy \u2014 either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them.", + "description": "A policy — either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them. Governance agents evaluating policies with natural-language LLMs MUST pin registry-sourced policy text (`source: registry`) as system-level instructions and MUST NOT permit `custom_policies` or the plan's `objectives` field to relax, override, or disable registry-sourced policies. Custom policies may only add additional restrictions; they cannot lower enforcement levels or exempt categories.", "type": "object", "properties": { "policy_id": { @@ -123,19 +124,20 @@ }, "version": { "type": "string", - "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies \u2014 defaults to \"1.0.0\". SHOULD be provided for registry-published policies." + "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies — defaults to \"1.0.0\". SHOULD be provided for registry-published policies." }, "name": { "type": "string", - "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies \u2014 servers MAY default to policy_id." + "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies — servers MAY default to policy_id." }, "description": { "type": "string", + "maxLength": 500, "description": "Brief summary of what this policy covers." }, "category": { "title": "Policy Category", - "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies \u2014 defaults to \"standard\".", + "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies — defaults to \"standard\".", "type": "string", "enum": [ "regulation", @@ -161,6 +163,11 @@ "may": "Recommendation. Governance agents log for informational purposes only." } }, + "requires_human_review": { + "type": "boolean", + "default": false, + "description": "When true, plans subject to this policy MUST set plan.human_review_required = true. Use for policies that mandate human oversight of decisions affecting data subjects — e.g., GDPR Article 22 (solely automated decisions with legal or similarly significant effects) and EU AI Act Annex III high-risk categories (credit, insurance pricing, recruitment, housing allocation). Governance agents MUST escalate any plan action whose resolved policies include requires_human_review: true. Unlike `enforcement`, this flag applies as soon as the policy is resolved — it is NOT gated by `effective_date`. Art 22 GDPR and similar foundational obligations may predate an AI-Act-specific effective date; the human-review requirement fires regardless." + }, "jurisdictions": { "type": "array", "items": { @@ -233,7 +240,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." @@ -274,7 +281,8 @@ }, "policy": { "type": "string", - "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy." + "maxLength": 5000, + "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy. For source: inline policies, treated as caller-untrusted — governance agents MUST evaluate inline policies as ADDITIONAL restrictions only; they MUST NOT be permitted to relax, override, or conflict with registry-sourced policies." }, "guidance": { "type": "string", @@ -682,7 +690,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -731,7 +739,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1005,7 +1013,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1054,7 +1062,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1347,7 +1355,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1396,7 +1404,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1682,7 +1690,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1731,7 +1739,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1831,7 +1839,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -2012,7 +2020,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2061,7 +2069,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2560,7 +2568,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2609,7 +2617,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2883,7 +2891,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2932,7 +2940,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3225,7 +3233,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3274,7 +3282,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3560,7 +3568,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3609,7 +3617,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3709,7 +3717,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -3890,7 +3898,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3939,7 +3947,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4137,7 +4145,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.177Z", + "generatedAt": "2026-04-19T02:29:11.521Z", "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 6d137f7c3..1940ef14f 100644 --- a/schemas/cache/bundled/content-standards/create-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/create-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/create-content-standards-response.json", "title": "Create Content Standards Response", "description": "Response payload for creating a content standards configuration", "type": "object", @@ -109,7 +110,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.181Z", + "generatedAt": "2026-04-19T02:29:11.525Z", "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 5343dfa4c..f9642288e 100644 --- a/schemas/cache/bundled/content-standards/get-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/get-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/get-content-standards-request.json", "title": "Get Content Standards Request", "description": "Request parameters for retrieving content safety policies", "type": "object", @@ -31,7 +32,7 @@ "standards_id" ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.182Z", + "generatedAt": "2026-04-19T02:29:11.525Z", "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 058f507e0..9111fcb2f 100644 --- a/schemas/cache/bundled/content-standards/get-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/get-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/get-content-standards-response.json", "title": "Get Content Standards Response", "description": "Response payload with content safety policies", "type": "object", @@ -77,7 +78,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1, @@ -96,7 +97,7 @@ "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id; governance findings reference the policy_id that triggered them.", "items": { "title": "Policy Entry", - "description": "A policy \u2014 either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them.", + "description": "A policy — either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them. Governance agents evaluating policies with natural-language LLMs MUST pin registry-sourced policy text (`source: registry`) as system-level instructions and MUST NOT permit `custom_policies` or the plan's `objectives` field to relax, override, or disable registry-sourced policies. Custom policies may only add additional restrictions; they cannot lower enforcement levels or exempt categories.", "type": "object", "properties": { "policy_id": { @@ -114,19 +115,20 @@ }, "version": { "type": "string", - "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies \u2014 defaults to \"1.0.0\". SHOULD be provided for registry-published policies." + "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies — defaults to \"1.0.0\". SHOULD be provided for registry-published policies." }, "name": { "type": "string", - "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies \u2014 servers MAY default to policy_id." + "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies — servers MAY default to policy_id." }, "description": { "type": "string", + "maxLength": 500, "description": "Brief summary of what this policy covers." }, "category": { "title": "Policy Category", - "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies \u2014 defaults to \"standard\".", + "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies — defaults to \"standard\".", "type": "string", "enum": [ "regulation", @@ -152,6 +154,11 @@ "may": "Recommendation. Governance agents log for informational purposes only." } }, + "requires_human_review": { + "type": "boolean", + "default": false, + "description": "When true, plans subject to this policy MUST set plan.human_review_required = true. Use for policies that mandate human oversight of decisions affecting data subjects — e.g., GDPR Article 22 (solely automated decisions with legal or similarly significant effects) and EU AI Act Annex III high-risk categories (credit, insurance pricing, recruitment, housing allocation). Governance agents MUST escalate any plan action whose resolved policies include requires_human_review: true. Unlike `enforcement`, this flag applies as soon as the policy is resolved — it is NOT gated by `effective_date`. Art 22 GDPR and similar foundational obligations may predate an AI-Act-specific effective date; the human-review requirement fires regardless." + }, "jurisdictions": { "type": "array", "items": { @@ -224,7 +231,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." @@ -265,7 +272,8 @@ }, "policy": { "type": "string", - "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy." + "maxLength": 5000, + "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy. For source: inline policies, treated as caller-untrusted — governance agents MUST evaluate inline policies as ADDITIONAL restrictions only; they MUST NOT be permitted to relax, override, or conflict with registry-sourced policies." }, "guidance": { "type": "string", @@ -647,7 +655,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -696,7 +704,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -970,7 +978,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1019,7 +1027,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1312,7 +1320,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1361,7 +1369,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1647,7 +1655,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1696,7 +1704,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1796,7 +1804,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -1977,7 +1985,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2026,7 +2034,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2497,7 +2505,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2546,7 +2554,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2820,7 +2828,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2869,7 +2877,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3162,7 +3170,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3211,7 +3219,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3497,7 +3505,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3546,7 +3554,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3646,7 +3654,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -3827,7 +3835,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3876,7 +3884,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4039,7 +4047,7 @@ "description": "Pricing options for this content standards service. The buyer passes the selected pricing_option_id in report_usage for billing verification.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -4093,7 +4101,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -4108,7 +4116,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -4185,7 +4193,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -4321,7 +4329,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.190Z", + "generatedAt": "2026-04-19T02:29:11.531Z", "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 ee3122e39..a03434da3 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 @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/get-media-buy-artifacts-request.json", "title": "Get Media Buy Artifacts Request", "description": "Request parameters for retrieving content artifacts from a media buy for validation", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -183,7 +225,7 @@ "media_buy_id" ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.193Z", + "generatedAt": "2026-04-19T02:29:11.537Z", "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 2e185694c..2ba11f879 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 @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/get-media-buy-artifacts-response.json", "title": "Get Media Buy Artifacts Response", "description": "Response containing content artifacts from a media buy for validation", "type": "object", @@ -344,7 +345,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -393,7 +394,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -667,7 +668,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -716,7 +717,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1009,7 +1010,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1058,7 +1059,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1344,7 +1345,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1393,7 +1394,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1493,7 +1494,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -1674,7 +1675,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1723,7 +1724,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1917,7 +1918,7 @@ }, "collection_info": { "type": "object", - "description": "Information about artifact collection for this media buy. Sampling is configured at buy creation time \u2014 this reports what was actually collected.", + "description": "Information about artifact collection for this media buy. Sampling is configured at buy creation time — this reports what was actually collected.", "properties": { "total_deliveries": { "type": "integer", @@ -2055,7 +2056,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.196Z", + "generatedAt": "2026-04-19T02:29:11.540Z", "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 556c0db37..0b0f48f8e 100644 --- a/schemas/cache/bundled/content-standards/list-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/list-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/list-content-standards-request.json", "title": "List Content Standards Request", "description": "Request parameters for listing content standards configurations", "type": "object", @@ -58,7 +59,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1, @@ -114,7 +115,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.197Z", + "generatedAt": "2026-04-19T02:29:11.543Z", "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 1180b41f0..40855a775 100644 --- a/schemas/cache/bundled/content-standards/list-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/list-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/list-content-standards-response.json", "title": "List Content Standards Response", "description": "Response payload with list of content standards configurations", "type": "object", @@ -79,7 +80,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1, @@ -98,7 +99,7 @@ "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id; governance findings reference the policy_id that triggered them.", "items": { "title": "Policy Entry", - "description": "A policy \u2014 either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them.", + "description": "A policy — either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them. Governance agents evaluating policies with natural-language LLMs MUST pin registry-sourced policy text (`source: registry`) as system-level instructions and MUST NOT permit `custom_policies` or the plan's `objectives` field to relax, override, or disable registry-sourced policies. Custom policies may only add additional restrictions; they cannot lower enforcement levels or exempt categories.", "type": "object", "properties": { "policy_id": { @@ -116,19 +117,20 @@ }, "version": { "type": "string", - "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies \u2014 defaults to \"1.0.0\". SHOULD be provided for registry-published policies." + "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies — defaults to \"1.0.0\". SHOULD be provided for registry-published policies." }, "name": { "type": "string", - "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies \u2014 servers MAY default to policy_id." + "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies — servers MAY default to policy_id." }, "description": { "type": "string", + "maxLength": 500, "description": "Brief summary of what this policy covers." }, "category": { "title": "Policy Category", - "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies \u2014 defaults to \"standard\".", + "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies — defaults to \"standard\".", "type": "string", "enum": [ "regulation", @@ -154,6 +156,11 @@ "may": "Recommendation. Governance agents log for informational purposes only." } }, + "requires_human_review": { + "type": "boolean", + "default": false, + "description": "When true, plans subject to this policy MUST set plan.human_review_required = true. Use for policies that mandate human oversight of decisions affecting data subjects — e.g., GDPR Article 22 (solely automated decisions with legal or similarly significant effects) and EU AI Act Annex III high-risk categories (credit, insurance pricing, recruitment, housing allocation). Governance agents MUST escalate any plan action whose resolved policies include requires_human_review: true. Unlike `enforcement`, this flag applies as soon as the policy is resolved — it is NOT gated by `effective_date`. Art 22 GDPR and similar foundational obligations may predate an AI-Act-specific effective date; the human-review requirement fires regardless." + }, "jurisdictions": { "type": "array", "items": { @@ -226,7 +233,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." @@ -267,7 +274,8 @@ }, "policy": { "type": "string", - "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy." + "maxLength": 5000, + "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy. For source: inline policies, treated as caller-untrusted — governance agents MUST evaluate inline policies as ADDITIONAL restrictions only; they MUST NOT be permitted to relax, override, or conflict with registry-sourced policies." }, "guidance": { "type": "string", @@ -649,7 +657,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -698,7 +706,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -972,7 +980,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1021,7 +1029,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1314,7 +1322,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1363,7 +1371,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1649,7 +1657,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1698,7 +1706,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1798,7 +1806,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -1979,7 +1987,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2028,7 +2036,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2499,7 +2507,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2548,7 +2556,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2822,7 +2830,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2871,7 +2879,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3164,7 +3172,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3213,7 +3221,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3499,7 +3507,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3548,7 +3556,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3648,7 +3656,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -3829,7 +3837,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3878,7 +3886,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4041,7 +4049,7 @@ "description": "Pricing options for this content standards service. The buyer passes the selected pricing_option_id in report_usage for billing verification.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -4095,7 +4103,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -4110,7 +4118,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -4187,7 +4195,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -4350,7 +4358,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.202Z", + "generatedAt": "2026-04-19T02:29:11.550Z", "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 db93feb59..999e6f979 100644 --- a/schemas/cache/bundled/content-standards/update-content-standards-request.json +++ b/schemas/cache/bundled/content-standards/update-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/update-content-standards-request.json", "title": "Update Content Standards Request", "description": "Request parameters for updating an existing content standards configuration. Creates a new version.", "type": "object", @@ -74,7 +75,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1, @@ -106,7 +107,7 @@ "description": "Updated bespoke policies for this content-standards configuration, using the same shape as registry entries. Replaces the existing policies array; use stable policy_ids to track policies across versions. Combines with registry_policy_ids. Bespoke policy_ids MUST be flat (no colons/slashes).", "items": { "title": "Policy Entry", - "description": "A policy \u2014 either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them.", + "description": "A policy — either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them. Governance agents evaluating policies with natural-language LLMs MUST pin registry-sourced policy text (`source: registry`) as system-level instructions and MUST NOT permit `custom_policies` or the plan's `objectives` field to relax, override, or disable registry-sourced policies. Custom policies may only add additional restrictions; they cannot lower enforcement levels or exempt categories.", "type": "object", "properties": { "policy_id": { @@ -124,19 +125,20 @@ }, "version": { "type": "string", - "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies \u2014 defaults to \"1.0.0\". SHOULD be provided for registry-published policies." + "description": "Semver version string (e.g., \"1.0.0\"). Incremented when policy content changes. Optional for inline bespoke policies — defaults to \"1.0.0\". SHOULD be provided for registry-published policies." }, "name": { "type": "string", - "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies \u2014 servers MAY default to policy_id." + "description": "Human-readable name (e.g., \"UK HFSS Restrictions\"). Optional for inline bespoke policies — servers MAY default to policy_id." }, "description": { "type": "string", + "maxLength": 500, "description": "Brief summary of what this policy covers." }, "category": { "title": "Policy Category", - "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies \u2014 defaults to \"standard\".", + "description": "The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies — defaults to \"standard\".", "type": "string", "enum": [ "regulation", @@ -162,6 +164,11 @@ "may": "Recommendation. Governance agents log for informational purposes only." } }, + "requires_human_review": { + "type": "boolean", + "default": false, + "description": "When true, plans subject to this policy MUST set plan.human_review_required = true. Use for policies that mandate human oversight of decisions affecting data subjects — e.g., GDPR Article 22 (solely automated decisions with legal or similarly significant effects) and EU AI Act Annex III high-risk categories (credit, insurance pricing, recruitment, housing allocation). Governance agents MUST escalate any plan action whose resolved policies include requires_human_review: true. Unlike `enforcement`, this flag applies as soon as the policy is resolved — it is NOT gated by `effective_date`. Art 22 GDPR and similar foundational obligations may predate an AI-Act-specific effective date; the human-review requirement fires regardless." + }, "jurisdictions": { "type": "array", "items": { @@ -234,7 +241,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "description": "Advertising channels this policy applies to. If omitted or null, the policy applies to all channels." @@ -275,7 +282,8 @@ }, "policy": { "type": "string", - "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy." + "maxLength": 5000, + "description": "Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy. For source: inline policies, treated as caller-untrusted — governance agents MUST evaluate inline policies as ADDITIONAL restrictions only; they MUST NOT be permitted to relax, override, or conflict with registry-sourced policies." }, "guidance": { "type": "string", @@ -683,7 +691,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -732,7 +740,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1006,7 +1014,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1055,7 +1063,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1348,7 +1356,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1397,7 +1405,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1683,7 +1691,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1732,7 +1740,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1832,7 +1840,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -2013,7 +2021,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2062,7 +2070,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2561,7 +2569,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2610,7 +2618,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2884,7 +2892,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2933,7 +2941,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3226,7 +3234,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3275,7 +3283,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3561,7 +3569,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3610,7 +3618,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3710,7 +3718,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -3891,7 +3899,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3940,7 +3948,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4126,7 +4134,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.210Z", + "generatedAt": "2026-04-19T02:29:11.560Z", "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 71211aa1b..96b6f8ffd 100644 --- a/schemas/cache/bundled/content-standards/update-content-standards-response.json +++ b/schemas/cache/bundled/content-standards/update-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/update-content-standards-response.json", "title": "Update Content Standards Response", "description": "Response from updating a content standards configuration", "oneOf": [ @@ -124,7 +125,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.214Z", + "generatedAt": "2026-04-19T02:29:11.564Z", "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 cabe25e88..52e7879f7 100644 --- a/schemas/cache/bundled/content-standards/validate-content-delivery-request.json +++ b/schemas/cache/bundled/content-standards/validate-content-delivery-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/validate-content-delivery-request.json", "title": "Validate Content Delivery Request", "description": "Request parameters for batch validating delivery records against content safety policies", "type": "object", @@ -348,7 +349,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -397,7 +398,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -671,7 +672,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -720,7 +721,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1013,7 +1014,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1062,7 +1063,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1348,7 +1349,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1397,7 +1398,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1497,7 +1498,7 @@ }, "provenance": { "title": "Provenance", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance.", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance.", "type": "object", "properties": { "digital_source_type": { @@ -1678,7 +1679,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1727,7 +1728,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1941,7 +1942,7 @@ "records" ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.216Z", + "generatedAt": "2026-04-19T02:29:11.566Z", "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 3892969f0..2aa3391cf 100644 --- a/schemas/cache/bundled/content-standards/validate-content-delivery-response.json +++ b/schemas/cache/bundled/content-standards/validate-content-delivery-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/content-standards/validate-content-delivery-response.json", "title": "Validate Content Delivery Response", "description": "Response payload with per-record verdicts and optional feature breakdown", "type": "object", @@ -71,7 +72,7 @@ }, "explanation": { "type": "string", - "description": "Directional human-readable explanation (e.g., 'Below minimum resolution for display placement'). Avoid quantitative thresholds \u2014 the evaluator is the oracle." + "description": "Directional human-readable explanation (e.g., 'Below minimum resolution for display placement'). Avoid quantitative thresholds — the evaluator is the oracle." }, "confidence": { "type": "number", @@ -187,7 +188,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.217Z", + "generatedAt": "2026-04-19T02:29:11.568Z", "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 23662b2fe..4d9f2a06b 100644 --- a/schemas/cache/bundled/core/tasks-get-request.json +++ b/schemas/cache/bundled/core/tasks-get-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/core/tasks-get-request.json", "title": "Tasks Get Request", "description": "Request parameters for retrieving a specific task by ID with optional conversation history across all AdCP domains", "type": "object", @@ -52,7 +53,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.219Z", + "generatedAt": "2026-04-19T02:29:11.569Z", "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 f4951b4cd..73a33331f 100644 --- a/schemas/cache/bundled/core/tasks-get-response.json +++ b/schemas/cache/bundled/core/tasks-get-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/core/tasks-get-response.json", "title": "Tasks Get Response", "description": "Response containing detailed information about a specific task including status and optional conversation history across all AdCP protocols", "type": "object", @@ -269,7 +270,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.219Z", + "generatedAt": "2026-04-19T02:29:11.570Z", "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 657353c29..0b1d4e9f2 100644 --- a/schemas/cache/bundled/core/tasks-list-request.json +++ b/schemas/cache/bundled/core/tasks-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/core/tasks-list-request.json", "title": "Tasks List Request", "description": "Request parameters for listing and filtering async tasks across all AdCP protocols with state reconciliation capabilities", "type": "object", @@ -40,7 +41,7 @@ "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.", + "description": "AdCP protocols for task categorization — 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", @@ -394,7 +395,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.220Z", + "generatedAt": "2026-04-19T02:29:11.570Z", "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 dead47bf1..e5fd7810b 100644 --- a/schemas/cache/bundled/core/tasks-list-response.json +++ b/schemas/cache/bundled/core/tasks-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/core/tasks-list-response.json", "title": "Tasks List Response", "description": "Response from task listing query with filtered results and state reconciliation data across all AdCP domains", "type": "object", @@ -250,7 +251,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.221Z", + "generatedAt": "2026-04-19T02:29:11.571Z", "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 c03ea73ef..730393018 100644 --- a/schemas/cache/bundled/creative/get-creative-delivery-request.json +++ b/schemas/cache/bundled/creative/get-creative-delivery-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/get-creative-delivery-request.json", "title": "Get Creative Delivery Request", "description": "Request parameters for retrieving creative delivery data including variant-level metrics from a creative agent. At least one scoping filter (media_buy_ids or creative_ids) is required.", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -192,7 +234,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.221Z", + "generatedAt": "2026-04-19T02:29:11.573Z", "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 6861b0929..07a4606d1 100644 --- a/schemas/cache/bundled/creative/get-creative-delivery-response.json +++ b/schemas/cache/bundled/creative/get-creative-delivery-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/get-creative-delivery-response.json", "title": "Get Creative Delivery Response", "description": "Response payload for get_creative_delivery task. Returns creative delivery data with variant-level breakdowns including manifests and metrics.", "type": "object", @@ -129,7 +130,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -274,7 +275,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -445,7 +446,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -547,7 +548,7 @@ "description": "Variant-level delivery breakdown. Each variant includes the rendered manifest and delivery metrics. For standard creatives, contains a single variant. For asset group optimization, one per combination. For generative creative, one per generated execution. Empty when a creative has no variants yet.", "items": { "title": "Creative Variant", - "description": "A specific execution variant of a creative with delivery metrics. For catalog-driven packages, each catalog item rendered as a distinct ad execution is a variant \u2014 the variant's manifest includes the catalog reference with the specific item rendered. For asset group optimization, represents one combination of assets the platform selected. For generative creative, represents a platform-generated variant. For standard creatives, maps 1:1 with the creative itself.", + "description": "A specific execution variant of a creative with delivery metrics. For catalog-driven packages, each catalog item rendered as a distinct ad execution is a variant — the variant's manifest includes the catalog reference with the specific item rendered. For asset group optimization, represents one combination of assets the platform selected. For generative creative, represents a platform-generated variant. For standard creatives, maps 1:1 with the creative itself.", "type": "object", "allOf": [ { @@ -578,7 +579,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -723,7 +724,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -894,7 +895,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -994,7 +995,7 @@ }, "manifest": { "title": "Creative Manifest", - "description": "The rendered creative manifest for this variant \u2014 the actual output that was served, not the input assets. Contains format_id and the resolved assets (specific headline, image, video, etc. the platform selected or generated). For Tier 2, shows which asset combination was picked. For Tier 3, contains the generated assets which may differ entirely from the input brand identity. Pass to preview_creative to re-render.", + "description": "The rendered creative manifest for this variant — the actual output that was served, not the input assets. Contains format_id and the resolved assets (specific headline, image, video, etc. the platform selected or generated). For Tier 2, shows which asset combination was picked. For Tier 3, contains the generated assets which may differ entirely from the input brand identity. Pass to preview_creative to re-render.", "type": "object", "properties": { "format_id": { @@ -1044,7 +1045,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -1260,7 +1261,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1309,7 +1310,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1737,7 +1738,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1786,7 +1787,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2099,7 +2100,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2148,7 +2149,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2482,7 +2483,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2531,7 +2532,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2861,7 +2862,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2910,7 +2911,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3167,7 +3168,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3216,7 +3217,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3481,7 +3482,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3530,7 +3531,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3807,7 +3808,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3856,7 +3857,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4139,7 +4140,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4188,7 +4189,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4406,8 +4407,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4565,8 +4566,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4812,7 +4813,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4861,7 +4862,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5117,7 +5118,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5166,7 +5167,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5482,7 +5483,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5531,7 +5532,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5843,7 +5844,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5892,7 +5893,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6089,7 +6090,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -6199,7 +6200,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -6247,7 +6248,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -6272,7 +6273,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -6288,7 +6289,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -6465,7 +6466,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -6484,7 +6485,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -6662,10 +6663,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -6824,9 +6825,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -7031,7 +7032,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7080,7 +7081,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7209,7 +7210,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -7373,7 +7374,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.233Z", + "generatedAt": "2026-04-19T02:29:11.584Z", "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 04a23c9e5..c3314167c 100644 --- a/schemas/cache/bundled/creative/get-creative-features-request.json +++ b/schemas/cache/bundled/creative/get-creative-features-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/get-creative-features-request.json", "title": "Get Creative Features Request", "description": "Request payload for the get_creative_features task. Submits a creative manifest for evaluation by a governance agent, which analyzes the creative and returns scored feature values (brand safety, content categorization, quality metrics, etc.).", "type": "object", @@ -62,7 +63,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -278,7 +279,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -327,7 +328,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -755,7 +756,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -804,7 +805,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1117,7 +1118,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1166,7 +1167,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1500,7 +1501,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1549,7 +1550,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1879,7 +1880,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1928,7 +1929,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2185,7 +2186,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2234,7 +2235,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2499,7 +2500,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2548,7 +2549,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2825,7 +2826,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2874,7 +2875,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3157,7 +3158,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3206,7 +3207,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3424,8 +3425,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3583,8 +3584,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3830,7 +3831,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3879,7 +3880,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4135,7 +4136,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4184,7 +4185,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4500,7 +4501,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4549,7 +4550,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4861,7 +4862,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4910,7 +4911,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5107,7 +5108,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5217,7 +5218,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5265,7 +5266,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -5290,7 +5291,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -5306,7 +5307,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -5483,7 +5484,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -5502,7 +5503,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -5680,10 +5681,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -5842,9 +5843,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -6049,7 +6050,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6098,7 +6099,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6212,6 +6213,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -6294,7 +6336,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.246Z", + "generatedAt": "2026-04-19T02:29:11.604Z", "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 6142f5156..67eb7fe2e 100644 --- a/schemas/cache/bundled/creative/get-creative-features-response.json +++ b/schemas/cache/bundled/creative/get-creative-features-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/get-creative-features-response.json", "title": "Get Creative Features Response", "description": "Response payload for the get_creative_features task. Returns scored feature values from the governance agent's evaluation of the submitted creative manifest.", "type": "object", @@ -65,7 +66,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this feature was evaluated to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this feature was evaluated to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." }, "ext": { "title": "Extension Object", @@ -102,7 +103,7 @@ }, "consumption": { "title": "Creative Consumption", - "description": "Structured consumption details for this evaluation. Informational \u2014 lets the buyer verify that vendor_cost is consistent with the rate card. vendor_cost is the billing source of truth.", + "description": "Structured consumption details for this evaluation. Informational — lets the buyer verify that vendor_cost is consistent with the rate card. vendor_cost is the billing source of truth.", "type": "object", "properties": { "tokens": { @@ -221,7 +222,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.251Z", + "generatedAt": "2026-04-19T02:29:11.610Z", "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 afc39e63f..6e4221e4d 100644 --- a/schemas/cache/bundled/creative/list-creative-formats-request.json +++ b/schemas/cache/bundled/creative/list-creative-formats-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/list-creative-formats-request.json", "title": "List Creative Formats Request (Creative Agent)", "description": "Request parameters for discovering creative formats provided by this creative agent", "type": "object", @@ -170,7 +171,7 @@ }, "output_format_ids": { "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.", + "description": "Filter to formats whose output_format_ids includes any of these format IDs. Returns formats that can produce these outputs — 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.", @@ -220,7 +221,7 @@ }, "input_format_ids": { "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.", + "description": "Filter to formats whose input_format_ids includes any of these format IDs. Returns formats that accept these creatives as input — 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.", @@ -314,6 +315,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -412,7 +454,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.252Z", + "generatedAt": "2026-04-19T02:29:11.611Z", "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 431903669..e67b611c7 100644 --- a/schemas/cache/bundled/creative/list-creative-formats-response.json +++ b/schemas/cache/bundled/creative/list-creative-formats-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/list-creative-formats-response.json", "title": "List Creative Formats Response (Creative Agent)", "description": "Response payload for list_creative_formats task from creative agent - returns full format definitions", "type": "object", @@ -26,7 +27,7 @@ }, "asset_role": { "type": "string", - "description": "Descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). For documentation and UI display only \u2014 manifests key assets by asset_id, not asset_role." + "description": "Descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). For documentation and UI display only — manifests key assets by asset_id, not asset_role." }, "required": { "type": "boolean", @@ -140,7 +141,7 @@ }, "asset_role": { "type": "string", - "description": "Descriptive label for this asset's purpose. For documentation and UI display only \u2014 manifests key assets by asset_id, not asset_role." + "description": "Descriptive label for this asset's purpose. For documentation and UI display only — manifests key assets by asset_id, not asset_role." }, "required": { "type": "boolean", @@ -1397,7 +1398,7 @@ "properties": { "asset_group_id": { "type": "string", - "description": "The asset group this constraint applies to. Values are format-defined vocabulary \u2014 each format chooses its own group IDs (e.g., 'headlines', 'images', 'videos'). Buyers discover them via list_creative_formats." + "description": "The asset group this constraint applies to. Values are format-defined vocabulary — each format chooses its own group IDs (e.g., 'headlines', 'images', 'videos'). Buyers discover them via list_creative_formats." }, "asset_type": { "title": "Asset Content Type", @@ -2137,10 +2138,10 @@ }, "field_bindings": { "type": "array", - "description": "Explicit mappings from format template slots to catalog item fields or typed asset pools. Optional \u2014 creative agents can infer mappings without them, but bindings make the relationship self-describing and enable validation. Covers scalar fields (asset_id \u2192 catalog_field), asset pools (asset_id \u2192 asset_group_id on the catalog item), and repeatable groups that iterate over catalog items.", + "description": "Explicit mappings from format template slots to catalog item fields or typed asset pools. Optional — creative agents can infer mappings without them, but bindings make the relationship self-describing and enable validation. Covers scalar fields (asset_id → catalog_field), asset pools (asset_id → asset_group_id on the catalog item), and repeatable groups that iterate over catalog items.", "items": { "title": "Catalog Field Binding", - "description": "Maps a format template slot to a catalog item field or typed asset pool. The 'kind' field identifies the binding variant. All bindings are optional \u2014 agents can still infer mappings without them.", + "description": "Maps a format template slot to a catalog item field or typed asset pool. The 'kind' field identifies the binding variant. All bindings are optional — agents can still infer mappings without them.", "definitions": { "ScalarBinding": { "type": "object", @@ -2259,7 +2260,7 @@ ], "examples": [ { - "description": "Scalar binding \u2014 hotel name to headline slot", + "description": "Scalar binding — hotel name to headline slot", "data": { "kind": "scalar", "asset_id": "headline", @@ -2267,7 +2268,7 @@ } }, { - "description": "Scalar binding \u2014 nested field (nightly rate)", + "description": "Scalar binding — nested field (nightly rate)", "data": { "kind": "scalar", "asset_id": "price_badge", @@ -2275,7 +2276,7 @@ } }, { - "description": "Asset pool binding \u2014 hero image from landscape pool", + "description": "Asset pool binding — hero image from landscape pool", "data": { "kind": "asset_pool", "asset_id": "hero_image", @@ -2283,7 +2284,7 @@ } }, { - "description": "Asset pool binding \u2014 Snap vertical background from vertical pool", + "description": "Asset pool binding — Snap vertical background from vertical pool", "data": { "kind": "asset_pool", "asset_id": "snap_background", @@ -2291,7 +2292,7 @@ } }, { - "description": "Catalog group binding \u2014 carousel where each slide is one hotel", + "description": "Catalog group binding — carousel where each slide is one hotel", "data": { "kind": "catalog_group", "format_group_id": "slide", @@ -3336,8 +3337,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3550,7 +3551,7 @@ }, "supported_disclosure_positions": { "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.", + "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 — 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.", @@ -3721,7 +3722,7 @@ "description": "Pricing options for this format. Used by transformation and generation agents that charge per format adapted, per image generated, or per unit of work. Present when the request included include_pricing=true and account. Ad servers and library-based agents expose pricing on list_creatives instead.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -3775,7 +3776,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -3790,7 +3791,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -3867,7 +3868,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -4041,7 +4042,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.256Z", + "generatedAt": "2026-04-19T02:29:11.615Z", "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 6dfdd2dd7..ca3a681cd 100644 --- a/schemas/cache/bundled/creative/list-creatives-request.json +++ b/schemas/cache/bundled/creative/list-creatives-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/list-creatives-request.json", "title": "List Creatives Request", - "description": "Request parameters for querying creative assets from a creative library with filtering, sorting, and pagination. Implemented by any agent that hosts a creative library \u2014 creative agents (ad servers, creative platforms) and sales agents that manage creatives.", + "description": "Request parameters for querying creative assets from a creative library with filtering, sorting, and pagination. Implemented by any agent that hosts a creative library — creative agents (ad servers, creative platforms) and sales agents that manage creatives.", "type": "object", "properties": { "adcp_major_version": { @@ -59,6 +60,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -143,7 +185,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -200,7 +242,7 @@ }, "assigned_to_packages": { "type": "array", - "description": "Filter creatives assigned to any of these packages. Sales-agent-specific \u2014 standalone creative agents SHOULD ignore this filter.", + "description": "Filter creatives assigned to any of these packages. Sales-agent-specific — standalone creative agents SHOULD ignore this filter.", "items": { "type": "string" }, @@ -208,7 +250,7 @@ }, "media_buy_ids": { "type": "array", - "description": "Filter creatives assigned to any of these media buys. Sales-agent-specific \u2014 standalone creative agents SHOULD ignore this filter.", + "description": "Filter creatives assigned to any of these media buys. Sales-agent-specific — standalone creative agents SHOULD ignore this filter.", "items": { "type": "string" }, @@ -216,7 +258,7 @@ }, "unassigned": { "type": "boolean", - "description": "Filter for unassigned creatives when true, assigned creatives when false. Sales-agent-specific \u2014 standalone creative agents SHOULD ignore this filter." + "description": "Filter for unassigned creatives when true, assigned creatives when false. Sales-agent-specific — standalone creative agents SHOULD ignore this filter." }, "has_served": { "type": "boolean", @@ -402,6 +444,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -572,7 +655,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.259Z", + "generatedAt": "2026-04-19T02:29:11.618Z", "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 54d36fc63..7db0b25a0 100644 --- a/schemas/cache/bundled/creative/list-creatives-response.json +++ b/schemas/cache/bundled/creative/list-creatives-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/list-creatives-response.json", "title": "List Creatives Response", "description": "Response from creative library query with filtered results, metadata, and optional enriched data", "type": "object", @@ -120,10 +121,10 @@ "enumDescriptions": { "active": "Account is operational and can create media buys", "pending_approval": "Seller is reviewing the account (credit, contracts)", - "rejected": "Seller declined the account request \u2014 terminal state", + "rejected": "Seller declined the account request — terminal state", "payment_required": "Credit limit reached or funds depleted", - "suspended": "Was active, now paused \u2014 operations gated", - "closed": "Was active, now terminated \u2014 terminal state" + "suspended": "Was active, now paused — operations gated", + "closed": "Was active, now terminated — terminal state" } }, "brand": { @@ -148,6 +149,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -460,7 +502,7 @@ }, "governance_agents": { "type": "array", - "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -490,7 +532,7 @@ }, "reporting_bucket": { "type": "object", - "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix \u2014 bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", + "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix — bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", "properties": { "protocol": { "title": "Cloud Storage Protocol", @@ -564,7 +606,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation \u2014 buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." + "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation — buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." } }, "required": [ @@ -576,7 +618,7 @@ }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." + "description": "When true, this is a sandbox account — no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "ext": { "title": "Extension Object", @@ -776,7 +818,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -1008,7 +1050,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1057,7 +1099,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1485,7 +1527,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1534,7 +1576,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1847,7 +1889,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1896,7 +1938,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2230,7 +2272,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2279,7 +2321,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2609,7 +2651,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2658,7 +2700,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2915,7 +2957,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2964,7 +3006,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3229,7 +3271,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3278,7 +3320,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3555,7 +3597,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3604,7 +3646,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3887,7 +3929,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3936,7 +3978,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4154,8 +4196,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4313,8 +4355,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4560,7 +4602,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4609,7 +4651,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4865,7 +4907,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4914,7 +4956,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5230,7 +5272,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5279,7 +5321,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5591,7 +5633,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5640,7 +5682,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5837,7 +5879,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5947,7 +5989,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5995,7 +6037,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -6020,7 +6062,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -6036,7 +6078,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -6213,7 +6255,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -6232,7 +6274,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -6428,7 +6470,7 @@ "description": "Dynamic content variables (DCO slots) for this creative. Included when include_variables=true.", "items": { "title": "Creative Variable", - "description": "A dynamic content variable (DCO slot) on a creative. Variables represent content that can change at serve time \u2014 headlines, images, product data, etc.", + "description": "A dynamic content variable (DCO slot) on a creative. Variables represent content that can change at serve time — headlines, images, product data, etc.", "type": "object", "properties": { "variable_id": { @@ -6637,7 +6679,7 @@ "description": "Pricing options for using this creative (serving, delivery). Used by ad servers and library agents. Transformation agents expose format-level pricing on list_creative_formats instead. Present when include_pricing=true and account provided. The buyer passes the applied pricing_option_id in report_usage.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -6691,7 +6733,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -6706,7 +6748,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -6783,7 +6825,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -6830,7 +6872,7 @@ }, "format_summary": { "type": "object", - "description": "Breakdown of creatives by format. Keys are agent-defined format identifiers, optionally including dimensions (e.g., 'display_static_300x250', 'video_30s_vast'). Key construction is platform-specific \u2014 there is no required format.", + "description": "Breakdown of creatives by format. Keys are agent-defined format identifiers, optionally including dimensions (e.g., 'display_static_300x250', 'video_30s_vast'). Key construction is platform-specific — there is no required format.", "patternProperties": { "^[a-zA-Z0-9_-]+$": { "type": "integer", @@ -7055,7 +7097,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.267Z", + "generatedAt": "2026-04-19T02:29:11.627Z", "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 6339672de..5da6cf333 100644 --- a/schemas/cache/bundled/creative/preview-creative-request.json +++ b/schemas/cache/bundled/creative/preview-creative-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/preview-creative-request.json", "title": "Preview Creative Request", "description": "Request to generate previews of creative manifests. Uses request_type to select single, batch, or variant mode.", "type": "object", @@ -71,7 +72,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -287,7 +288,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -336,7 +337,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -764,7 +765,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -813,7 +814,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1126,7 +1127,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1175,7 +1176,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1509,7 +1510,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1558,7 +1559,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1888,7 +1889,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1937,7 +1938,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2194,7 +2195,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2243,7 +2244,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2508,7 +2509,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2557,7 +2558,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2834,7 +2835,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2883,7 +2884,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3166,7 +3167,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3215,7 +3216,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3433,8 +3434,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3592,8 +3593,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3839,7 +3840,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3888,7 +3889,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4144,7 +4145,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4193,7 +4194,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4509,7 +4510,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4558,7 +4559,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4870,7 +4871,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4919,7 +4920,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5116,7 +5117,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5226,7 +5227,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5274,7 +5275,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -5299,7 +5300,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -5315,7 +5316,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -5492,7 +5493,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -5511,7 +5512,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -5689,10 +5690,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -5851,9 +5852,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -6058,7 +6059,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6107,7 +6108,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6381,7 +6382,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -6597,7 +6598,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6646,7 +6647,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7074,7 +7075,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7123,7 +7124,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7436,7 +7437,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7485,7 +7486,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7819,7 +7820,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7868,7 +7869,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8198,7 +8199,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8247,7 +8248,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8504,7 +8505,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8553,7 +8554,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8818,7 +8819,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8867,7 +8868,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9144,7 +9145,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -9193,7 +9194,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9476,7 +9477,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -9525,7 +9526,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9743,8 +9744,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -9902,8 +9903,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -10149,7 +10150,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10198,7 +10199,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -10454,7 +10455,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10503,7 +10504,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -10819,7 +10820,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10868,7 +10869,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11180,7 +11181,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -11229,7 +11230,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11426,7 +11427,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -11536,7 +11537,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -11584,7 +11585,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -11609,7 +11610,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -11625,7 +11626,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -11802,7 +11803,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -11821,7 +11822,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -11999,10 +12000,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -12161,9 +12162,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -12368,7 +12369,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -12417,7 +12418,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -12622,7 +12623,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.284Z", + "generatedAt": "2026-04-19T02:29:11.646Z", "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-response.json b/schemas/cache/bundled/creative/preview-creative-response.json index ae8e91e19..91c39060f 100644 --- a/schemas/cache/bundled/creative/preview-creative-response.json +++ b/schemas/cache/bundled/creative/preview-creative-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/preview-creative-response.json", "title": "Preview Creative Response", "description": "Response containing preview links for one or more creatives. Format matches the request: single preview response for single requests, batch results for batch requests.", "oneOf": [ @@ -998,7 +999,7 @@ }, "manifest": { "title": "Creative Manifest", - "description": "The rendered creative manifest for this variant \u2014 the actual output that was served, not the input assets", + "description": "The rendered creative manifest for this variant — the actual output that was served, not the input assets", "type": "object", "properties": { "format_id": { @@ -1048,7 +1049,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -1264,7 +1265,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1313,7 +1314,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1741,7 +1742,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1790,7 +1791,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2103,7 +2104,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2152,7 +2153,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2486,7 +2487,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2535,7 +2536,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2865,7 +2866,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2914,7 +2915,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3171,7 +3172,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3220,7 +3221,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3485,7 +3486,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3534,7 +3535,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3811,7 +3812,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3860,7 +3861,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4143,7 +4144,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4192,7 +4193,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4410,8 +4411,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4569,8 +4570,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -4816,7 +4817,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4865,7 +4866,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5121,7 +5122,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5170,7 +5171,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5486,7 +5487,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5535,7 +5536,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5847,7 +5848,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5896,7 +5897,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6093,7 +6094,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -6203,7 +6204,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -6251,7 +6252,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -6276,7 +6277,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -6292,7 +6293,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -6469,7 +6470,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -6488,7 +6489,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -6666,10 +6667,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -6828,9 +6829,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -7035,7 +7036,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7084,7 +7085,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7176,7 +7177,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.299Z", + "generatedAt": "2026-04-19T02:29:11.664Z", "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/sync-creatives-request.json b/schemas/cache/bundled/creative/sync-creatives-request.json index 2aff17355..4c47c0e6f 100644 --- a/schemas/cache/bundled/creative/sync-creatives-request.json +++ b/schemas/cache/bundled/creative/sync-creatives-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/sync-creatives-request.json", "title": "Sync Creatives Request", "description": "Request parameters for syncing creative assets with upsert semantics - supports bulk operations, scoped updates, and assignment management", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -394,7 +436,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -443,7 +485,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -871,7 +913,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -920,7 +962,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1233,7 +1275,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1282,7 +1324,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1616,7 +1658,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1665,7 +1707,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1995,7 +2037,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2044,7 +2086,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2301,7 +2343,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2350,7 +2392,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2615,7 +2657,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2664,7 +2706,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2941,7 +2983,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2990,7 +3032,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3273,7 +3315,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3322,7 +3364,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3540,8 +3582,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3699,8 +3741,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3946,7 +3988,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3995,7 +4037,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4251,7 +4293,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4300,7 +4342,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4616,7 +4658,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4665,7 +4707,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4977,7 +5019,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5026,7 +5068,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5223,7 +5265,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5333,7 +5375,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5381,7 +5423,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -5406,7 +5448,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -5422,7 +5464,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -5599,7 +5641,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -5618,7 +5660,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -5844,7 +5886,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -5880,9 +5922,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -6087,7 +6129,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6136,7 +6178,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6256,7 +6298,7 @@ "delete_missing": { "type": "boolean", "default": false, - "description": "When true, creatives not included in this sync will be archived. Use with caution for full library replacement. Invalid when creative_ids is provided \u2014 delete_missing applies to the entire library scope, not a filtered subset." + "description": "When true, creatives not included in this sync will be archived. Use with caution for full library replacement. Invalid when creative_ids is provided — delete_missing applies to the entire library scope, not a filtered subset." }, "dry_run": { "type": "boolean", @@ -6466,7 +6508,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.312Z", + "generatedAt": "2026-04-19T02:29:11.674Z", "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/sync-creatives-response.json b/schemas/cache/bundled/creative/sync-creatives-response.json index d3f73f59c..7efdb6d14 100644 --- a/schemas/cache/bundled/creative/sync-creatives-response.json +++ b/schemas/cache/bundled/creative/sync-creatives-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/creative/sync-creatives-response.json", "title": "Sync Creatives Response", "description": "Response from creative sync operation. Returns either per-creative results (best-effort processing) OR operation-level errors (complete failure). This enforces atomic semantics at the operation level while allowing per-item failures within successful operations.", "type": "object", @@ -59,10 +60,10 @@ "enumDescriptions": { "active": "Account is operational and can create media buys", "pending_approval": "Seller is reviewing the account (credit, contracts)", - "rejected": "Seller declined the account request \u2014 terminal state", + "rejected": "Seller declined the account request — terminal state", "payment_required": "Credit limit reached or funds depleted", - "suspended": "Was active, now paused \u2014 operations gated", - "closed": "Was active, now terminated \u2014 terminal state" + "suspended": "Was active, now paused — operations gated", + "closed": "Was active, now terminated — terminal state" } }, "brand": { @@ -87,6 +88,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -399,7 +441,7 @@ }, "governance_agents": { "type": "array", - "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -429,7 +471,7 @@ }, "reporting_bucket": { "type": "object", - "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix \u2014 bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", + "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix — bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", "properties": { "protocol": { "title": "Cloud Storage Protocol", @@ -503,7 +545,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation \u2014 buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." + "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation — buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." } }, "required": [ @@ -515,7 +557,7 @@ }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." + "description": "When true, this is a sandbox account — no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "ext": { "title": "Extension Object", @@ -897,7 +939,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.317Z", + "generatedAt": "2026-04-19T02:29:11.681Z", "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/media-buy/build-creative-request.json b/schemas/cache/bundled/media-buy/build-creative-request.json index 1299fdcc0..6cf42b276 100644 --- a/schemas/cache/bundled/media-buy/build-creative-request.json +++ b/schemas/cache/bundled/media-buy/build-creative-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/build-creative-request.json", "title": "Build Creative Request", "description": "Request to transform, generate, or retrieve a creative manifest. Supports three modes: (1) generation from a brief or seed assets, (2) transformation of an existing manifest, (3) retrieval from a creative library by creative_id. Produces target manifest(s) in the specified format(s). Provide either target_format_id for a single format or target_format_ids for multiple formats.", "type": "object", @@ -66,7 +67,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -282,7 +283,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -331,7 +332,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -759,7 +760,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -808,7 +809,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1121,7 +1122,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1170,7 +1171,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1504,7 +1505,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1553,7 +1554,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1883,7 +1884,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1932,7 +1933,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2189,7 +2190,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2238,7 +2239,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2503,7 +2504,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2552,7 +2553,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2829,7 +2830,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2878,7 +2879,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3161,7 +3162,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3210,7 +3211,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3428,8 +3429,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3587,8 +3588,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3834,7 +3835,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3883,7 +3884,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4139,7 +4140,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4188,7 +4189,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4504,7 +4505,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4553,7 +4554,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4865,7 +4866,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4914,7 +4915,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5111,7 +5112,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5221,7 +5222,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5269,7 +5270,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -5294,7 +5295,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -5310,7 +5311,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -5487,7 +5488,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -5506,7 +5507,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -5684,10 +5685,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -5846,9 +5847,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -6053,7 +6054,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6102,7 +6103,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6319,6 +6320,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -6405,6 +6447,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -6449,7 +6532,7 @@ }, "preview_inputs": { "type": "array", - "description": "Input sets for preview generation when include_preview is true. Each input set defines macros and context values for one preview variant. If include_preview is true but this is omitted, the agent generates a single default preview. Only supported with target_format_id (single-format requests). Ignored when using target_format_ids \u2014 multi-format requests generate one default preview per format. Ignored when include_preview is false or omitted.", + "description": "Input sets for preview generation when include_preview is true. Each input set defines macros and context values for one preview variant. If include_preview is true but this is omitted, the agent generates a single default preview. Only supported with target_format_id (single-format requests). Ignored when using target_format_ids — multi-format requests generate one default preview per format. Ignored when include_preview is false or omitted.", "items": { "type": "object", "properties": { @@ -6478,7 +6561,7 @@ }, "preview_quality": { "title": "Creative Quality", - "description": "Render quality for inline preview when include_preview is true. 'draft' produces fast, lower-fidelity renderings. 'production' produces full-quality renderings. Independent of the build quality parameter \u2014 you can build at draft quality and preview at production quality, or vice versa. If omitted, the creative agent uses its own default. Ignored when include_preview is false or omitted.", + "description": "Render quality for inline preview when include_preview is true. 'draft' produces fast, lower-fidelity renderings. 'production' produces full-quality renderings. Independent of the build quality parameter — you can build at draft quality and preview at production quality, or vice versa. If omitted, the creative agent uses its own default. Ignored when include_preview is false or omitted.", "type": "string", "enum": [ "draft", @@ -6501,7 +6584,7 @@ }, "macro_values": { "type": "object", - "description": "Macro values to pre-substitute into the output manifest's assets. Keys are universal macro names (e.g., CLICK_URL, CACHEBUSTER); values are the substitution strings. The creative agent translates universal macros to its platform's native syntax. Substitution is literal \u2014 all occurrences of each macro in output assets are replaced with the provided value. The caller is responsible for URL-encoding values if the output context requires it. Macros not provided here remain as {MACRO} placeholders for the sales agent to resolve at serve time. Creative agents MUST ignore keys they do not recognize \u2014 unknown macro names are not an error.", + "description": "Macro values to pre-substitute into the output manifest's assets. Keys are universal macro names (e.g., CLICK_URL, CACHEBUSTER); values are the substitution strings. The creative agent translates universal macros to its platform's native syntax. Substitution is literal — all occurrences of each macro in output assets are replaced with the provided value. The caller is responsible for URL-encoding values if the output context requires it. Macros not provided here remain as {MACRO} placeholders for the sales agent to resolve at serve time. Creative agents MUST ignore keys they do not recognize — unknown macro names are not an error.", "additionalProperties": { "type": "string" } @@ -6531,7 +6614,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.324Z", + "generatedAt": "2026-04-19T02:29:11.688Z", "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/media-buy/build-creative-response.json b/schemas/cache/bundled/media-buy/build-creative-response.json index 107958acf..f00549ca9 100644 --- a/schemas/cache/bundled/media-buy/build-creative-response.json +++ b/schemas/cache/bundled/media-buy/build-creative-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/build-creative-response.json", "title": "Build Creative Response", "description": "Response containing the transformed or generated creative manifest(s), ready for use with preview_creative or sync_creatives. Returns either a single creative_manifest, an array of creative_manifests (for multi-format requests), or error information.", "type": "object", @@ -61,7 +62,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -277,7 +278,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -326,7 +327,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -754,7 +755,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -803,7 +804,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1116,7 +1117,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1165,7 +1166,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1499,7 +1500,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1548,7 +1549,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -1878,7 +1879,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -1927,7 +1928,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2184,7 +2185,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2233,7 +2234,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2498,7 +2499,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2547,7 +2548,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2824,7 +2825,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2873,7 +2874,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3156,7 +3157,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3205,7 +3206,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3423,8 +3424,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3582,8 +3583,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3829,7 +3830,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3878,7 +3879,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4134,7 +4135,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4183,7 +4184,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4499,7 +4500,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4548,7 +4549,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4860,7 +4861,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4909,7 +4910,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5106,7 +5107,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -5216,7 +5217,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -5264,7 +5265,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -5289,7 +5290,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -5305,7 +5306,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -5482,7 +5483,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -5501,7 +5502,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -5679,10 +5680,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -5841,9 +5842,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -6048,7 +6049,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6097,7 +6098,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6529,7 +6530,7 @@ }, "consumption": { "title": "Creative Consumption", - "description": "Structured consumption details for this build. Informational \u2014 lets the buyer verify that vendor_cost is consistent with the rate card. vendor_cost is the billing source of truth.", + "description": "Structured consumption details for this build. Informational — lets the buyer verify that vendor_cost is consistent with the rate card. vendor_cost is the billing source of truth.", "type": "object", "properties": { "tokens": { @@ -6575,14 +6576,14 @@ }, { "title": "BuildCreativeMultiSuccess", - "description": "Multi-format success response. Returned when the request used target_format_ids. Contains one manifest per requested format. Multi-format requests are atomic \u2014 all formats must succeed or the entire request fails with an error response. Array order corresponds to the target_format_ids request order.", + "description": "Multi-format success response. Returned when the request used target_format_ids. Contains one manifest per requested format. Multi-format requests are atomic — all formats must succeed or the entire request fails with an error response. Array order corresponds to the target_format_ids request order.", "type": "object", "properties": { "creative_manifests": { "type": "array", "items": { "title": "Creative Manifest", - "description": "Complete specification of a creative: format_id + assets. Everything the creative needs \u2014 images, text, briefs, catalogs \u2014 lives in the assets map, declared by the format. Each asset is typed according to its asset_type from the format specification.", + "description": "Complete specification of a creative: format_id + assets. Everything the creative needs — images, text, briefs, catalogs — lives in the assets map, declared by the format. Each asset is typed according to its asset_type from the format specification.", "type": "object", "properties": { "format_id": { @@ -6632,7 +6633,7 @@ }, "assets": { "type": "object", - "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance \u2014 each asset must match at least one valid asset type schema.", + "description": "Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.\n\nIMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.", "patternProperties": { "^[a-z0-9_]+$": { "anyOf": [ @@ -6848,7 +6849,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6897,7 +6898,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7325,7 +7326,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7374,7 +7375,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7687,7 +7688,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7736,7 +7737,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8070,7 +8071,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8119,7 +8120,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8449,7 +8450,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8498,7 +8499,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8755,7 +8756,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8804,7 +8805,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9069,7 +9070,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -9118,7 +9119,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9395,7 +9396,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -9444,7 +9445,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9727,7 +9728,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -9776,7 +9777,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -9994,8 +9995,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -10153,8 +10154,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -10400,7 +10401,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10449,7 +10450,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -10705,7 +10706,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10754,7 +10755,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11070,7 +11071,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -11119,7 +11120,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11431,7 +11432,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -11480,7 +11481,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11677,7 +11678,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -11787,7 +11788,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -11835,7 +11836,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -11860,7 +11861,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -11876,7 +11877,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -12053,7 +12054,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -12072,7 +12073,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -12250,10 +12251,10 @@ }, "rights": { "type": "array", - "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights constraints attached to this creative. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "items": { "title": "Rights Constraint", - "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata \u2014 the buyer/orchestrator manages creative lifecycle against these terms.", + "description": "Rights metadata attached to a creative manifest. Each entry represents constraints from a single rights holder. A creative may combine multiple rights constraints (e.g., talent likeness + music license). For v1, rights constraints are informational metadata — the buyer/orchestrator manages creative lifecycle against these terms.", "type": "object", "properties": { "rights_id": { @@ -12412,9 +12413,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -12619,7 +12620,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -12668,7 +12669,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -13149,7 +13150,7 @@ }, "consumption": { "title": "Creative Consumption", - "description": "Structured consumption details for this build. Informational \u2014 lets the buyer verify that vendor_cost is consistent with the rate card.", + "description": "Structured consumption details for this build. Informational — lets the buyer verify that vendor_cost is consistent with the rate card.", "type": "object", "properties": { "tokens": { @@ -13273,7 +13274,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.342Z", + "generatedAt": "2026-04-19T02:29:11.707Z", "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/media-buy/create-media-buy-request.json b/schemas/cache/bundled/media-buy/create-media-buy-request.json index 80526d040..1a1612c73 100644 --- a/schemas/cache/bundled/media-buy/create-media-buy-request.json +++ b/schemas/cache/bundled/media-buy/create-media-buy-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/create-media-buy-request.json", "title": "Create Media Buy Request", "description": "Request parameters for creating a media buy. Supports two modes: (1) Manual mode - provide packages array with explicit line item configurations, or (2) Proposal mode - provide proposal_id and total_budget to execute a proposal from get_products. One of packages or proposal_id must be provided.", "type": "object", @@ -62,6 +63,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -272,7 +314,7 @@ }, "catalogs": { "type": "array", - "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level \u2014 sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", + "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -288,7 +330,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -336,7 +378,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -361,7 +403,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -377,7 +419,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -554,7 +596,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -573,7 +615,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -748,11 +790,11 @@ "description": "Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -773,7 +815,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -819,7 +861,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -869,7 +911,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -938,7 +980,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -1018,12 +1060,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -1035,7 +1077,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -1101,7 +1143,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1134,7 +1176,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1443,7 +1485,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1451,7 +1493,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1466,7 +1508,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1497,7 +1539,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -1535,7 +1577,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1741,7 +1783,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1759,7 +1801,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1808,7 +1850,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1826,7 +1868,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -2009,7 +2051,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -2104,6 +2146,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2204,11 +2287,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -2252,6 +2335,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2296,7 +2420,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -2595,7 +2719,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2644,7 +2768,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3072,7 +3196,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3121,7 +3245,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3434,7 +3558,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3483,7 +3607,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3817,7 +3941,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3866,7 +3990,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4196,7 +4320,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4245,7 +4369,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4502,7 +4626,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4551,7 +4675,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4816,7 +4940,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4865,7 +4989,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5142,7 +5266,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5191,7 +5315,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5474,7 +5598,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5523,7 +5647,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5741,8 +5865,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -5900,8 +6024,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -6147,7 +6271,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6196,7 +6320,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6452,7 +6576,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6501,7 +6625,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6817,7 +6941,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6866,7 +6990,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7178,7 +7302,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7227,7 +7351,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7424,7 +7548,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -7534,7 +7658,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -7582,7 +7706,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -7607,7 +7731,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -7623,7 +7747,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -7800,7 +7924,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -7819,7 +7943,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -8045,7 +8169,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -8081,9 +8205,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -8288,7 +8412,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8337,7 +8461,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8450,6 +8574,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -8564,12 +8729,12 @@ "automotive.electric_vehicles": "Electric vehicle manufacturers and charging infrastructure", "automotive.parts_accessories": "Auto parts, accessories, and aftermarket products", "automotive.luxury": "Luxury and premium automotive brands", - "beauty_cosmetics": "Beauty, cosmetics, and prestige skincare brands. Distinct from cpg.personal_care \u2014 use beauty_cosmetics for brands whose identity is rooted in beauty (L'Oreal Paris, Estee Lauder, Sephora) and cpg.personal_care for mass-market personal hygiene (Dove, Colgate)", + "beauty_cosmetics": "Beauty, cosmetics, and prestige skincare brands. Distinct from cpg.personal_care — use beauty_cosmetics for brands whose identity is rooted in beauty (L'Oreal Paris, Estee Lauder, Sephora) and cpg.personal_care for mass-market personal hygiene (Dove, Colgate)", "beauty_cosmetics.skincare": "Skincare brands and dermatological products", "beauty_cosmetics.fragrance": "Perfume and fragrance brands", "beauty_cosmetics.haircare": "Professional and prestige haircare brands", - "cannabis": "Cannabis products and dispensaries. Subject to heavy platform restrictions \u2014 most platforms require explicit category declaration for ad acceptance", - "cpg": "Consumer packaged goods \u2014 mass-market products sold through retail. For food and beverage manufacturers, use food_beverage. For prestige beauty, use beauty_cosmetics", + "cannabis": "Cannabis products and dispensaries. Subject to heavy platform restrictions — most platforms require explicit category declaration for ad acceptance", + "cpg": "Consumer packaged goods — mass-market products sold through retail. For food and beverage manufacturers, use food_beverage. For prestige beauty, use beauty_cosmetics", "cpg.personal_care": "Mass-market personal care and hygiene products (deodorant, toothpaste, soap). For prestige beauty brands, use beauty_cosmetics", "cpg.household": "Household cleaning and maintenance products", "dating": "Dating apps and matchmaking services. Subject to platform restrictions similar to gambling_betting", @@ -8587,11 +8752,11 @@ "finance.insurance": "Insurance products and services", "finance.investment": "Investment, wealth management, and brokerage", "finance.cryptocurrency": "Cryptocurrency exchanges and blockchain financial products", - "food_beverage": "Food and beverage companies \u2014 manufacturers (Coca-Cola, Nestle), restaurants, and alcohol brands. For non-food packaged goods, use cpg", + "food_beverage": "Food and beverage companies — manufacturers (Coca-Cola, Nestle), restaurants, and alcohol brands. For non-food packaged goods, use cpg", "food_beverage.alcohol": "Alcoholic beverages (beer, wine, spirits). Subject to platform age-gating and regional restrictions", "food_beverage.restaurants": "Restaurants, fast food, and food delivery", "food_beverage.packaged_goods": "Packaged food and non-alcoholic beverages", - "gambling_betting": "Gambling, sports betting, and wagering. Subject to heavy platform restrictions \u2014 most platforms require explicit category declaration", + "gambling_betting": "Gambling, sports betting, and wagering. Subject to heavy platform restrictions — most platforms require explicit category declaration", "gambling_betting.sports_betting": "Sports betting and daily fantasy sports", "gambling_betting.casino": "Online casinos and traditional gambling", "gaming": "Video games and interactive entertainment", @@ -8866,7 +9031,7 @@ }, "signatory": { "type": "string", - "description": "Who accepted the IO \u2014 agent identifier or human name", + "description": "Who accepted the IO — agent identifier or human name", "minLength": 1, "maxLength": 250 }, @@ -8889,7 +9054,7 @@ "agency_estimate_number": { "type": "string", "maxLength": 100, - "description": "Agency estimate or authorization number. Primary financial reference for broadcast buys \u2014 links the order to the agency's media plan and billing system. Travels with the order and Ad-IDs through the transaction lifecycle." + "description": "Agency estimate or authorization number. Primary financial reference for broadcast buys — links the order to the agency's media plan and billing system. Travels with the order and Ad-IDs through the transaction lifecycle." }, "start_time": { "title": "Start Timing", @@ -8914,7 +9079,7 @@ }, "push_notification_config": { "title": "Push Notification Config", - "description": "Optional webhook configuration for async task status notifications. Publisher will send webhooks when status changes (working, input-required, completed, failed). The client generates an operation_id and embeds it in the URL before sending \u2014 the publisher echoes it back in webhook payloads for correlation.", + "description": "Optional webhook configuration for async task status notifications. Publisher will send webhooks when status changes (working, input-required, completed, failed). The client generates an operation_id and embeds it in the URL before sending — the publisher echoes it back in webhook payloads for correlation.", "type": "object", "properties": { "url": { @@ -9164,7 +9329,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.361Z", + "generatedAt": "2026-04-19T02:29:11.727Z", "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/media-buy/create-media-buy-response.json b/schemas/cache/bundled/media-buy/create-media-buy-response.json index a95999c8e..6565ac3ff 100644 --- a/schemas/cache/bundled/media-buy/create-media-buy-response.json +++ b/schemas/cache/bundled/media-buy/create-media-buy-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/create-media-buy-response.json", "title": "Create Media Buy Response", "description": "Response payload for create_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - the media buy is either fully created or not created at all.", "type": "object", @@ -49,10 +50,10 @@ "enumDescriptions": { "active": "Account is operational and can create media buys", "pending_approval": "Seller is reviewing the account (credit, contracts)", - "rejected": "Seller declined the account request \u2014 terminal state", + "rejected": "Seller declined the account request — terminal state", "payment_required": "Credit limit reached or funds depleted", - "suspended": "Was active, now paused \u2014 operations gated", - "closed": "Was active, now terminated \u2014 terminal state" + "suspended": "Was active, now paused — operations gated", + "closed": "Was active, now terminated — terminal state" } }, "brand": { @@ -77,6 +78,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -389,7 +431,7 @@ }, "governance_agents": { "type": "array", - "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -419,7 +461,7 @@ }, "reporting_bucket": { "type": "object", - "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix \u2014 bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", + "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix — bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", "properties": { "protocol": { "title": "Cloud Storage Protocol", @@ -493,7 +535,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation \u2014 buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." + "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation — buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." } }, "required": [ @@ -505,7 +547,7 @@ }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." + "description": "When true, this is a sandbox account — no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "ext": { "title": "Extension Object", @@ -961,7 +1003,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -978,7 +1020,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1001,13 +1043,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -1056,7 +1098,7 @@ }, "catalogs": { "type": "array", - "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level \u2014 sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.", + "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -1072,7 +1114,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -1120,7 +1162,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -1145,7 +1187,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -1161,7 +1203,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -1338,7 +1380,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -1357,7 +1399,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -1834,7 +1876,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1842,7 +1884,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1857,7 +1899,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1888,7 +1930,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -1926,7 +1968,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -2132,7 +2174,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -2150,7 +2192,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -2199,7 +2241,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -2217,7 +2259,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -2400,7 +2442,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -2466,7 +2508,7 @@ }, "measurement_terms": { "title": "Measurement Terms", - "description": "Agreed billing measurement and makegood terms for this package. Reflects what was negotiated \u2014 may differ from the buyer's proposal or the product's defaults. When present, these terms are binding for the package's duration.", + "description": "Agreed billing measurement and makegood terms for this package. Reflects what was negotiated — may differ from the buyer's proposal or the product's defaults. When present, these terms are binding for the package's duration.", "type": "object", "properties": { "billing_measurement": { @@ -2495,6 +2537,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2595,11 +2678,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -2643,6 +2726,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2687,7 +2811,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -2760,11 +2884,11 @@ "description": "Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -2785,7 +2909,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -2831,7 +2955,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -2881,7 +3005,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -2950,7 +3074,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -3030,12 +3154,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -3047,7 +3171,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -3113,7 +3237,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -3146,7 +3270,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -3362,7 +3486,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "description": "Channels the seller will deliver on." @@ -3386,7 +3510,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -3417,7 +3541,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -3455,7 +3579,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -3529,7 +3653,7 @@ "oneOf": [ { "type": "object", - "description": "Signal-based selector for binary signals \u2014 user either matches or doesn't. The governance agent can resolve catalog signals to their full definition for structural validation.", + "description": "Signal-based selector for binary signals — user either matches or doesn't. The governance agent can resolve catalog signals to their full definition for structural validation.", "properties": { "type": { "type": "string", @@ -3619,7 +3743,7 @@ }, { "type": "object", - "description": "Signal-based selector for categorical signals \u2014 target users with specific values.", + "description": "Signal-based selector for categorical signals — target users with specific values.", "properties": { "type": { "type": "string", @@ -3713,7 +3837,7 @@ }, { "type": "object", - "description": "Signal-based selector for numeric signals \u2014 target users within a value range.", + "description": "Signal-based selector for numeric signals — target users within a value range.", "properties": { "type": { "type": "string", @@ -3806,7 +3930,7 @@ }, { "type": "object", - "description": "Description-based selector \u2014 natural language audience description. Used when the caller doesn't have a specific signal ID (e.g., buyer setting plan-level goals, or seller using proprietary segments without public catalog entries).", + "description": "Description-based selector — natural language audience description. Used when the caller doesn't have a specific signal ID (e.g., buyer setting plan-level goals, or seller using proprietary segments without public catalog entries).", "properties": { "type": { "type": "string", @@ -3987,7 +4111,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.371Z", + "generatedAt": "2026-04-19T02:29:11.738Z", "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/media-buy/get-media-buy-delivery-request.json b/schemas/cache/bundled/media-buy/get-media-buy-delivery-request.json index 01d74b614..4d3011265 100644 --- a/schemas/cache/bundled/media-buy/get-media-buy-delivery-request.json +++ b/schemas/cache/bundled/media-buy/get-media-buy-delivery-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-media-buy-delivery-request.json", "title": "Get Media Buy Delivery Request", "description": "Request parameters for retrieving comprehensive delivery metrics", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -191,7 +233,7 @@ "include_package_daily_breakdown": { "type": "boolean", "default": false, - "description": "When true, include daily_breakdown arrays within each package in by_package. Useful for per-package pacing analysis and line-item monitoring. Omit or set false to reduce response size \u2014 package daily data can be large for multi-package buys over long flights." + "description": "When true, include daily_breakdown arrays within each package in by_package. Useful for per-package pacing analysis and line-item monitoring. Omit or set false to reduce response size — package daily data can be large for multi-package buys over long flights." }, "attribution_window": { "type": "object", @@ -201,7 +243,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -234,7 +276,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -280,7 +322,7 @@ }, "reporting_dimensions": { "type": "object", - "description": "Request dimensional breakdowns in delivery reporting. Each key enables a specific breakdown dimension within by_package \u2014 include as an empty object (e.g., \"device_type\": {}) to activate with defaults. Omit entirely for no breakdowns (backward compatible). Unsupported dimensions are silently omitted from the response. Note: keyword, catalog_item, and creative breakdowns are returned automatically when the seller supports them and are not controlled by this object.", + "description": "Request dimensional breakdowns in delivery reporting. Each key enables a specific breakdown dimension within by_package — include as an empty object (e.g., \"device_type\": {}) to activate with defaults. Omit entirely for no breakdowns (backward compatible). Unsupported dimensions are silently omitted from the response. Note: keyword, catalog_item, and creative breakdowns are returned automatically when the seller supports them and are not controlled by this object.", "properties": { "geo": { "type": "object", @@ -562,7 +604,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.374Z", + "generatedAt": "2026-04-19T02:29:11.741Z", "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/media-buy/get-media-buy-delivery-response.json b/schemas/cache/bundled/media-buy/get-media-buy-delivery-response.json index 1150e91a5..ffd9a5d92 100644 --- a/schemas/cache/bundled/media-buy/get-media-buy-delivery-response.json +++ b/schemas/cache/bundled/media-buy/get-media-buy-delivery-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-media-buy-delivery-response.json", "title": "Get Media Buy Delivery Response", "description": "Response payload for get_media_buy_delivery task", "type": "object", @@ -69,7 +70,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -102,7 +103,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -212,7 +213,7 @@ }, "reach": { "type": "number", - "description": "Deduplicated reach across all media buys (if the seller can deduplicate across buys; otherwise sum of per-buy reach). Only present when all media buys share the same reach_unit. Omitted when reach units are heterogeneous \u2014 use per-buy reach values instead.", + "description": "Deduplicated reach across all media buys (if the seller can deduplicate across buys; otherwise sum of per-buy reach). Only present when all media buys share the same reach_unit. Omitted when reach units are heterogeneous — use per-buy reach values instead.", "minimum": 0 }, "reach_unit": { @@ -351,7 +352,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -496,7 +497,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -667,7 +668,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -808,7 +809,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -953,7 +954,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -1124,7 +1125,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -1282,7 +1283,7 @@ }, "is_final": { "type": "boolean", - "description": "Whether this delivery data is final for the reporting period. When false, the data may be updated as measurement matures (e.g., broadcast C7 window accumulating DVR playback) or as processing completes (e.g., IVT filtering, deduplication). When true, the seller considers this data closed \u2014 no further updates for this period. Absent means the seller does not distinguish provisional from final data." + "description": "Whether this delivery data is final for the reporting period. When false, the data may be updated as measurement matures (e.g., broadcast C7 window accumulating DVR playback) or as processing completes (e.g., IVT filtering, deduplication). When true, the seller considers this data closed — no further updates for this period. Absent means the seller does not distinguish provisional from final data." }, "measurement_window": { "type": "string", @@ -1336,7 +1337,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -1481,7 +1482,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -1652,7 +1653,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -1813,7 +1814,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -1958,7 +1959,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -2129,7 +2130,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -2246,7 +2247,7 @@ }, "by_keyword": { "type": "array", - "description": "Metrics broken down by keyword within this package. One row per (keyword, match_type) pair \u2014 the same keyword with different match types appears as separate rows. Keyword-grain only: rows reflect aggregate performance of each targeted keyword, not individual search queries. Rows may not sum to package totals when a single impression is attributed to the triggering keyword only. Available for search and retail media packages when the seller supports keyword-level reporting.", + "description": "Metrics broken down by keyword within this package. One row per (keyword, match_type) pair — the same keyword with different match types appears as separate rows. Keyword-grain only: rows reflect aggregate performance of each targeted keyword, not individual search queries. Rows may not sum to package totals when a single impression is attributed to the triggering keyword only. Available for search and retail media packages when the seller supports keyword-level reporting.", "items": { "allOf": [ { @@ -2277,7 +2278,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -2422,7 +2423,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -2593,7 +2594,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -2745,7 +2746,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -2890,7 +2891,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -3061,7 +3062,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -3227,7 +3228,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -3372,7 +3373,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -3543,7 +3544,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -3698,7 +3699,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -3843,7 +3844,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -4014,7 +4015,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -4175,7 +4176,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -4320,7 +4321,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -4491,7 +4492,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -4655,7 +4656,7 @@ }, "views": { "type": "number", - "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \u00d7 rate.", + "description": "Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views × rate.", "minimum": 0 }, "completed_views": { @@ -4800,7 +4801,7 @@ }, "reach": { "type": "number", - "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit.", + "description": "Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified — do not compare reach values across packages or media buys without a common reach_unit.", "minimum": 0 }, "reach_unit": { @@ -4971,7 +4972,7 @@ }, "engagements": { "type": "number", - "description": "Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", + "description": "Total engagements — direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric.", "minimum": 0 }, "follows": { @@ -5290,7 +5291,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.381Z", + "generatedAt": "2026-04-19T02:29:11.748Z", "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/media-buy/get-media-buys-request.json b/schemas/cache/bundled/media-buy/get-media-buys-request.json index da34eab11..b49411c79 100644 --- a/schemas/cache/bundled/media-buy/get-media-buys-request.json +++ b/schemas/cache/bundled/media-buy/get-media-buys-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-media-buys-request.json", "title": "Get Media Buys Request", "description": "Request parameters for retrieving media buy status, creative approval state, and optional delivery snapshots", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -224,7 +266,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.385Z", + "generatedAt": "2026-04-19T02:29:11.752Z", "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/media-buy/get-media-buys-response.json b/schemas/cache/bundled/media-buy/get-media-buys-response.json index 16603148d..d445ad027 100644 --- a/schemas/cache/bundled/media-buy/get-media-buys-response.json +++ b/schemas/cache/bundled/media-buy/get-media-buys-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-media-buys-response.json", "title": "Get Media Buys Response", "description": "Response payload for get_media_buys task. Returns media buy configuration, creative approval state, and optional delivery snapshots.", "type": "object", @@ -50,10 +51,10 @@ "enumDescriptions": { "active": "Account is operational and can create media buys", "pending_approval": "Seller is reviewing the account (credit, contracts)", - "rejected": "Seller declined the account request \u2014 terminal state", + "rejected": "Seller declined the account request — terminal state", "payment_required": "Credit limit reached or funds depleted", - "suspended": "Was active, now paused \u2014 operations gated", - "closed": "Was active, now terminated \u2014 terminal state" + "suspended": "Was active, now paused — operations gated", + "closed": "Was active, now terminated — terminal state" } }, "brand": { @@ -78,6 +79,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -390,7 +432,7 @@ }, "governance_agents": { "type": "array", - "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -420,7 +462,7 @@ }, "reporting_bucket": { "type": "object", - "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix \u2014 bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", + "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix — bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", "properties": { "protocol": { "title": "Cloud Storage Protocol", @@ -494,7 +536,7 @@ "type": "string", "format": "uri", "pattern": "^https://", - "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation \u2014 buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." + "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation — buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." } }, "required": [ @@ -506,7 +548,7 @@ }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." + "description": "When true, this is a sandbox account — no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "ext": { "title": "Extension Object", @@ -954,7 +996,7 @@ }, "valid_actions": { "type": "array", - "description": "Actions the buyer can perform on this media buy in its current state. Eliminates the need for agents to internalize the state machine \u2014 the seller declares what is permitted right now.", + "description": "Actions the buyer can perform on this media buy in its current state. Eliminates the need for agents to internalize the state machine — the seller declares what is permitted right now.", "items": { "type": "string", "enum": [ @@ -987,11 +1029,11 @@ }, "actor": { "type": "string", - "description": "Identity of who made the change \u2014 derived from authentication context, not caller-provided. Format is seller-defined (e.g., agent URL, user email, API key label)." + "description": "Identity of who made the change — derived from authentication context, not caller-provided. Format is seller-defined (e.g., agent URL, user email, API key label)." }, "action": { "type": "string", - "description": "What happened. Standard actions: created, activated, paused, resumed, canceled, rejected, completed, updated_budget, updated_dates, updated_packages, package_canceled, package_paused, package_resumed. Sellers MAY use additional platform-specific actions (e.g., creative_approved, targeting_updated) \u2014 use ext on the history entry for structured metadata about custom actions." + "description": "What happened. Standard actions: created, activated, paused, resumed, canceled, rejected, completed, updated_budget, updated_dates, updated_packages, package_canceled, package_paused, package_resumed. Sellers MAY use additional platform-specific actions (e.g., creative_approved, targeting_updated) — use ext on the history entry for structured metadata about custom actions." }, "summary": { "type": "string", @@ -1022,7 +1064,7 @@ "description": "Packages within this media buy, augmented with creative approval status and optional delivery snapshots", "items": { "title": "PackageStatus", - "description": "Current status of a package within a media buy \u2014 includes creative approval state and optional delivery snapshot. For the creation input shape, see PackageRequest. For the creation output shape, see Package.", + "description": "Current status of a package within a media buy — includes creative approval state and optional delivery snapshot. For the creation input shape, see PackageRequest. For the creation output shape, see Package.", "type": "object", "properties": { "package_id": { @@ -1207,7 +1249,7 @@ }, "snapshot": { "type": "object", - "description": "Near-real-time delivery snapshot for this package. Only present when include_snapshot was true in the request. Represents the latest available entity-level stats from the platform \u2014 not billing-grade data.", + "description": "Near-real-time delivery snapshot for this package. Only present when include_snapshot was true in the request. Represents the latest available entity-level stats from the platform — not billing-grade data.", "properties": { "as_of": { "type": "string", @@ -1246,7 +1288,7 @@ }, "delivery_status": { "type": "string", - "description": "Operational delivery state of this package. 'not_delivering' means the package is within its scheduled flight but has delivered zero impressions for at least one full staleness cycle \u2014 the signal for automated price adjustments or buyer alerts. Implementers must not return 'not_delivering' until at least staleness_seconds have elapsed since package activation.", + "description": "Operational delivery state of this package. 'not_delivering' means the package is within its scheduled flight but has delivered zero impressions for at least one full staleness cycle — the signal for automated price adjustments or buyer alerts. Implementers must not return 'not_delivering' until at least staleness_seconds have elapsed since package activation.", "enum": [ "delivering", "not_delivering", @@ -1401,7 +1443,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.386Z", + "generatedAt": "2026-04-19T02:29:11.754Z", "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/media-buy/get-products-request.json b/schemas/cache/bundled/media-buy/get-products-request.json index cede980cd..1b6ad3fff 100644 --- a/schemas/cache/bundled/media-buy/get-products-request.json +++ b/schemas/cache/bundled/media-buy/get-products-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-products-request.json", "title": "Get Products Request", "description": "Request parameters for discovering or refining advertising products. buying_mode declares the buyer's intent: 'brief' for curated discovery, 'wholesale' for raw catalog access, or 'refine' to iterate on known products and proposals.", "type": "object", @@ -17,7 +18,7 @@ "wholesale", "refine" ], - "description": "Declares buyer intent for this request. 'brief': publisher curates product recommendations from the provided brief. 'wholesale': buyer requests raw inventory to apply their own audiences \u2014 brief must not be provided, and proposals are omitted. 'refine': iterate on products and proposals from a previous get_products response using the refine array of change requests. v3 clients MUST include buying_mode. Sellers receiving requests from pre-v3 clients without buying_mode SHOULD default to 'brief'." + "description": "Declares buyer intent for this request. 'brief': publisher curates product recommendations from the provided brief. 'wholesale': buyer requests raw inventory to apply their own audiences — brief must not be provided, and proposals are omitted. 'refine': iterate on products and proposals from a previous get_products response using the refine array of change requests. v3 clients MUST include buying_mode. Sellers receiving requests from pre-v3 clients without buying_mode SHOULD default to 'brief'." }, "brief": { "type": "string", @@ -35,7 +36,7 @@ "scope": { "type": "string", "const": "request", - "description": "Change scoped to the overall request \u2014 direction for the selection as a whole." + "description": "Change scoped to the overall request — direction for the selection as a whole." }, "ask": { "type": "string", @@ -102,7 +103,7 @@ "omit", "finalize" ], - "description": "'include': return this proposal with updated allocations and pricing. 'omit': exclude this proposal from the response. 'finalize': request firm pricing and inventory hold \u2014 transitions a draft proposal to committed with an expires_at hold window. May trigger seller-side approval (HITL). The buyer should not set a time_budget for finalize requests \u2014 they represent a commitment to wait for the result." + "description": "'include': return this proposal with updated allocations and pricing. 'omit': exclude this proposal from the response. 'finalize': request firm pricing and inventory hold — transitions a draft proposal to committed with an expires_at hold window. May trigger seller-side approval (HITL). The buyer should not set a time_budget for finalize requests — they represent a commitment to wait for the result." }, "ask": { "type": "string", @@ -142,6 +143,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -177,7 +219,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -225,7 +267,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -250,7 +292,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -266,7 +308,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -443,7 +485,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -462,7 +504,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -672,6 +714,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -738,7 +821,7 @@ }, "preferred_delivery_types": { "type": "array", - "description": "Delivery types the buyer prefers, in priority order. Unlike filters.delivery_type which excludes non-matching products, this signals preference for curation \u2014 the publisher may still include other delivery types when they match the brief well.", + "description": "Delivery types the buyer prefers, in priority order. Unlike filters.delivery_type which excludes non-matching products, this signals preference for curation — the publisher may still include other delivery types when they match the brief well.", "items": { "title": "Delivery Type", "description": "Type of inventory delivery", @@ -783,9 +866,9 @@ "exclusive" ], "enumDescriptions": { - "none": "No exclusivity \u2014 multiple advertisers can buy this product simultaneously", - "category": "Category-exclusive \u2014 only one advertiser per industry category (e.g., one auto brand per collection sponsorship)", - "exclusive": "Sole sponsorship \u2014 only one advertiser can buy this product" + "none": "No exclusivity — multiple advertisers can buy this product simultaneously", + "category": "Category-exclusive — only one advertiser per industry category (e.g., one auto brand per collection sponsorship)", + "exclusive": "Sole sponsorship — only one advertiser can buy this product" } }, "is_fixed_price": { @@ -996,7 +1079,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -1434,7 +1517,7 @@ }, "geo_proximity": { "type": "array", - "description": "Filter by proximity to geographic points. Returns products with inventory coverage near these locations. Follows the same format as the targeting overlay \u2014 each entry uses exactly one method: travel_time + transport_mode, radius, or geometry. For locally-bound inventory (DOOH, radio), filters to products with coverage in the area. For digital inventory, filters to products from sellers supporting geo_proximity targeting.", + "description": "Filter by proximity to geographic points. Returns products with inventory coverage near these locations. Follows the same format as the targeting overlay — each entry uses exactly one method: travel_time + transport_mode, radius, or geometry. For locally-bound inventory (DOOH, radio), filters to products with coverage in the area. For digital inventory, filters to products from sellers supporting geo_proximity targeting.", "items": { "type": "object", "properties": { @@ -1452,7 +1535,7 @@ }, "label": { "type": "string", - "description": "Human-readable label (e.g., 'D\u00fcsseldorf', 'Heathrow Airport')" + "description": "Human-readable label (e.g., 'Düsseldorf', 'Heathrow Airport')" }, "travel_time": { "type": "object", @@ -1638,11 +1721,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -1686,6 +1769,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -1818,7 +1942,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1896,7 +2020,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.389Z", + "generatedAt": "2026-04-19T02:29:11.756Z", "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/media-buy/get-products-response.json b/schemas/cache/bundled/media-buy/get-products-response.json index 6feb0bb5e..cb8696bad 100644 --- a/schemas/cache/bundled/media-buy/get-products-response.json +++ b/schemas/cache/bundled/media-buy/get-products-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/get-products-response.json", "title": "Get Products Response", "description": "Response payload for get_products task", "type": "object", @@ -188,7 +189,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "uniqueItems": true @@ -352,9 +353,9 @@ "exclusive" ], "enumDescriptions": { - "none": "No exclusivity \u2014 multiple advertisers can buy this product simultaneously", - "category": "Category-exclusive \u2014 only one advertiser per industry category (e.g., one auto brand per collection sponsorship)", - "exclusive": "Sole sponsorship \u2014 only one advertiser can buy this product" + "none": "No exclusivity — multiple advertisers can buy this product simultaneously", + "category": "Category-exclusive — only one advertiser per industry category (e.g., one auto brand per collection sponsorship)", + "exclusive": "Sole sponsorship — only one advertiser can buy this product" } }, "pricing_options": { @@ -449,7 +450,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -466,7 +467,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -489,13 +490,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -539,7 +540,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -553,7 +554,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -652,7 +653,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -669,7 +670,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -692,13 +693,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -742,7 +743,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -756,7 +757,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -855,7 +856,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -872,7 +873,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -895,13 +896,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -945,7 +946,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -959,7 +960,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1058,7 +1059,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -1075,7 +1076,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1098,13 +1099,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -1148,7 +1149,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -1162,7 +1163,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1296,7 +1297,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -1313,7 +1314,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1336,13 +1337,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -1386,7 +1387,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -1400,7 +1401,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1535,7 +1536,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -1552,7 +1553,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1575,13 +1576,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -1625,7 +1626,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -1639,7 +1640,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1779,7 +1780,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -1796,7 +1797,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1819,13 +1820,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -1869,7 +1870,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -1883,7 +1884,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -1901,7 +1902,7 @@ }, { "title": "Flat Rate Pricing Option", - "description": "Flat rate pricing for sponsorships, takeovers, and DOOH exclusive placements. A fixed total cost regardless of delivery volume. For duration-scaled pricing (rate \u00d7 time units), use the `time` model instead. If fixed_price is present, it's fixed pricing. If absent, it's auction-based.", + "description": "Flat rate pricing for sponsorships, takeovers, and DOOH exclusive placements. A fixed total cost regardless of delivery volume. For duration-scaled pricing (rate × time units), use the `time` model instead. If fixed_price is present, it's fixed pricing. If absent, it's auction-based.", "type": "object", "properties": { "pricing_option_id": { @@ -1964,7 +1965,7 @@ }, "parameters": { "title": "DoohParameters", - "description": "DOOH inventory allocation parameters. Sponsorship and takeover flat_rate options omit this field entirely \u2014 only include for digital out-of-home inventory.", + "description": "DOOH inventory allocation parameters. Sponsorship and takeover flat_rate options omit this field entirely — only include for digital out-of-home inventory.", "type": "object", "properties": { "type": { @@ -2029,7 +2030,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -2046,7 +2047,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -2069,13 +2070,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -2119,7 +2120,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -2133,7 +2134,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -2225,7 +2226,7 @@ "week", "month" ], - "description": "The time unit for pricing. Total cost = fixed_price \u00d7 number of time_units in the campaign flight." + "description": "The time unit for pricing. Total cost = fixed_price × number of time_units in the campaign flight." }, "min_duration": { "type": "integer", @@ -2257,7 +2258,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -2274,7 +2275,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -2297,13 +2298,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -2347,7 +2348,7 @@ }, "eligible_adjustments": { "type": "array", - "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared \u2014 the buyer should check price_breakdown if present.", + "description": "Adjustment kinds applicable to this pricing option. Tells buyer agents which adjustments are available before negotiation. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present.", "items": { "title": "Price Adjustment Kind", "description": "Categorizes how a price adjustment affects the transaction", @@ -2361,7 +2362,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -2390,7 +2391,7 @@ "description": "Forecasted delivery data points. For spend curves (default), points at ascending budget levels show how metrics scale with spend. For availability forecasts, points represent total available inventory independent of budget. See forecast_range_unit for interpretation.", "items": { "title": "Forecast Point", - "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery \u2014 multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", + "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery — multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", "type": "object", "properties": { "label": { @@ -2410,7 +2411,7 @@ }, "metrics": { "type": "object", - "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory \u2014 use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", + "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory — use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", "properties": { "audience_size": { "title": "Forecast Range", @@ -3050,13 +3051,13 @@ ], "enumDescriptions": { "spend": "Points at ascending budget levels. Standard budget curve showing how delivery metrics scale with spend. Default when field is omitted.", - "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted \u2014 metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", + "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted — metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", "reach_freq": "Points at ascending reach/frequency targets. Used in broadcast planning where the publisher shows how cost scales with frequency goals.", "weekly": "Metrics are per-week values. Budget refers to total campaign spend. Frequency of 3.2 means 3.2 exposures per week.", "daily": "Metrics are per-day values. Budget refers to total campaign spend.", "clicks": "Points at ascending click targets. Used in performance campaigns where the buyer specifies click goals.", "conversions": "Points at ascending conversion targets. Used in goal-based planning (e.g., Meta-style 'tell me your goal, I'll tell you the budget').", - "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve \u2014 they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." + "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve — they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." } }, "method": { @@ -3113,7 +3114,7 @@ "type": "string", "maxLength": 64, "pattern": "^[a-z0-9_]+$", - "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation \u2014 measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", + "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation — measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", "examples": [ "nielsen", "videoamp", @@ -3200,7 +3201,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -3264,7 +3265,7 @@ }, "measurement_terms": { "title": "Measurement Terms", - "description": "Seller's default billing measurement and makegood terms. Declares who counts the billing metric and what remedies apply when thresholds are breached. Buyers may propose different terms at media buy creation \u2014 sellers accept, reject (TERMS_REJECTED), or adjust per their policy.", + "description": "Seller's default billing measurement and makegood terms. Declares who counts the billing metric and what remedies apply when thresholds are breached. Buyers may propose different terms at media buy creation — sellers accept, reject (TERMS_REJECTED), or adjust per their policy.", "type": "object", "properties": { "billing_measurement": { @@ -3293,6 +3294,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -3393,11 +3435,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -3441,6 +3483,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -3729,10 +3812,10 @@ }, "measurement_windows": { "type": "array", - "description": "Measurement maturation stages available for this product. Used by any channel where billing-grade data is produced in phases rather than arriving final on day one. Examples: broadcast/linear TV (Live \u2192 C3 \u2192 C7 DVR accumulation), DOOH (tentative plays \u2192 post-IVT/fraud-check final), digital with IVT filtering (raw \u2192 GIVT filtered \u2192 SIVT filtered), podcast (7-day downloads \u2192 30-day downloads). Each window defines an accumulation period and expected data availability. When present, delivery reports reference a specific window_id. Sellers whose data is final on first delivery typically omit this.", + "description": "Measurement maturation stages available for this product. Used by any channel where billing-grade data is produced in phases rather than arriving final on day one. Examples: broadcast/linear TV (Live → C3 → C7 DVR accumulation), DOOH (tentative plays → post-IVT/fraud-check final), digital with IVT filtering (raw → GIVT filtered → SIVT filtered), podcast (7-day downloads → 30-day downloads). Each window defines an accumulation period and expected data availability. When present, delivery reports reference a specific window_id. Sellers whose data is final on first delivery typically omit this.", "items": { "title": "Measurement Window", - "description": "A measurement maturation stage for any channel where billing-grade data is produced in phases rather than arriving final on day one. Each window represents an accumulation or processing stage with its own expected availability. Examples: broadcast/linear TV (live \u2192 C3 \u2192 C7 DVR accumulation), DOOH (tentative plays \u2192 post-IVT/fraud-check final), digital (raw impressions \u2192 GIVT filtered \u2192 SIVT filtered), podcast (7-day downloads \u2192 30-day downloads), audio/radio (tentative \u2192 diary/panel-certified). Sellers whose data is final on first delivery omit this.", + "description": "A measurement maturation stage for any channel where billing-grade data is produced in phases rather than arriving final on day one. Each window represents an accumulation or processing stage with its own expected availability. Examples: broadcast/linear TV (live → C3 → C7 DVR accumulation), DOOH (tentative plays → post-IVT/fraud-check final), digital (raw impressions → GIVT filtered → SIVT filtered), podcast (7-day downloads → 30-day downloads), audio/radio (tentative → diary/panel-certified). Sellers whose data is final on first delivery omit this.", "type": "object", "properties": { "window_id": { @@ -3763,12 +3846,12 @@ }, "duration_days": { "type": "integer", - "description": "Number of days of accumulation included in this window before processing begins. For broadcast, this is DVR accumulation (0 = live only, 3 = live + 3 days DVR, 7 = live + 7 days DVR). For channels without an accumulation period (DOOH tentative\u2192final, digital IVT filtering), this is 0 \u2014 maturation is entirely vendor processing time captured in expected_availability_days.", + "description": "Number of days of accumulation included in this window before processing begins. For broadcast, this is DVR accumulation (0 = live only, 3 = live + 3 days DVR, 7 = live + 7 days DVR). For channels without an accumulation period (DOOH tentative→final, digital IVT filtering), this is 0 — maturation is entirely vendor processing time captured in expected_availability_days.", "minimum": 0 }, "expected_availability_days": { "type": "integer", - "description": "Expected number of days after delivery before this window's data is available from the measurement vendor. Captures accumulation time plus vendor processing time. Examples: broadcast C7 from VideoAmp ~22 days (7-day accumulation + ~15-day processing); DOOH tentative plays same-day; DOOH final (post-IVT/fraud-check) ~1 day; digital post-SIVT ~2\u20133 days.", + "description": "Expected number of days after delivery before this window's data is available from the measurement vendor. Captures accumulation time plus vendor processing time. Examples: broadcast C7 from VideoAmp ~22 days (7-day accumulation + ~15-day processing); DOOH tentative plays same-day; DOOH final (post-IVT/fraud-check) ~1 day; digital post-SIVT ~2–3 days.", "minimum": 0 }, "is_guarantee_basis": { @@ -3975,7 +4058,7 @@ }, "metric_optimization": { "type": "object", - "description": "Metric optimization capabilities for this product. Presence indicates the product supports optimization_goals with kind: 'metric'. No event source or conversion tracking setup required \u2014 the seller tracks these metrics natively.", + "description": "Metric optimization capabilities for this product. Presence indicates the product supports optimization_goals with kind: 'metric'. No event source or conversion tracking setup required — the seller tracks these metrics natively.", "properties": { "supported_metrics": { "type": "array", @@ -4000,7 +4083,7 @@ }, "supported_reach_units": { "type": "array", - "description": "Reach units this product can optimize for. Required when supported_metrics includes 'reach'. Buyers must set reach_unit to a value in this list on reach optimization goals \u2014 sellers reject unsupported values.", + "description": "Reach units this product can optimize for. Required when supported_metrics includes 'reach'. Buyers must set reach_unit to a value in this list on reach optimization goals — sellers reject unsupported values.", "items": { "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.", @@ -4026,7 +4109,7 @@ }, "supported_view_durations": { "type": "array", - "description": "Video view duration thresholds (in seconds) this product supports for completed_views goals. Only relevant when supported_metrics includes 'completed_views'. When absent, the seller uses their platform default. Buyers must set view_duration_seconds to a value in this list \u2014 sellers reject unsupported values.", + "description": "Video view duration thresholds (in seconds) this product supports for completed_views goals. Only relevant when supported_metrics includes 'completed_views'. When absent, the seller uses their platform default. Buyers must set view_duration_seconds to a value in this list — sellers reject unsupported values.", "items": { "type": "number", "exclusiveMinimum": 0 @@ -4034,7 +4117,7 @@ }, "supported_targets": { "type": "array", - "description": "Target kinds available for metric goals on this product. Values match target.kind on the optimization goal. Only these target kinds are accepted \u2014 goals with unlisted target kinds will be rejected. When omitted, buyers can set target-less metric goals (maximize volume within budget) but cannot set specific targets.", + "description": "Target kinds available for metric goals on this product. Values match target.kind on the optimization goal. Only these target kinds are accepted — goals with unlisted target kinds will be rejected. When omitted, buyers can set target-less metric goals (maximize volume within budget) but cannot set specific targets.", "items": { "type": "string", "enum": [ @@ -4052,7 +4135,7 @@ "max_optimization_goals": { "type": "integer", "minimum": 1, - "description": "Maximum number of optimization_goals this product accepts on a package. When absent, no limit is declared. Most social platforms accept only 1 goal \u2014 buyers sending arrays longer than this value should expect the seller to use only the highest-priority (lowest priority number) goal." + "description": "Maximum number of optimization_goals this product accepts on a package. When absent, no limit is declared. Most social platforms accept only 1 goal — buyers sending arrays longer than this value should expect the seller to use only the highest-priority (lowest priority number) goal." }, "measurement_readiness": { "title": "Measurement Readiness", @@ -4070,7 +4153,7 @@ "excellent" ], "enumDescriptions": { - "insufficient": "Setup incomplete or event quality too low \u2014 optimization cannot run", + "insufficient": "Setup incomplete or event quality too low — optimization cannot run", "minimum": "Functional but data quality limits optimization effectiveness", "good": "Meets quality thresholds for most optimization goals", "excellent": "Exceeds quality thresholds across all dimensions" @@ -4292,7 +4375,7 @@ }, "supported_targets": { "type": "array", - "description": "Target kinds available for event goals on this product. Values match target.kind on the optimization goal. cost_per: target cost per conversion event. per_ad_spend: target return on ad spend (requires value_field on event sources). maximize_value: maximize total conversion value without a specific ratio target (requires value_field). Only these target kinds are accepted \u2014 goals with unlisted target kinds will be rejected. A goal without a target implicitly maximizes conversion count within budget \u2014 no declaration needed for that mode. When omitted, buyers can still set target-less event goals.", + "description": "Target kinds available for event goals on this product. Values match target.kind on the optimization goal. cost_per: target cost per conversion event. per_ad_spend: target return on ad spend (requires value_field on event sources). maximize_value: maximize total conversion value without a specific ratio target (requires value_field). Only these target kinds are accepted — goals with unlisted target kinds will be rejected. A goal without a target implicitly maximizes conversion count within budget — no declaration needed for that mode. When omitted, buyers can still set target-less event goals.", "items": { "type": "string", "enum": [ @@ -4508,14 +4591,14 @@ "collection_targeting_allowed": { "type": "boolean", "default": false, - "description": "Whether buyers can target a subset of this product's collections. When false (default), the product is a bundle \u2014 buyers get all listed collections. When true, buyers can select specific collections in the media buy." + "description": "Whether buyers can target a subset of this product's collections. When false (default), the product is a bundle — buyers get all listed collections. When true, buyers can select specific collections in the media buy." }, "installments": { "type": "array", "description": "Specific installments included in this product. Each installment references its parent collection via collection_id when the product spans multiple collections. When absent with collections present, the product covers the collections broadly (run-of-collection).", "items": { "title": "Installment", - "description": "A single bookable unit within a collection \u2014 one episode, issue, event, or rotation period. The parent collection's kind indicates how to interpret each installment: TV/podcast episodes, print issues, live event airings, newsletter editions, or DOOH rotation periods. Installments inherit collection-level fields they don't override: content_rating defaults to the collection's baseline, guest_talent is additive to the collection's recurring talent, and topics add context beyond the collection's genre.", + "description": "A single bookable unit within a collection — one episode, issue, event, or rotation period. The parent collection's kind indicates how to interpret each installment: TV/podcast episodes, print issues, live event airings, newsletter editions, or DOOH rotation periods. Installments inherit collection-level fields they don't override: content_rating defaults to the collection's baseline, guest_talent is additive to the collection's recurring talent, and topics add context beyond the collection's genre.", "type": "object", "properties": { "installment_id": { @@ -4606,13 +4689,13 @@ "tv_parental": "US TV Parental Guidelines (TV-Y, TV-Y7, TV-G, TV-PG, TV-14, TV-MA)", "mpaa": "Motion Picture Association film ratings (G, PG, PG-13, R, NC-17)", "podcast": "Podcast content advisories (clean, explicit)", - "esrb": "Entertainment Software Rating Board (E, E10+, T, M, AO) \u2014 US/Canada", + "esrb": "Entertainment Software Rating Board (E, E10+, T, M, AO) — US/Canada", "bbfc": "British Board of Film Classification (U, PG, 12A, 12, 15, 18, R18)", - "fsk": "Freiwillige Selbstkontrolle der Filmwirtschaft (0, 6, 12, 16, 18) \u2014 Germany", + "fsk": "Freiwillige Selbstkontrolle der Filmwirtschaft (0, 6, 12, 16, 18) — Germany", "acb": "Australian Classification Board (G, PG, M, MA15+, R18+)", "chvrs": "Canadian Home Video Rating System (G, PG, 14A, 18A, R, A)", - "csa": "Conseil superieur de l'audiovisuel / Arcom (-10, -12, -16, -18) \u2014 France", - "pegi": "Pan European Game Information (3, 7, 12, 16, 18) \u2014 pan-European gaming", + "csa": "Conseil superieur de l'audiovisuel / Arcom (-10, -12, -16, -18) — France", + "pegi": "Pan European Game Information (3, 7, 12, 16, 18) — pan-European gaming", "custom": "Publisher-defined rating system with free-form values" } }, @@ -4929,7 +5012,7 @@ }, "dynamic_brands": { "type": "boolean", - "description": "Whether the buyer can select a brand at match time. When false (default), the brand must be specified on the media buy/package. When true, the buyer's offer can include any brand \u2014 the publisher applies approval rules at match time. Enables multi-brand agreements where the holding company or buyer agent selects brand based on context.", + "description": "Whether the buyer can select a brand at match time. When false (default), the brand must be specified on the media buy/package. When true, the buyer's offer can include any brand — the publisher applies approval rules at match time. Enables multi-brand agreements where the holding company or buyer agent selects brand based on context.", "default": false }, "providers": { @@ -5211,7 +5294,7 @@ "description": "Forecasted delivery data points. For spend curves (default), points at ascending budget levels show how metrics scale with spend. For availability forecasts, points represent total available inventory independent of budget. See forecast_range_unit for interpretation.", "items": { "title": "Forecast Point", - "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery \u2014 multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", + "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery — multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", "type": "object", "properties": { "label": { @@ -5231,7 +5314,7 @@ }, "metrics": { "type": "object", - "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory \u2014 use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", + "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory — use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", "properties": { "audience_size": { "title": "Forecast Range", @@ -5871,13 +5954,13 @@ ], "enumDescriptions": { "spend": "Points at ascending budget levels. Standard budget curve showing how delivery metrics scale with spend. Default when field is omitted.", - "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted \u2014 metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", + "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted — metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", "reach_freq": "Points at ascending reach/frequency targets. Used in broadcast planning where the publisher shows how cost scales with frequency goals.", "weekly": "Metrics are per-week values. Budget refers to total campaign spend. Frequency of 3.2 means 3.2 exposures per week.", "daily": "Metrics are per-day values. Budget refers to total campaign spend.", "clicks": "Points at ascending click targets. Used in performance campaigns where the buyer specifies click goals.", "conversions": "Points at ascending conversion targets. Used in goal-based planning (e.g., Meta-style 'tell me your goal, I'll tell you the budget').", - "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve \u2014 they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." + "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve — they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." } }, "method": { @@ -5934,7 +6017,7 @@ "type": "string", "maxLength": 64, "pattern": "^[a-z0-9_]+$", - "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation \u2014 measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", + "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation — measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", "examples": [ "nielsen", "videoamp", @@ -6012,7 +6095,7 @@ }, "proposal_status": { "title": "Proposal Status", - "description": "Lifecycle status of this proposal. When absent, the proposal is ready to buy (backward compatible). 'draft' means indicative pricing \u2014 finalize via refine before purchasing. 'committed' means firm pricing with inventory reserved until expires_at.", + "description": "Lifecycle status of this proposal. When absent, the proposal is ready to buy (backward compatible). 'draft' means indicative pricing — finalize via refine before purchasing. 'committed' means firm pricing with inventory reserved until expires_at.", "type": "string", "enum": [ "draft", @@ -6026,7 +6109,7 @@ "expires_at": { "type": "string", "format": "date-time", - "description": "When this proposal expires and can no longer be executed. For draft proposals, indicates when indicative pricing becomes stale. For committed proposals, indicates when the inventory hold lapses \u2014 the buyer must call create_media_buy before this time." + "description": "When this proposal expires and can no longer be executed. For draft proposals, indicates when indicative pricing becomes stale. For committed proposals, indicates when the inventory hold lapses — the buyer must call create_media_buy before this time." }, "insertion_order": { "title": "Insertion Order", @@ -6040,7 +6123,7 @@ }, "terms": { "type": "object", - "description": "Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.", + "description": "Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces — deal terms live on products and packages.", "properties": { "advertiser": { "type": "string", @@ -6158,7 +6241,7 @@ "description": "Forecasted delivery data points. For spend curves (default), points at ascending budget levels show how metrics scale with spend. For availability forecasts, points represent total available inventory independent of budget. See forecast_range_unit for interpretation.", "items": { "title": "Forecast Point", - "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery \u2014 multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", + "description": "A forecast data point. When budget is present, the point pairs a spend level with expected delivery — multiple points at ascending budgets form a curve. When budget is omitted, the point represents total available inventory for the requested targeting and dates, independent of spend.", "type": "object", "properties": { "label": { @@ -6178,7 +6261,7 @@ }, "metrics": { "type": "object", - "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory \u2014 use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", + "description": "Forecasted metric values. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { \"mid\": value } for point estimates. When budget is present, these are the expected metrics at that spend level. When budget is omitted, these represent total available inventory — use spend to express the estimated cost. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).", "properties": { "audience_size": { "title": "Forecast Range", @@ -6818,13 +6901,13 @@ ], "enumDescriptions": { "spend": "Points at ascending budget levels. Standard budget curve showing how delivery metrics scale with spend. Default when field is omitted.", - "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted \u2014 metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", + "availability": "Each point represents total available inventory for the requested targeting and dates. Budget is omitted — metrics express what exists, not what a given spend level buys. Use metrics.spend to express the estimated cost. Typical for guaranteed and direct-sold inventory where the forecast is an availability check.", "reach_freq": "Points at ascending reach/frequency targets. Used in broadcast planning where the publisher shows how cost scales with frequency goals.", "weekly": "Metrics are per-week values. Budget refers to total campaign spend. Frequency of 3.2 means 3.2 exposures per week.", "daily": "Metrics are per-day values. Budget refers to total campaign spend.", "clicks": "Points at ascending click targets. Used in performance campaigns where the buyer specifies click goals.", "conversions": "Points at ascending conversion targets. Used in goal-based planning (e.g., Meta-style 'tell me your goal, I'll tell you the budget').", - "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve \u2014 they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." + "package": "Each point represents a distinct inventory package (e.g., Good/Better/Best tiers, daypart packages, sponsorships). Points are not levels on a spend curve — they are separate products with different inventory compositions. Used by broadcast TV, audio, and DOOH sellers who sell packages rather than impressions at variable spend levels." } }, "method": { @@ -6881,7 +6964,7 @@ "type": "string", "maxLength": 64, "pattern": "^[a-z0-9_]+$", - "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation \u2014 measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", + "description": "Third-party measurement provider whose data was used to produce this forecast. Distinct from demographic_system, which specifies demographic notation — measurement_source identifies whose data produced the forecast numbers. Should be present when measured_impressions is used. Lowercase slug format.", "examples": [ "nielsen", "videoamp", @@ -7045,7 +7128,7 @@ "partial", "unable" ], - "description": "'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled \u2014 see notes for details. 'unable': the seller could not fulfill the ask \u2014 see notes for why." + "description": "'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why." }, "notes": { "type": "string", @@ -7083,7 +7166,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -7166,7 +7249,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.397Z", + "generatedAt": "2026-04-19T02:29:11.765Z", "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/media-buy/list-creative-formats-request.json b/schemas/cache/bundled/media-buy/list-creative-formats-request.json index 98673d5a4..9095f0feb 100644 --- a/schemas/cache/bundled/media-buy/list-creative-formats-request.json +++ b/schemas/cache/bundled/media-buy/list-creative-formats-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/list-creative-formats-request.json", "title": "List Creative Formats Request", "description": "Request parameters for discovering supported creative formats", "type": "object", @@ -169,7 +170,7 @@ }, "output_format_ids": { "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.", + "description": "Filter to formats whose output_format_ids includes any of these format IDs. Returns formats that can produce these outputs — 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.", @@ -219,7 +220,7 @@ }, "input_format_ids": { "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.", + "description": "Filter to formats whose input_format_ids includes any of these format IDs. Returns formats that accept these creatives as input — 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.", @@ -301,7 +302,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.402Z", + "generatedAt": "2026-04-19T02:29:11.772Z", "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/media-buy/list-creative-formats-response.json b/schemas/cache/bundled/media-buy/list-creative-formats-response.json index dbbb05e4a..25063fea5 100644 --- a/schemas/cache/bundled/media-buy/list-creative-formats-response.json +++ b/schemas/cache/bundled/media-buy/list-creative-formats-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/list-creative-formats-response.json", "title": "List Creative Formats Response", "description": "Response payload for list_creative_formats task", "type": "object", @@ -26,7 +27,7 @@ }, "asset_role": { "type": "string", - "description": "Descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). For documentation and UI display only \u2014 manifests key assets by asset_id, not asset_role." + "description": "Descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). For documentation and UI display only — manifests key assets by asset_id, not asset_role." }, "required": { "type": "boolean", @@ -140,7 +141,7 @@ }, "asset_role": { "type": "string", - "description": "Descriptive label for this asset's purpose. For documentation and UI display only \u2014 manifests key assets by asset_id, not asset_role." + "description": "Descriptive label for this asset's purpose. For documentation and UI display only — manifests key assets by asset_id, not asset_role." }, "required": { "type": "boolean", @@ -1397,7 +1398,7 @@ "properties": { "asset_group_id": { "type": "string", - "description": "The asset group this constraint applies to. Values are format-defined vocabulary \u2014 each format chooses its own group IDs (e.g., 'headlines', 'images', 'videos'). Buyers discover them via list_creative_formats." + "description": "The asset group this constraint applies to. Values are format-defined vocabulary — each format chooses its own group IDs (e.g., 'headlines', 'images', 'videos'). Buyers discover them via list_creative_formats." }, "asset_type": { "title": "Asset Content Type", @@ -2137,10 +2138,10 @@ }, "field_bindings": { "type": "array", - "description": "Explicit mappings from format template slots to catalog item fields or typed asset pools. Optional \u2014 creative agents can infer mappings without them, but bindings make the relationship self-describing and enable validation. Covers scalar fields (asset_id \u2192 catalog_field), asset pools (asset_id \u2192 asset_group_id on the catalog item), and repeatable groups that iterate over catalog items.", + "description": "Explicit mappings from format template slots to catalog item fields or typed asset pools. Optional — creative agents can infer mappings without them, but bindings make the relationship self-describing and enable validation. Covers scalar fields (asset_id → catalog_field), asset pools (asset_id → asset_group_id on the catalog item), and repeatable groups that iterate over catalog items.", "items": { "title": "Catalog Field Binding", - "description": "Maps a format template slot to a catalog item field or typed asset pool. The 'kind' field identifies the binding variant. All bindings are optional \u2014 agents can still infer mappings without them.", + "description": "Maps a format template slot to a catalog item field or typed asset pool. The 'kind' field identifies the binding variant. All bindings are optional — agents can still infer mappings without them.", "definitions": { "ScalarBinding": { "type": "object", @@ -2259,7 +2260,7 @@ ], "examples": [ { - "description": "Scalar binding \u2014 hotel name to headline slot", + "description": "Scalar binding — hotel name to headline slot", "data": { "kind": "scalar", "asset_id": "headline", @@ -2267,7 +2268,7 @@ } }, { - "description": "Scalar binding \u2014 nested field (nightly rate)", + "description": "Scalar binding — nested field (nightly rate)", "data": { "kind": "scalar", "asset_id": "price_badge", @@ -2275,7 +2276,7 @@ } }, { - "description": "Asset pool binding \u2014 hero image from landscape pool", + "description": "Asset pool binding — hero image from landscape pool", "data": { "kind": "asset_pool", "asset_id": "hero_image", @@ -2283,7 +2284,7 @@ } }, { - "description": "Asset pool binding \u2014 Snap vertical background from vertical pool", + "description": "Asset pool binding — Snap vertical background from vertical pool", "data": { "kind": "asset_pool", "asset_id": "snap_background", @@ -2291,7 +2292,7 @@ } }, { - "description": "Catalog group binding \u2014 carousel where each slide is one hotel", + "description": "Catalog group binding — carousel where each slide is one hotel", "data": { "kind": "catalog_group", "format_group_id": "slide", @@ -3336,8 +3337,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -3550,7 +3551,7 @@ }, "supported_disclosure_positions": { "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.", + "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 — 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.", @@ -3721,7 +3722,7 @@ "description": "Pricing options for this format. Used by transformation and generation agents that charge per format adapted, per image generated, or per unit of work. Present when the request included include_pricing=true and account. Ad servers and library-based agents expose pricing on list_creatives instead.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -3775,7 +3776,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -3790,7 +3791,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -3867,7 +3868,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -4045,7 +4046,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.405Z", + "generatedAt": "2026-04-19T02:29:11.775Z", "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/media-buy/log-event-request.json b/schemas/cache/bundled/media-buy/log-event-request.json index 7fd486068..b7461f088 100644 --- a/schemas/cache/bundled/media-buy/log-event-request.json +++ b/schemas/cache/bundled/media-buy/log-event-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/log-event-request.json", "title": "Log Event Request", "description": "Request parameters for logging marketing events", "type": "object", @@ -385,7 +386,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.408Z", + "generatedAt": "2026-04-19T02:29:11.778Z", "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/media-buy/log-event-response.json b/schemas/cache/bundled/media-buy/log-event-response.json index 500ceddb0..f34cdf12b 100644 --- a/schemas/cache/bundled/media-buy/log-event-response.json +++ b/schemas/cache/bundled/media-buy/log-event-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/log-event-response.json", "title": "Log Event Response", "description": "Response from event logging operation. Returns either event processing results OR operation-level errors.", "type": "object", @@ -186,7 +187,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.408Z", + "generatedAt": "2026-04-19T02:29:11.779Z", "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/media-buy/package-request.json b/schemas/cache/bundled/media-buy/package-request.json index 212d26363..690f19aae 100644 --- a/schemas/cache/bundled/media-buy/package-request.json +++ b/schemas/cache/bundled/media-buy/package-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/package-request.json", "title": "Package Request", "description": "Package configuration for media buy creation", "type": "object", @@ -118,7 +119,7 @@ }, "catalogs": { "type": "array", - "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level \u2014 sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", + "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -134,7 +135,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -182,7 +183,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -207,7 +208,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -223,7 +224,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -400,7 +401,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -419,7 +420,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -594,11 +595,11 @@ "description": "Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -619,7 +620,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -665,7 +666,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -715,7 +716,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -784,7 +785,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -864,12 +865,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -881,7 +882,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -947,7 +948,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -980,7 +981,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1289,7 +1290,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1297,7 +1298,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1312,7 +1313,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1343,7 +1344,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -1381,7 +1382,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1587,7 +1588,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1605,7 +1606,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1654,7 +1655,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1672,7 +1673,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -1855,7 +1856,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1950,6 +1951,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2050,11 +2092,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -2098,6 +2140,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2142,7 +2225,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -2441,7 +2524,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2490,7 +2573,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2918,7 +3001,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2967,7 +3050,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3280,7 +3363,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3329,7 +3412,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3663,7 +3746,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3712,7 +3795,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4042,7 +4125,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4091,7 +4174,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4348,7 +4431,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4397,7 +4480,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4662,7 +4745,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4711,7 +4794,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4988,7 +5071,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5037,7 +5120,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5320,7 +5403,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5369,7 +5452,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5587,8 +5670,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -5746,8 +5829,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -5993,7 +6076,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6042,7 +6125,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6298,7 +6381,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6347,7 +6430,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6663,7 +6746,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6712,7 +6795,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7024,7 +7107,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7073,7 +7156,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7270,7 +7353,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -7380,7 +7463,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -7428,7 +7511,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -7453,7 +7536,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -7469,7 +7552,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -7646,7 +7729,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -7665,7 +7748,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -7891,7 +7974,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -7927,9 +8010,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -8134,7 +8217,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8183,7 +8266,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8272,7 +8355,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.416Z", + "generatedAt": "2026-04-19T02:29:11.785Z", "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/media-buy/provide-performance-feedback-request.json b/schemas/cache/bundled/media-buy/provide-performance-feedback-request.json index 27dc44b0b..23df4dc4a 100644 --- a/schemas/cache/bundled/media-buy/provide-performance-feedback-request.json +++ b/schemas/cache/bundled/media-buy/provide-performance-feedback-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/provide-performance-feedback-request.json", "title": "Provide Performance Feedback Request", "description": "Request payload for provide_performance_feedback task", "type": "object", @@ -108,7 +109,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.422Z", + "generatedAt": "2026-04-19T02:29:11.791Z", "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/media-buy/provide-performance-feedback-response.json b/schemas/cache/bundled/media-buy/provide-performance-feedback-response.json index 5685eccca..f3be6a1c2 100644 --- a/schemas/cache/bundled/media-buy/provide-performance-feedback-response.json +++ b/schemas/cache/bundled/media-buy/provide-performance-feedback-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/provide-performance-feedback-response.json", "title": "Provide Performance Feedback Response", "description": "Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.", "type": "object", @@ -135,7 +136,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.422Z", + "generatedAt": "2026-04-19T02:29:11.791Z", "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/media-buy/sync-audiences-request.json b/schemas/cache/bundled/media-buy/sync-audiences-request.json index 5baa7967d..2fbe625c1 100644 --- a/schemas/cache/bundled/media-buy/sync-audiences-request.json +++ b/schemas/cache/bundled/media-buy/sync-audiences-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-audiences-request.json", "title": "Sync Audiences Request", - "description": "Request parameters for managing CRM-based audiences on an account with upsert semantics. Existing audiences matched by audience_id are updated, new ones are created. Members are specified as delta operations: add appends new members, remove drops existing ones. Recommend no more than 100,000 members per call; for larger lists, chunk and call incrementally using add/remove deltas. When delete_missing is true, buyer-managed audiences on the account not in this request are removed \u2014 do not combine with omitted audiences or all buyer-managed audiences will be deleted. When audiences is omitted, the call is discovery-only: it returns all audiences on the account without modification.", + "description": "Request parameters for managing CRM-based audiences on an account with upsert semantics. Existing audiences matched by audience_id are updated, new ones are created. Members are specified as delta operations: add appends new members, remove drops existing ones. Recommend no more than 100,000 members per call; for larger lists, chunk and call incrementally using add/remove deltas. When delete_missing is true, buyer-managed audiences on the account not in this request are removed — do not combine with omitted audiences or all buyer-managed audiences will be deleted. When audiences is omitted, the call is discovery-only: it returns all audiences on the account without modification.", "type": "object", "properties": { "adcp_major_version": { @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. `audience_id` gives resource-level dedup per audience, but the sync envelope emits audit events and may trigger downstream refreshes \u2014 this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `audiences` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", + "description": "Client-generated unique key for at-most-once execution. `audience_id` gives resource-level dedup per audience, but the sync envelope emits audit events and may trigger downstream refreshes — this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `audiences` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -58,6 +59,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -161,10 +203,10 @@ }, "add": { "type": "array", - "description": "Members to add to this audience. Hashed before sending \u2014 normalize emails to lowercase+trim, phones to E.164.", + "description": "Members to add to this audience. Hashed before sending — normalize emails to lowercase+trim, phones to E.164.", "items": { "title": "Audience Member", - "description": "A CRM audience member identified by a buyer-assigned external_id and at least one matchable identifier. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized \u2014 use the ext field for platform-specific extensions.", + "description": "A CRM audience member identified by a buyer-assigned external_id and at least one matchable identifier. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized — use the ext field for platform-specific extensions.", "type": "object", "properties": { "external_id": { @@ -265,7 +307,7 @@ "description": "Members to remove from this audience. If the same identifier appears in both add and remove in a single request, remove takes precedence.", "items": { "title": "Audience Member", - "description": "A CRM audience member identified by a buyer-assigned external_id and at least one matchable identifier. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized \u2014 use the ext field for platform-specific extensions.", + "description": "A CRM audience member identified by a buyer-assigned external_id and at least one matchable identifier. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized — use the ext field for platform-specific extensions.", "type": "object", "properties": { "external_id": { @@ -367,7 +409,7 @@ }, "consent_basis": { "title": "Consent Basis", - "description": "GDPR lawful basis for processing this audience list. Informational \u2014 not validated by the protocol, but required by some sellers operating in regulated markets (e.g. EU). When omitted, the buyer asserts they have a lawful basis appropriate to their jurisdiction.", + "description": "GDPR lawful basis for processing this audience list. Informational — not validated by the protocol, but required by some sellers operating in regulated markets (e.g. EU). When omitted, the buyer asserts they have a lawful basis appropriate to their jurisdiction.", "type": "string", "enum": [ "consent", @@ -422,7 +464,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.423Z", + "generatedAt": "2026-04-19T02:29:11.792Z", "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/media-buy/sync-audiences-response.json b/schemas/cache/bundled/media-buy/sync-audiences-response.json index 4383dcc64..a1f135e56 100644 --- a/schemas/cache/bundled/media-buy/sync-audiences-response.json +++ b/schemas/cache/bundled/media-buy/sync-audiences-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-audiences-response.json", "title": "Sync Audiences Response", "description": "Response from audience sync operation. Returns either per-audience results OR operation-level errors.", "type": "object", @@ -45,7 +46,7 @@ "ready", "too_small" ], - "description": "Matching status. Present when action is created, updated, or unchanged; absent when action is deleted or failed. 'processing': platform is still matching members against its user base. 'ready': audience is available for targeting, matched_count is populated. 'too_small': matched audience is below the platform's minimum size \u2014 add more members and re-sync." + "description": "Matching status. Present when action is created, updated, or unchanged; absent when action is deleted or failed. 'processing': platform is still matching members against its user base. 'ready': audience is available for targeting, matched_count is populated. 'too_small': matched audience is below the platform's minimum size — add more members and re-sync." }, "uploaded_count": { "type": "integer", @@ -113,7 +114,7 @@ }, "match_rate": { "type": "number", - "description": "Match rate for this identifier type (matched / submitted). Server-authoritative \u2014 consumers should prefer this value over computing their own.", + "description": "Match rate for this identifier type (matched / submitted). Server-authoritative — consumers should prefer this value over computing their own.", "minimum": 0, "maximum": 1 } @@ -321,7 +322,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.423Z", + "generatedAt": "2026-04-19T02:29:11.793Z", "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/media-buy/sync-catalogs-request.json b/schemas/cache/bundled/media-buy/sync-catalogs-request.json index eef6c118e..9af17f0d4 100644 --- a/schemas/cache/bundled/media-buy/sync-catalogs-request.json +++ b/schemas/cache/bundled/media-buy/sync-catalogs-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-catalogs-request.json", "title": "Sync Catalogs Request", "description": "Request parameters for syncing catalog feeds with upsert semantics. Supports bulk operations across multiple catalog types (products, inventory, stores, promotions, offerings). Existing catalogs matched by catalog_id are updated, new ones are created. When catalogs is omitted, the call is discovery-only: returns all catalogs on the account without modification.", "type": "object", @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. `catalog_id` gives resource-level dedup per catalog, but the sync envelope emits audit events and triggers platform review for large feeds \u2014 this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `catalogs` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", + "description": "Client-generated unique key for at-most-once execution. `catalog_id` gives resource-level dedup per catalog, but the sync envelope emits audit events and triggers platform review for large feeds — this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `catalogs` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -58,6 +59,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -140,7 +182,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -188,7 +230,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -213,7 +255,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -229,7 +271,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -406,7 +448,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -425,7 +467,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -709,7 +751,7 @@ "required": [ "catalogs" ], - "errorMessage": "catalogs is required when delete_missing is true \u2014 omitting it would delete all buyer-managed catalogs on the account" + "errorMessage": "catalogs is required when delete_missing is true — omitting it would delete all buyer-managed catalogs on the account" }, "additionalProperties": true, "examples": [ @@ -783,7 +825,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.424Z", + "generatedAt": "2026-04-19T02:29:11.794Z", "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/media-buy/sync-catalogs-response.json b/schemas/cache/bundled/media-buy/sync-catalogs-response.json index 2f1700fdf..efdfd8212 100644 --- a/schemas/cache/bundled/media-buy/sync-catalogs-response.json +++ b/schemas/cache/bundled/media-buy/sync-catalogs-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-catalogs-response.json", "title": "Sync Catalogs Response", "description": "Response from catalog sync operation. Returns either per-catalog results (best-effort processing) OR operation-level errors (complete failure). Platforms may approve, reject, or flag individual items within each catalog (similar to Google Merchant Center product review).", "type": "object", @@ -82,7 +83,7 @@ "enumDescriptions": { "approved": "Item passed platform review and is eligible for use in campaigns", "pending": "Item is awaiting platform review. Items enter this state on initial sync and when re-synced after rejection.", - "rejected": "Item failed platform review (missing fields, policy violation, invalid data). Not terminal \u2014 fix the issue in the catalog and re-sync to reset the item to pending.", + "rejected": "Item failed platform review (missing fields, policy violation, invalid data). Not terminal — fix the issue in the catalog and re-sync to reset the item to pending.", "warning": "Item is approved and serving but has issues worth fixing (e.g., low-quality image, missing optional fields). The item remains eligible for delivery." } }, @@ -313,7 +314,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.425Z", + "generatedAt": "2026-04-19T02:29:11.795Z", "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/media-buy/sync-event-sources-request.json b/schemas/cache/bundled/media-buy/sync-event-sources-request.json index eb973e93e..c3afc6782 100644 --- a/schemas/cache/bundled/media-buy/sync-event-sources-request.json +++ b/schemas/cache/bundled/media-buy/sync-event-sources-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-event-sources-request.json", "title": "Sync Event Sources Request", "description": "Request parameters for configuring event sources on an account with upsert semantics. Existing event sources matched by event_source_id are updated, new ones are created. When delete_missing is true, buyer-managed event sources on the account not in this request are removed. When event_sources is omitted, the call is discovery-only: it returns all event sources on the account without modification. The response always includes both synced and seller-managed event sources for full visibility.", "type": "object", @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. `event_source_id` gives resource-level dedup per source, but the sync envelope emits audit events and can trigger downstream pixel provisioning \u2014 this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `event_sources` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", + "description": "Client-generated unique key for at-most-once execution. `event_source_id` gives resource-level dedup per source, but the sync envelope emits audit events and can trigger downstream pixel provisioning — this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `event_sources` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -58,6 +59,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -246,7 +288,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.426Z", + "generatedAt": "2026-04-19T02:29:11.796Z", "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/media-buy/sync-event-sources-response.json b/schemas/cache/bundled/media-buy/sync-event-sources-response.json index f6e9c4d5b..4d182cfa6 100644 --- a/schemas/cache/bundled/media-buy/sync-event-sources-response.json +++ b/schemas/cache/bundled/media-buy/sync-event-sources-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/sync-event-sources-response.json", "title": "Sync Event Sources Response", "description": "Response from event source sync operation. Returns either per-source results OR operation-level errors.", "type": "object", @@ -174,7 +175,7 @@ "properties": { "status": { "title": "Assessment Status", - "description": "Overall health status. Use this for cross-seller decisions \u2014 do not rely on detail.score for comparability.", + "description": "Overall health status. Use this for cross-seller decisions — do not rely on detail.score for comparability.", "type": "string", "enum": [ "insufficient", @@ -183,7 +184,7 @@ "excellent" ], "enumDescriptions": { - "insufficient": "Setup incomplete or event quality too low \u2014 optimization cannot run", + "insufficient": "Setup incomplete or event quality too low — optimization cannot run", "minimum": "Functional but data quality limits optimization effectiveness", "good": "Meets quality thresholds for most optimization goals", "excellent": "Exceeds quality thresholds across all dimensions" @@ -196,7 +197,7 @@ "score": { "type": "number", "minimum": 0, - "description": "Seller-defined quality score. Scale varies by seller \u2014 only compare within the same seller." + "description": "Seller-defined quality score. Scale varies by seller — only compare within the same seller." }, "max_score": { "type": "number", @@ -453,7 +454,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.427Z", + "generatedAt": "2026-04-19T02:29:11.797Z", "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/media-buy/update-media-buy-request.json b/schemas/cache/bundled/media-buy/update-media-buy-request.json index 58b865cf6..70e781cbc 100644 --- a/schemas/cache/bundled/media-buy/update-media-buy-request.json +++ b/schemas/cache/bundled/media-buy/update-media-buy-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/update-media-buy-request.json", "title": "Update Media Buy Request", "description": "Request parameters for updating campaign and package settings", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -130,7 +172,7 @@ }, "canceled": { "type": "boolean", - "description": "Cancel the entire media buy. Cancellation is irreversible \u2014 canceled media buys cannot be reactivated. Sellers MAY reject with NOT_CANCELLABLE if the media buy cannot be canceled in its current state.", + "description": "Cancel the entire media buy. Cancellation is irreversible — canceled media buys cannot be reactivated. Sellers MAY reject with NOT_CANCELLABLE if the media buy cannot be canceled in its current state.", "const": true }, "cancellation_reason": { @@ -220,7 +262,7 @@ }, "canceled": { "type": "boolean", - "description": "Cancel this specific package. Cancellation is irreversible \u2014 canceled packages stop delivery and cannot be reactivated. Sellers MAY reject with NOT_CANCELLABLE.", + "description": "Cancel this specific package. Cancellation is irreversible — canceled packages stop delivery and cannot be reactivated. Sellers MAY reject with NOT_CANCELLABLE.", "const": true }, "cancellation_reason": { @@ -230,7 +272,7 @@ }, "catalogs": { "type": "array", - "description": "Replace the catalogs this package promotes. Uses replacement semantics \u2014 the provided array replaces the current list. Omit to leave catalogs unchanged.", + "description": "Replace the catalogs this package promotes. Uses replacement semantics — the provided array replaces the current list. Omit to leave catalogs unchanged.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -246,7 +288,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -294,7 +336,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -319,7 +361,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -335,7 +377,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -512,7 +554,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -531,7 +573,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -704,14 +746,14 @@ }, "optimization_goals": { "type": "array", - "description": "Replace all optimization goals for this package. Uses replacement semantics \u2014 omit to leave goals unchanged.", + "description": "Replace all optimization goals for this package. Uses replacement semantics — omit to leave goals unchanged.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -732,7 +774,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -778,7 +820,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -828,7 +870,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -897,7 +939,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -977,12 +1019,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -994,7 +1036,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -1060,7 +1102,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1093,7 +1135,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1146,7 +1188,7 @@ }, "targeting_overlay": { "title": "Targeting Overlay", - "description": "Targeting overlay to apply to this package. Uses replacement semantics \u2014 the full overlay replaces the previous one. Omit to leave targeting unchanged. For keyword and negative keyword updates, prefer the incremental operations (keyword_targets_add, keyword_targets_remove, negative_keywords_add, negative_keywords_remove) which avoid replacing the full overlay. Sellers SHOULD return a validation error if targeting_overlay.keyword_targets is present in the same request as keyword_targets_add or keyword_targets_remove, and likewise for negative_keywords.", + "description": "Targeting overlay to apply to this package. Uses replacement semantics — the full overlay replaces the previous one. Omit to leave targeting unchanged. For keyword and negative keyword updates, prefer the incremental operations (keyword_targets_add, keyword_targets_remove, negative_keywords_add, negative_keywords_remove) which avoid replacing the full overlay. Sellers SHOULD return a validation error if targeting_overlay.keyword_targets is present in the same request as keyword_targets_add or keyword_targets_remove, and likewise for negative_keywords.", "type": "object", "properties": { "geo_countries": { @@ -1402,7 +1444,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1410,7 +1452,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1425,7 +1467,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1456,7 +1498,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -1494,7 +1536,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1700,7 +1742,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1718,7 +1760,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1767,7 +1809,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1785,7 +1827,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -1968,7 +2010,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -2097,7 +2139,7 @@ }, "negative_keywords_add": { "type": "array", - "description": "Negative keywords to add to this package. Appends to the existing negative keyword list \u2014 does not replace it. If a keyword+match_type pair already exists, sellers SHOULD treat it as a no-op for that entry. Use targeting_overlay.negative_keywords in create_media_buy to set the initial list.", + "description": "Negative keywords to add to this package. Appends to the existing negative keyword list — does not replace it. If a keyword+match_type pair already exists, sellers SHOULD treat it as a no-op for that entry. Use targeting_overlay.negative_keywords in create_media_buy to set the initial list.", "items": { "type": "object", "properties": { @@ -2167,7 +2209,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -2465,7 +2507,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2514,7 +2556,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -2942,7 +2984,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -2991,7 +3033,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3304,7 +3346,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3353,7 +3395,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -3687,7 +3729,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -3736,7 +3778,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4066,7 +4108,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4115,7 +4157,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4372,7 +4414,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4421,7 +4463,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -4686,7 +4728,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -4735,7 +4777,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5012,7 +5054,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5061,7 +5103,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5344,7 +5386,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -5393,7 +5435,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -5611,8 +5653,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -5770,8 +5812,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -6017,7 +6059,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6066,7 +6108,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6322,7 +6364,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6371,7 +6413,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -6687,7 +6729,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -6736,7 +6778,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7048,7 +7090,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -7097,7 +7139,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -7294,7 +7336,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -7404,7 +7446,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -7452,7 +7494,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -7477,7 +7519,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -7493,7 +7535,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -7670,7 +7712,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -7689,7 +7731,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -7915,7 +7957,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -7951,9 +7993,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -8158,7 +8200,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -8207,7 +8249,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -8621,7 +8663,7 @@ }, "catalogs": { "type": "array", - "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level \u2014 sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", + "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -8637,7 +8679,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -8685,7 +8727,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -8710,7 +8752,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -8726,7 +8768,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -8903,7 +8945,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -8922,7 +8964,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -9097,11 +9139,11 @@ "description": "Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -9122,7 +9164,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -9168,7 +9210,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -9218,7 +9260,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -9287,7 +9329,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -9367,12 +9409,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -9384,7 +9426,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -9450,7 +9492,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -9483,7 +9525,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -9792,7 +9834,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -9800,7 +9842,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -9815,7 +9857,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -9846,7 +9888,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -9884,7 +9926,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -10090,7 +10132,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -10108,7 +10150,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -10157,7 +10199,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -10175,7 +10217,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -10358,7 +10400,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -10453,6 +10495,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -10553,11 +10636,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -10601,6 +10684,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -10645,7 +10769,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -10944,7 +11068,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -10993,7 +11117,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11421,7 +11545,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -11470,7 +11594,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -11783,7 +11907,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -11832,7 +11956,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -12166,7 +12290,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -12215,7 +12339,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -12545,7 +12669,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -12594,7 +12718,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -12851,7 +12975,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -12900,7 +13024,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -13165,7 +13289,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -13214,7 +13338,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -13491,7 +13615,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -13540,7 +13664,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -13823,7 +13947,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -13872,7 +13996,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -14090,8 +14214,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -14249,8 +14373,8 @@ "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.", + "TMPX": "TMP exposure token — 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 — 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", @@ -14496,7 +14620,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -14545,7 +14669,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -14801,7 +14925,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -14850,7 +14974,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -15166,7 +15290,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -15215,7 +15339,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -15527,7 +15651,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -15576,7 +15700,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -15773,7 +15897,7 @@ }, "compliance": { "type": "object", - "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based \u2014 distinct from brand-level disclaimers in brand.json.", + "description": "Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.", "properties": { "required_disclosures": { "type": "array", @@ -15883,7 +16007,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -15931,7 +16055,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -15956,7 +16080,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -15972,7 +16096,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -16149,7 +16273,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -16168,7 +16292,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -16394,7 +16518,7 @@ "processing": "Creative is being ingested, transcoded, or validated. Automatically transitions to pending_review when processing completes, or to rejected if processing fails (e.g., corrupt file, unsupported codec).", "pending_review": "Creative has passed processing and is awaiting platform content policy review. Transitions to approved or rejected after review.", "approved": "Creative has been approved and is eligible for delivery. May be archived by the buyer or re-reviewed by the seller.", - "rejected": "Creative was rejected due to content policy or technical issues. Not terminal \u2014 the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", + "rejected": "Creative was rejected due to content policy or technical issues. Not terminal — the buyer may fix the issue and resubmit via sync_creatives, which returns the creative to processing.", "archived": "Creative has been archived by the buyer and is excluded from default queries. Archived creatives retain their data and may be unarchived back to approved." } }, @@ -16430,9 +16554,9 @@ "clearcast_clock" ], "enumDescriptions": { - "ad_id": "Ad-ID registry code \u2014 the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", - "isci": "Industry Standard Coding Identification \u2014 legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", - "clearcast_clock": "Clearcast clock number \u2014 UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." + "ad_id": "Ad-ID registry code — the universal standard for identifying advertising assets in the US and increasingly worldwide. 12-character alphanumeric (4-character company prefix + 8-character unique identifier, e.g., ABCD1234000H). Managed by the Ad-ID registry (ad-id.org). Ties creative assets to rotation instructions in broadcast buying.", + "isci": "Industry Standard Coding Identification — legacy creative identifier that preceded Ad-ID. Some older inventory and traffic systems still reference ISCI codes.", + "clearcast_clock": "Clearcast clock number — UK broadcast creative identifier assigned during the Clearcast clearance process. Required for linear TV and VOD advertising in the UK." }, "examples": [ "ad_id", @@ -16637,7 +16761,7 @@ "min_duration_ms": { "type": "integer", "minimum": 1, - "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." + "description": "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available." }, "positions": { "type": "array", @@ -16686,7 +16810,7 @@ }, "verification": { "type": "array", - "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", + "description": "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.", "minItems": 1, "items": { "type": "object", @@ -16953,7 +17077,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.442Z", + "generatedAt": "2026-04-19T02:29:11.816Z", "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/media-buy/update-media-buy-response.json b/schemas/cache/bundled/media-buy/update-media-buy-response.json index fb10bb435..5f6ae836d 100644 --- a/schemas/cache/bundled/media-buy/update-media-buy-response.json +++ b/schemas/cache/bundled/media-buy/update-media-buy-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/media-buy/update-media-buy-response.json", "title": "Update Media Buy Response", "description": "Response payload for update_media_buy task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - updates are either fully applied or not applied at all.", "type": "object", @@ -314,7 +315,7 @@ }, "adjustments": { "type": "array", - "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price \u2014 fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", + "description": "Ordered list of price adjustments. Fee and discount adjustments walk list_price to fixed_price — fees increase the running price, discounts reduce it. Commission and settlement adjustments are disclosed for transparency but do not affect the buyer's committed price.", "items": { "type": "object", "properties": { @@ -331,7 +332,7 @@ "enumDescriptions": { "fee": "Increases the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., ad serving fees, data/targeting surcharges, brand safety verification).", "discount": "Reduces the price the buyer pays and the revenue the seller receives. Applied between list_price and fixed_price (e.g., volume discounts, negotiated rates, early booking).", - "commission": "Does not change the buyer's price or budget. Represents a revenue split \u2014 the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", + "commission": "Does not change the buyer's price or budget. Represents a revenue split — the portion retained by an intermediary (e.g., agency commission). Budgets are managed inclusive of commissions.", "settlement": "Does not change the committed price or budget. Applied at invoicing or payment time (e.g., cash discount for early payment). Informational for buyer agents; affects actual settlement amount." } }, @@ -354,13 +355,13 @@ }, "rate": { "type": "number", - "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive \u2014 kind determines the economic effect. Mutually exclusive with amount.", + "description": "Adjustment as a decimal proportion (e.g., 0.15 for 15%). Always positive — kind determines the economic effect. Mutually exclusive with amount.", "exclusiveMinimum": 0, "exclusiveMaximum": 1 }, "amount": { "type": "number", - "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive \u2014 kind determines the economic effect. Mutually exclusive with rate.", + "description": "Adjustment as a fixed monetary amount in the pricing option's currency. Always positive — kind determines the economic effect. Mutually exclusive with rate.", "exclusiveMinimum": 0 }, "description": { @@ -409,7 +410,7 @@ }, "catalogs": { "type": "array", - "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level \u2014 sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.", + "description": "Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.", "items": { "title": "Catalog", "description": "A typed data feed. Catalogs carry the items, locations, stock levels, or pricing that publishers use to render ads. They can be synced to a platform via sync_catalogs (managed lifecycle with approval), provided inline, or fetched from an external URL. The catalog type determines the item schema and can be structural (offering, product, inventory, store, promotion) or vertical-specific (hotel, flight, job, vehicle, real_estate, education, destination, app). Selectors (ids, tags, category, query) filter items regardless of sourcing method.", @@ -425,7 +426,7 @@ }, "type": { "title": "Catalog Type", - "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' \u2014 each with an industry-specific item schema.", + "description": "Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.", "type": "string", "enum": [ "offering", @@ -473,7 +474,7 @@ }, "items": { "type": "array", - "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url \u2014 provide one or the other, not both. Implementations should validate items against the type-specific schema.", + "description": "Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.", "items": { "type": "object" }, @@ -498,7 +499,7 @@ }, "tags": { "type": "array", - "description": "Filter catalog to items with these tags. Tags are matched using OR logic \u2014 items matching any tag are included.", + "description": "Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.", "items": { "type": "string" }, @@ -514,7 +515,7 @@ }, "conversion_events": { "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.", + "description": "Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — 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", @@ -691,7 +692,7 @@ } }, { - "description": "Date format transform \u2014 YYYYMMDD to ISO 8601", + "description": "Date format transform — YYYYMMDD to ISO 8601", "data": { "feed_field": "available_from", "catalog_field": "valid_from", @@ -710,7 +711,7 @@ } }, { - "description": "Static literal injection \u2014 currency not in feed", + "description": "Static literal injection — currency not in feed", "data": { "catalog_field": "price.currency", "value": "USD" @@ -1187,7 +1188,7 @@ }, "audience_include": { "type": "array", - "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", + "description": "Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Not for lookalike expansion — express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1195,7 +1196,7 @@ }, "audience_exclude": { "type": "array", - "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", + "description": "Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account — audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.", "items": { "type": "string" }, @@ -1210,7 +1211,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1241,7 +1242,7 @@ }, "suppress_minutes": { "type": "number", - "description": "Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", + "description": "Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).", "minimum": 0 }, "max_impressions": { @@ -1279,7 +1280,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -1485,7 +1486,7 @@ "description": "Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1503,7 +1504,7 @@ "description": "Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).", "items": { "title": "Device Type", - "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.", + "description": "Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.", "type": "string", "enum": [ "desktop", @@ -1552,7 +1553,7 @@ }, "geo_proximity": { "type": "array", - "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", + "description": "Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1570,7 +1571,7 @@ }, "label": { "type": "string", - "description": "Human-readable label for this entry (e.g., 'D\u00fcsseldorf', 'Heathrow Airport', 'Primary trade area')." + "description": "Human-readable label for this entry (e.g., 'Düsseldorf', 'Heathrow Airport', 'Primary trade area')." }, "travel_time": { "type": "object", @@ -1753,7 +1754,7 @@ }, "keyword_targets": { "type": "array", - "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", + "description": "Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.", "items": { "type": "object", "properties": { @@ -1819,7 +1820,7 @@ }, "measurement_terms": { "title": "Measurement Terms", - "description": "Agreed billing measurement and makegood terms for this package. Reflects what was negotiated \u2014 may differ from the buyer's proposal or the product's defaults. When present, these terms are binding for the package's duration.", + "description": "Agreed billing measurement and makegood terms for this package. Reflects what was negotiated — may differ from the buyer's proposal or the product's defaults. When present, these terms are binding for the package's duration.", "type": "object", "properties": { "billing_measurement": { @@ -1848,6 +1849,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -1948,11 +1990,11 @@ "attention_score" ], "enumDescriptions": { - "viewability": "Viewable impression rate (floor \u2014 must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", - "ivt": "Invalid Traffic rate (ceiling \u2014 must not exceed threshold). Denominator: total_impressions.", - "completion_rate": "Video or audio completion rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "brand_safety": "Brand-safe impression rate (floor \u2014 must exceed threshold). Denominator: total_impressions.", - "attention_score": "Attention score rate (floor \u2014 must exceed threshold). Denominator: measurable_impressions." + "viewability": "Viewable impression rate (floor — must exceed threshold). Requires viewability_standard. Denominator: measurable_impressions.", + "ivt": "Invalid Traffic rate (ceiling — must not exceed threshold). Denominator: total_impressions.", + "completion_rate": "Video or audio completion rate (floor — must exceed threshold). Denominator: total_impressions.", + "brand_safety": "Brand-safe impression rate (floor — must exceed threshold). Denominator: total_impressions.", + "attention_score": "Attention score rate (floor — must exceed threshold). Denominator: measurable_impressions." } }, "threshold": { @@ -1996,6 +2038,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -2040,7 +2123,7 @@ }, "weight": { "type": "number", - "description": "Relative delivery weight for this creative (0\u2013100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally \u2014 a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", + "description": "Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).", "minimum": 0, "maximum": 100 }, @@ -2113,11 +2196,11 @@ "description": "Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.", "items": { "title": "Optimization Goal", - "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on \u2014 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", + "description": "A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.", "oneOf": [ { "type": "object", - "description": "Optimize for a seller-tracked delivery metric. No event source required \u2014 the seller tracks these natively.", + "description": "Optimize for a seller-tracked delivery metric. No event source required — the seller tracks these natively.", "properties": { "kind": { "type": "string", @@ -2138,7 +2221,7 @@ "profile_visits", "reach" ], - "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions \u2014 see view_duration_seconds), reach (unique audience reach \u2014 see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing \u2014 social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins \u2014 signals of intent to return), profile_visits (visits to the brand's in-platform page \u2014 profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." + "description": "Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks')." }, "reach_unit": { "allOf": [ @@ -2184,7 +2267,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -2234,7 +2317,7 @@ "view_duration_seconds": { "type": "number", "exclusiveMinimum": 0, - "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2\u201315 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values \u2014 silent rounding would create measurement discrepancies." + "description": "Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies." }, "target": { "description": "Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.", @@ -2303,7 +2386,7 @@ }, "event_sources": { "type": "array", - "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries \u2014 the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", + "description": "Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.", "items": { "type": "object", "properties": { @@ -2383,12 +2466,12 @@ }, "value_field": { "type": "string", - "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' \u2014 sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs \u2014 the seller maps it to their platform's value ingestion mechanism." + "description": "Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value' — sellers must reject these target kinds when no event source entry includes value_field. When present without a value-oriented target, the seller may use it for delivery reporting (conversion_value, roas) but must not change the optimization objective. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism." }, "value_factor": { "type": "number", "default": 1, - "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs \u2014 the seller applies it when computing aggregated value metrics." + "description": "Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics." } }, "required": [ @@ -2400,7 +2483,7 @@ "minItems": 1 }, "target": { - "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget \u2014 regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", + "description": "Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversion count within budget — regardless of whether value_field is present on event sources. The presence of value_field alone does not change the optimization objective; it only makes value available for reporting. An explicit target of maximize_value or per_ad_spend is required to steer toward value.", "oneOf": [ { "type": "object", @@ -2466,7 +2549,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -2499,7 +2582,7 @@ "allOf": [ { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -2784,7 +2867,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.457Z", + "generatedAt": "2026-04-19T02:29:11.832Z", "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/property/create-property-list-request.json b/schemas/cache/bundled/property/create-property-list-request.json index 17c51e051..ec2bbbe33 100644 --- a/schemas/cache/bundled/property/create-property-list-request.json +++ b/schemas/cache/bundled/property/create-property-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/create-property-list-request.json", "title": "Create Property List Request", "description": "Request parameters for creating a new property list", "type": "object", @@ -10,6 +11,152 @@ "minimum": 1, "maximum": 99 }, + "account": { + "title": "Account Reference", + "description": "Account that will own the list. Pass a natural key (brand, operator, optional sandbox) or a seller-assigned account_id from list_accounts. When omitted, the seller assigns the list to the agent's default account if exactly one is accessible; otherwise returns an error.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] + }, "name": { "type": "string", "description": "Human-readable name for the list" @@ -175,7 +322,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -274,7 +421,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -318,7 +465,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -350,7 +497,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -415,7 +562,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -465,6 +612,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -511,7 +699,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.460Z", + "generatedAt": "2026-04-19T02:29:11.835Z", "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/property/create-property-list-response.json b/schemas/cache/bundled/property/create-property-list-response.json index 572210516..a7a52dcc0 100644 --- a/schemas/cache/bundled/property/create-property-list-response.json +++ b/schemas/cache/bundled/property/create-property-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/create-property-list-response.json", "title": "Create Property List Response", "description": "Response payload for create_property_list task", "type": "object", @@ -21,9 +22,151 @@ "type": "string", "description": "Description of the list's purpose" }, - "principal": { - "type": "string", - "description": "Principal identity that owns this list" + "account": { + "title": "Account Reference", + "description": "Account that owns this list. Returned as account_id form (seller-assigned identifier).", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] }, "base_properties": { "type": "array", @@ -182,7 +325,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -280,7 +423,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -324,7 +467,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -356,7 +499,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -421,7 +564,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -471,6 +614,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -521,7 +705,7 @@ "description": "Pricing options for this property list. Present when the requesting account has a billing relationship with the list provider. The buyer passes the selected pricing_option_id in report_usage.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -575,7 +759,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -590,7 +774,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -667,7 +851,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -730,7 +914,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.461Z", + "generatedAt": "2026-04-19T02:29:11.837Z", "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/property/delete-property-list-request.json b/schemas/cache/bundled/property/delete-property-list-request.json index bbbcdc5b8..27fec41cc 100644 --- a/schemas/cache/bundled/property/delete-property-list-request.json +++ b/schemas/cache/bundled/property/delete-property-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/delete-property-list-request.json", "title": "Delete Property List Request", "description": "Request parameters for deleting a property list", "type": "object", @@ -14,6 +15,152 @@ "type": "string", "description": "ID of the property list to delete" }, + "account": { + "title": "Account Reference", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts; optional otherwise.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] + }, "context": { "title": "Context Object", "description": "Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.", @@ -40,7 +187,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.462Z", + "generatedAt": "2026-04-19T02:29:11.837Z", "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/property/delete-property-list-response.json b/schemas/cache/bundled/property/delete-property-list-response.json index c1fed5b75..f0d1f21b2 100644 --- a/schemas/cache/bundled/property/delete-property-list-response.json +++ b/schemas/cache/bundled/property/delete-property-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/delete-property-list-response.json", "title": "Delete Property List Response", "description": "Response payload for delete_property_list task", "type": "object", @@ -31,7 +32,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.462Z", + "generatedAt": "2026-04-19T02:29:11.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/property/get-property-list-request.json b/schemas/cache/bundled/property/get-property-list-request.json index de0ca5c94..b89e19675 100644 --- a/schemas/cache/bundled/property/get-property-list-request.json +++ b/schemas/cache/bundled/property/get-property-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/get-property-list-request.json", "title": "Get Property List Request", "description": "Request parameters for retrieving a property list with resolved identifiers", "type": "object", @@ -14,6 +15,152 @@ "type": "string", "description": "ID of the property list to retrieve" }, + "account": { + "title": "Account Reference", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts and the list_id is not globally unique within that scope; optional otherwise.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] + }, "resolve": { "type": "boolean", "description": "Whether to apply filters and return resolved identifiers (default: true)", @@ -55,7 +202,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.463Z", + "generatedAt": "2026-04-19T02:29:11.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/property/get-property-list-response.json b/schemas/cache/bundled/property/get-property-list-response.json index b0a742c47..7870052cb 100644 --- a/schemas/cache/bundled/property/get-property-list-response.json +++ b/schemas/cache/bundled/property/get-property-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/get-property-list-response.json", "title": "Get Property List Response", "description": "Response payload for get_property_list task. Returns identifiers only (not full property objects or scores). Consumers should cache the resolved identifiers and refresh based on cache_valid_until.", "type": "object", @@ -21,9 +22,151 @@ "type": "string", "description": "Description of the list's purpose" }, - "principal": { - "type": "string", - "description": "Principal identity that owns this list" + "account": { + "title": "Account Reference", + "description": "Account that owns this list. Returned as account_id form (seller-assigned identifier).", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] }, "base_properties": { "type": "array", @@ -182,7 +325,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -280,7 +423,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -324,7 +467,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -356,7 +499,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -421,7 +564,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -471,6 +614,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -521,7 +705,7 @@ "description": "Pricing options for this property list. Present when the requesting account has a billing relationship with the list provider. The buyer passes the selected pricing_option_id in report_usage.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -575,7 +759,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -590,7 +774,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -667,7 +851,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -762,7 +946,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -877,7 +1061,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -920,7 +1104,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.464Z", + "generatedAt": "2026-04-19T02:29:11.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/property/list-property-lists-request.json b/schemas/cache/bundled/property/list-property-lists-request.json index 6e93b022f..f50b1fc5e 100644 --- a/schemas/cache/bundled/property/list-property-lists-request.json +++ b/schemas/cache/bundled/property/list-property-lists-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/list-property-lists-request.json", "title": "List Property Lists Request", "description": "Request parameters for listing property lists", "type": "object", @@ -10,9 +11,151 @@ "minimum": 1, "maximum": 99 }, - "principal": { - "type": "string", - "description": "Filter to lists owned by this principal" + "account": { + "title": "Account Reference", + "description": "Filter to lists owned by this account. When omitted, returns lists across all accounts accessible to the authenticated agent.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] }, "name_contains": { "type": "string", @@ -52,7 +195,7 @@ }, "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.465Z", + "generatedAt": "2026-04-19T02:29:11.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/property/list-property-lists-response.json b/schemas/cache/bundled/property/list-property-lists-response.json index bf84c9f33..94132ef2f 100644 --- a/schemas/cache/bundled/property/list-property-lists-response.json +++ b/schemas/cache/bundled/property/list-property-lists-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/list-property-lists-response.json", "title": "List Property Lists Response", "description": "Response payload for list_property_lists task", "type": "object", @@ -24,9 +25,151 @@ "type": "string", "description": "Description of the list's purpose" }, - "principal": { - "type": "string", - "description": "Principal identity that owns this list" + "account": { + "title": "Account Reference", + "description": "Account that owns this list. Returned as account_id form (seller-assigned identifier).", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] }, "base_properties": { "type": "array", @@ -185,7 +328,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -283,7 +426,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -327,7 +470,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -359,7 +502,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -424,7 +567,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -474,6 +617,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -524,7 +708,7 @@ "description": "Pricing options for this property list. Present when the requesting account has a billing relationship with the list provider. The buyer passes the selected pricing_option_id in report_usage.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -578,7 +762,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -593,7 +777,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -670,7 +854,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -753,7 +937,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.467Z", + "generatedAt": "2026-04-19T02:29:11.843Z", "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/property/update-property-list-request.json b/schemas/cache/bundled/property/update-property-list-request.json index f41b411a0..283f47c86 100644 --- a/schemas/cache/bundled/property/update-property-list-request.json +++ b/schemas/cache/bundled/property/update-property-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/update-property-list-request.json", "title": "Update Property List Request", "description": "Request parameters for updating an existing property list", "type": "object", @@ -14,6 +15,152 @@ "type": "string", "description": "ID of the property list to update" }, + "account": { + "title": "Account Reference", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts; optional otherwise.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] + }, "name": { "type": "string", "description": "New name for the list" @@ -179,7 +326,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -277,7 +424,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -321,7 +468,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -353,7 +500,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -418,7 +565,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -468,6 +615,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -519,7 +707,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.468Z", + "generatedAt": "2026-04-19T02:29:11.845Z", "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/property/update-property-list-response.json b/schemas/cache/bundled/property/update-property-list-response.json index 013fdbc57..39ea7c73b 100644 --- a/schemas/cache/bundled/property/update-property-list-response.json +++ b/schemas/cache/bundled/property/update-property-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/update-property-list-response.json", "title": "Update Property List Response", "description": "Response payload for update_property_list task", "type": "object", @@ -21,9 +22,151 @@ "type": "string", "description": "Description of the list's purpose" }, - "principal": { - "type": "string", - "description": "Principal identity that owns this list" + "account": { + "title": "Account Reference", + "description": "Account that owns this list. Returned as account_id form (seller-assigned identifier).", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] }, "base_properties": { "type": "array", @@ -182,7 +325,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -280,7 +423,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -324,7 +467,7 @@ "description": "Feature-based requirements. Property must pass ALL requirements (AND logic).", "items": { "title": "Feature Requirement", - "description": "A feature-based requirement \u2014 a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", + "description": "A feature-based requirement — a reusable predicate over a feature value. Used by property list filters today; designed for reuse in other surfaces (audience filters, creative gates) in future versions. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.", "type": "object", "properties": { "feature_id": { @@ -356,7 +499,7 @@ }, "policy_id": { "type": "string", - "description": "Optional attribution \u2014 when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." + "description": "Optional attribution — when this requirement exists to satisfy a specific policy, policy_id references the authorizing PolicyEntry. Reserved field; populated by producers in 3.1 and later (see issue #2303). Governance agents MAY ignore in 3.0." } }, "required": [ @@ -421,7 +564,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -471,6 +614,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -521,7 +705,7 @@ "description": "Pricing options for this property list. Present when the requesting account has a billing relationship with the list provider. The buyer passes the selected pricing_option_id in report_usage.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -575,7 +759,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -590,7 +774,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -667,7 +851,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -725,7 +909,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.470Z", + "generatedAt": "2026-04-19T02:29:11.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/property/validate-property-delivery-request.json b/schemas/cache/bundled/property/validate-property-delivery-request.json index 27b7931b9..94454d71e 100644 --- a/schemas/cache/bundled/property/validate-property-delivery-request.json +++ b/schemas/cache/bundled/property/validate-property-delivery-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/validate-property-delivery-request.json", "title": "Validate Property Delivery Request", "description": "Request payload for validate_property_delivery task. Validates delivery records against a property list to determine compliance.", "type": "object", @@ -14,6 +15,152 @@ "type": "string", "description": "ID of the property list to validate against" }, + "account": { + "title": "Account Reference", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts; optional otherwise.", + "type": "object", + "oneOf": [ + { + "properties": { + "account_id": { + "type": "string", + "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" + } + }, + "required": [ + "account_id" + ], + "additionalProperties": false + }, + { + "properties": { + "brand": { + "title": "Brand Reference", + "description": "Brand reference identifying the advertiser", + "type": "object", + "properties": { + "domain": { + "type": "string", + "description": "Domain where /.well-known/brand.json is hosted, or the brand's operating domain", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "brand_id": { + "title": "Brand ID", + "description": "Brand identifier within the house portfolio. Optional for single-brand domains.", + "type": "string", + "pattern": "^[a-z0-9_]+$", + "examples": [ + "tide", + "cheerios", + "air_jordan", + "nike", + "pampers" + ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false + } + }, + "required": [ + "domain" + ], + "additionalProperties": false, + "examples": [ + { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + { + "domain": "nova-brands.com", + "brand_id": "glow" + }, + { + "domain": "acme-corp.com" + } + ] + }, + "operator": { + "type": "string", + "description": "Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + }, + "sandbox": { + "type": "boolean", + "description": "When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).", + "default": false + } + }, + "required": [ + "brand", + "operator" + ], + "additionalProperties": false + } + ], + "examples": [ + { + "account_id": "acc_acme_001" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com" + }, + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark" + }, + "operator": "pinnacle-media.com" + }, + { + "brand": { + "domain": "acme-corp.com" + }, + "operator": "acme-corp.com", + "sandbox": true + } + ] + }, "records": { "type": "array", "description": "Delivery records to validate. Each record represents impressions delivered to a property identifier.", @@ -74,7 +221,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -151,7 +298,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.471Z", + "generatedAt": "2026-04-19T02:29:11.849Z", "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/property/validate-property-delivery-response.json b/schemas/cache/bundled/property/validate-property-delivery-response.json index f80885b0c..00658a50a 100644 --- a/schemas/cache/bundled/property/validate-property-delivery-response.json +++ b/schemas/cache/bundled/property/validate-property-delivery-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/property/validate-property-delivery-response.json", "title": "Validate Property Delivery Response", "description": "Response payload for validate_property_delivery task. Returns aggregate compliance statistics and per-record validation results.", "type": "object", @@ -200,7 +201,7 @@ "apple_podcast_id": "Apple Podcasts numeric ID", "spotify_collection_id": "Spotify show or collection URI", "podcast_guid": "Podcast GUID (podcasting 2.0 namespace)", - "station_id": "Broadcast station identifier \u2014 call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", + "station_id": "Broadcast station identifier — call sign, station name, or other locally recognized identifier (e.g., WCBS-FM, BBC Radio 4, France Inter, 2GB)", "facility_id": "Broadcast facility or license ID from a national regulator, prefixed with authority slug (e.g., fcc:73953, ofcom:AL000001). Known prefixes: fcc (US), crtc (Canada), ift (Mexico), ofcom (UK), arcom (France), bnetza/medienanstalt (Germany), acma (Australia), mic (Japan), kcc (South Korea), anatel (Brazil), enacom (Argentina), trai (India)" }, "examples": [ @@ -244,7 +245,7 @@ }, "features": { "type": "array", - "description": "Per-feature breakdown for this record. SHOULD include all failed and warning features. MAY include passed features. For property validation the buyer authored the requirement, so the `requirement` that was not met MAY be echoed back on failures \u2014 this is contract data, not evaluator IP.", + "description": "Per-feature breakdown for this record. SHOULD include all failed and warning features. MAY include passed features. For property validation the buyer authored the requirement, so the `requirement` that was not met MAY be echoed back on failures — this is contract data, not evaluator IP.", "items": { "type": "object", "properties": { @@ -271,7 +272,7 @@ }, "requirement": { "type": "object", - "description": "The feature requirement that was not met. MAY be present on failed features when the caller authored the requirement (e.g., feature_requirements on a property list). The buyer set these thresholds \u2014 echoing them back enables fix-and-retry loops without looking up the list definition.", + "description": "The feature requirement that was not met. MAY be present on failed features when the caller authored the requirement (e.g., feature_requirements on a property list). The buyer set these thresholds — echoing them back enables fix-and-retry loops without looking up the list definition.", "properties": { "min_value": { "type": "number", @@ -397,7 +398,7 @@ ], "additionalProperties": false, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.472Z", + "generatedAt": "2026-04-19T02:29:11.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/protocol/get-adcp-capabilities-request.json b/schemas/cache/bundled/protocol/get-adcp-capabilities-request.json index 776ef150f..dd5974ae5 100644 --- a/schemas/cache/bundled/protocol/get-adcp-capabilities-request.json +++ b/schemas/cache/bundled/protocol/get-adcp-capabilities-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/protocol/get-adcp-capabilities-request.json", "title": "Get AdCP Capabilities Request", "description": "Request payload for get_adcp_capabilities task. Protocol-level capability discovery that works across all AdCP protocols.", "type": "object", @@ -40,7 +41,7 @@ }, "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.473Z", + "generatedAt": "2026-04-19T02:29:11.851Z", "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/protocol/get-adcp-capabilities-response.json b/schemas/cache/bundled/protocol/get-adcp-capabilities-response.json index 3bbfb996d..6c771d2bc 100644 --- a/schemas/cache/bundled/protocol/get-adcp-capabilities-response.json +++ b/schemas/cache/bundled/protocol/get-adcp-capabilities-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/protocol/get-adcp-capabilities-response.json", "title": "Get AdCP Capabilities Response", "description": "Response payload for get_adcp_capabilities task. Protocol-level capability discovery across all AdCP protocols. Each protocol has its own capability section.", "type": "object", @@ -19,11 +20,11 @@ }, "idempotency": { "type": "object", - "description": "Idempotency semantics for mutating requests. Sellers MUST declare their replay window so buyers can reason about safe retry behavior. Clients MUST NOT assume a default \u2014 a seller without this declaration is non-compliant and should be treated as unsafe for retry-sensitive operations.", + "description": "Idempotency semantics for mutating requests. Sellers MUST declare their replay window so buyers can reason about safe retry behavior. Clients MUST NOT assume a default — a seller without this declaration is non-compliant and should be treated as unsafe for retry-sensitive operations.", "properties": { "replay_ttl_seconds": { "type": "integer", - "description": "How long the seller retains a canonical response for an idempotency_key. Within this window, a replay with the same key + equivalent canonical payload returns the cached response; a replay with a different canonical payload returns IDEMPOTENCY_CONFLICT; a replay past the window returns IDEMPOTENCY_EXPIRED when the seller can still distinguish 'seen and evicted' from 'never seen'. Minimum 3600 (1h); recommended 86400 (24h). Maximum 604800 (7 days) \u2014 longer windows force buyers to retain secret keys at rest for extended periods and grow the seller's cache table without bounded benefit.", + "description": "How long the seller retains a canonical response for an idempotency_key. Within this window, a replay with the same key + equivalent canonical payload returns the cached response; a replay with a different canonical payload returns IDEMPOTENCY_CONFLICT; a replay past the window returns IDEMPOTENCY_EXPIRED when the seller can still distinguish 'seen and evicted' from 'never seen'. Minimum 3600 (1h); recommended 86400 (24h). Maximum 604800 (7 days) — longer windows force buyers to retain secret keys at rest for extended periods and grow the seller's cache table without bounded benefit.", "minimum": 3600, "maximum": 604800 } @@ -40,7 +41,7 @@ }, "supported_protocols": { "type": "array", - "description": "AdCP protocols this agent supports. Each value both (a) declares which tools the agent implements and (b) commits the agent to pass the baseline compliance storyboard at /compliance/{version}/protocols/{protocol}/ (with snake_case \u2192 kebab-case path mapping, e.g. media_buy \u2192 /compliance/.../protocols/media-buy/). Compliance testing support is declared separately via the `compliance_testing` capability block (below), not as a protocol claim.", + "description": "AdCP protocols this agent supports. Each value both (a) declares which tools the agent implements and (b) commits the agent to pass the baseline compliance storyboard at /compliance/{version}/protocols/{protocol}/ (with snake_case → kebab-case path mapping, e.g. media_buy → /compliance/.../protocols/media-buy/). Compliance testing support is declared separately via the `compliance_testing` capability block (below), not as a protocol claim.", "items": { "type": "string", "enum": [ @@ -60,7 +61,7 @@ "properties": { "require_operator_auth": { "type": "boolean", - "description": "Whether the seller requires operator-level credentials. When true (explicit accounts), operators authenticate independently with the seller and the buyer discovers accounts via list_accounts. When false (default, implicit accounts), the seller trusts the agent's identity claims \u2014 the agent authenticates once and declares brands/operators via sync_accounts.", + "description": "Whether the seller requires operator-level credentials. When true (explicit accounts), operators authenticate independently with the seller and the buyer discovers accounts via list_accounts. When false (default, implicit accounts), the seller trusts the agent's identity claims — the agent authenticates once and declares brands/operators via sync_accounts.", "default": false }, "authorization_endpoint": { @@ -83,7 +84,7 @@ }, "required_for_products": { "type": "boolean", - "description": "Whether an account reference is required for get_products. When true, the buyer must establish an account before browsing products. When false (default), the buyer can browse products without an account \u2014 useful for price comparison and discovery before committing to a seller.", + "description": "Whether an account reference is required for get_products. When true, the buyer must establish an account before browsing products. When false (default), the buyer can browse products without an account — useful for price comparison and discovery before committing to a seller.", "default": false }, "account_financials": { @@ -93,7 +94,7 @@ }, "sandbox": { "type": "boolean", - "description": "Whether this seller supports sandbox accounts for testing. Buyers can provision a sandbox account via sync_accounts with sandbox: true, and all requests using that account_id will be treated as sandbox \u2014 no real platform calls or spend.", + "description": "Whether this seller supports sandbox accounts for testing. Buyers can provision a sandbox account via sync_accounts with sandbox: true, and all requests using that account_id will be treated as sandbox — no real platform calls or spend.", "default": false } }, @@ -466,7 +467,7 @@ }, "supported_uid_types": { "type": "array", - "description": "Universal ID types accepted for audience matching (MAIDs, RampID, UID2, etc.). MAID support varies significantly by platform \u2014 check this field before sending uids with type: maid.", + "description": "Universal ID types accepted for audience matching (MAIDs, RampID, UID2, etc.). MAID support varies significantly by platform — check this field before sending uids with type: maid.", "items": { "title": "UID Type", "description": "Type of user identifier. Used in audience sync, event logging, and TMP identity match requests to tell the receiver which identity graph to resolve against.", @@ -500,7 +501,7 @@ }, "minimum_audience_size": { "type": "integer", - "description": "Minimum matched audience size required for targeting. Audiences below this threshold will have status: too_small. Varies by platform (100\u20131000 is typical).", + "description": "Minimum matched audience size required for targeting. Audiences below this threshold will have status: too_small. Varies by platform (100–1000 is typical).", "minimum": 1 }, "matching_latency_hours": { @@ -531,7 +532,7 @@ "properties": { "multi_source_event_dedup": { "type": "boolean", - "description": "Whether this seller can deduplicate conversion events across multiple event sources within a single goal. When true, the seller honors the deduplication semantics in optimization_goals event_sources arrays \u2014 the same event_id from multiple sources counts once. When false or absent, buyers should use a single event source per goal; multi-source arrays will be treated as first-source-wins. Most social platforms cannot deduplicate across independently-managed pixel and CAPI sources." + "description": "Whether this seller can deduplicate conversion events across multiple event sources within a single goal. When true, the seller honors the deduplication semantics in optimization_goals event_sources arrays — the same event_id from multiple sources counts once. When false or absent, buyers should use a single event source per goal; multi-source arrays will be treated as first-source-wins. Most social platforms cannot deduplicate across independently-managed pixel and CAPI sources." }, "supported_event_types": { "type": "array", @@ -757,7 +758,7 @@ "description": "Available post-click attribution windows (e.g. [{\"interval\": 7, \"unit\": \"days\"}])", "items": { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -790,7 +791,7 @@ "description": "Available post-view attribution windows (e.g. [{\"interval\": 1, \"unit\": \"days\"}])", "items": { "title": "Duration", - "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.", + "description": "A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.", "type": "object", "properties": { "interval": { @@ -885,7 +886,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } }, "minItems": 1 @@ -898,7 +899,7 @@ }, "portfolio": { "type": "object", - "description": "Information about the seller's media inventory portfolio. Expected for media_buy sellers \u2014 buyers use this to understand inventory coverage and verify authorization via adagents.json.", + "description": "Information about the seller's media inventory portfolio. Expected for media_buy sellers — buyers use this to understand inventory coverage and verify authorization via adagents.json.", "properties": { "publisher_domains": { "type": "array", @@ -958,7 +959,7 @@ "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" + "sponsored_intelligence": "Sponsored Intelligence — advertising within AI assistants, AI search, and generative AI experiences via the reversed data flow" } } }, @@ -1462,7 +1463,7 @@ }, "request_signing": { "type": "object", - "description": "RFC 9421 HTTP Signatures support for incoming requests. Optional in 3.0 \u2014 capability-advertised so counterparties can opt into signing selectively. Required for spend-committing operations in 4.0 (the next breaking-changes accumulation window). The full profile is defined in docs/building/implementation/security.mdx (Signed Requests (Transport Layer)).", + "description": "RFC 9421 HTTP Signatures support for incoming requests. Optional in 3.0 — capability-advertised so counterparties can opt into signing selectively. Required for spend-committing operations in 4.0 (the next breaking-changes accumulation window). The full profile is defined in docs/building/implementation/security.mdx (Signed Requests (Transport Layer)).", "properties": { "supported": { "type": "boolean", @@ -1480,7 +1481,7 @@ }, "required_for": { "type": "array", - "description": "AdCP protocol operation names (e.g., 'create_media_buy') for which this agent rejects unsigned requests with request_signature_required. Not MCP tool names, A2A skill names, or any transport-specific rename \u2014 verifiers MUST NOT accept operation names that are not defined by the AdCP protocol spec. Empty in 3.0 by default; sellers populate selectively during per-counterparty pilots. In 4.0 this list MUST include all spend-committing operations the agent supports (create_media_buy, acquire_*, etc.). Counterparties MUST sign any listed operation.", + "description": "AdCP protocol operation names (e.g., 'create_media_buy') for which this agent rejects unsigned requests with request_signature_required. Not MCP tool names, A2A skill names, or any transport-specific rename — verifiers MUST NOT accept operation names that are not defined by the AdCP protocol spec. Empty in 3.0 by default; sellers populate selectively during per-counterparty pilots. In 4.0 this list MUST include all spend-committing operations the agent supports (create_media_buy, acquire_*, etc.). Counterparties MUST sign any listed operation.", "items": { "type": "string" }, @@ -1512,7 +1513,7 @@ "properties": { "scenarios": { "type": "array", - "description": "Compliance testing scenarios this agent supports. Must be non-empty \u2014 at least one scenario. Callers can also use comply_test_controller with scenario: 'list_scenarios' to discover supported scenarios at runtime.", + "description": "Compliance testing scenarios this agent supports. Must be non-empty — at least one scenario. Callers can also use comply_test_controller with scenario: 'list_scenarios' to discover supported scenarios at runtime.", "items": { "type": "string", "enum": [ @@ -1534,7 +1535,7 @@ }, "specialisms": { "type": "array", - "description": "Optional \u2014 specialized compliance claims this agent supports. Omitting the field means the agent declares no specialism claims (it still passes the universal + domain-baseline storyboards implied by supported_protocols). Each specialism maps to a storyboard bundle at /compliance/{version}/specialisms/{id}/ that the AAO compliance runner executes to verify the claim. Each specialism rolls up to one of the protocols in supported_protocols \u2014 the runner rejects a specialism claim whose parent protocol is missing. Only list specialisms your agent actually implements \u2014 the AAO Verified badge enumerates which specialisms were demonstrably passed.", + "description": "Optional — specialized compliance claims this agent supports. Omitting the field means the agent declares no specialism claims (it still passes the universal + domain-baseline storyboards implied by supported_protocols). Each specialism maps to a storyboard bundle at /compliance/{version}/specialisms/{id}/ that the AAO compliance runner executes to verify the claim. Each specialism rolls up to one of the protocols in supported_protocols — the runner rejects a specialism claim whose parent protocol is missing. Only list specialisms your agent actually implements — the AAO Verified badge enumerates which specialisms were demonstrably passed.", "items": { "title": "AdCP Specialism", "description": "Specialized capability claims an agent can make. Each specialism maps to a compliance storyboard bundle published at /compliance/{version}/specialisms/{id}/. An agent asserts specialisms it supports in get_adcp_capabilities; the AAO compliance runner executes the matching storyboards to verify the claim.", @@ -1542,6 +1543,7 @@ "enum": [ "audience-sync", "brand-rights", + "collection-lists", "content-standards", "creative-ad-server", "creative-generative", @@ -1566,6 +1568,7 @@ "enumDescriptions": { "audience-sync": "Syncs buyer-provided audience segments into a platform for activation", "brand-rights": "Brand identity and rights licensing (talent, music, stock media)", + "collection-lists": "Collection list governance — curated inclusion and exclusion lists of content programs (shows, series, podcasts) for program-level brand safety", "content-standards": "Content standards enforcement (brand safety, policy compliance)", "creative-ad-server": "Creative ad server with tag-based delivery", "creative-generative": "Generative creative agent producing assets on demand", @@ -1573,7 +1576,7 @@ "governance-delivery-monitor": "Campaign delivery monitoring with drift detection", "governance-spend-authority": "Conditional spend approval and human-in-the-loop governance", "measurement-verification": "Third-party measurement and verification across domains (viewability, brand safety, attribution, SI outcomes)", - "property-lists": "Property list governance \u2014 curated inclusion and exclusion lists for targeting and delivery compliance", + "property-lists": "Property list governance — curated inclusion and exclusion lists for targeting and delivery compliance", "sales-broadcast-tv": "Broadcast linear TV seller with guaranteed inventory and FCC cancellation rules", "sales-catalog-driven": "Catalog-driven commerce with conversion tracking", "sales-exchange": "Programmatic exchange or SSP exposing auction-based inventory", @@ -1678,7 +1681,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.476Z", + "generatedAt": "2026-04-19T02:29:11.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/signals/activate-signal-request.json b/schemas/cache/bundled/signals/activate-signal-request.json index a5696afd6..c82d2c5a3 100644 --- a/schemas/cache/bundled/signals/activate-signal-request.json +++ b/schemas/cache/bundled/signals/activate-signal-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/signals/activate-signal-request.json", "title": "Activate Signal Request", "description": "Request parameters for activating or deactivating a signal on deployment targets", "type": "object", @@ -124,6 +125,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -215,7 +257,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.477Z", + "generatedAt": "2026-04-19T02:29:11.856Z", "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/signals/activate-signal-response.json b/schemas/cache/bundled/signals/activate-signal-response.json index ccdd0c425..c806d94b4 100644 --- a/schemas/cache/bundled/signals/activate-signal-response.json +++ b/schemas/cache/bundled/signals/activate-signal-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/signals/activate-signal-response.json", "title": "Activate Signal Response", "description": "Response payload for activate_signal task. Returns either complete success data OR error information, never both. This enforces atomic operation semantics - the signal is either fully activated or not activated at all.", "type": "object", @@ -313,7 +314,7 @@ } ], "_bundled": { - "generatedAt": "2026-04-18T19:54:51.478Z", + "generatedAt": "2026-04-19T02:29:11.857Z", "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/signals/get-signals-request.json b/schemas/cache/bundled/signals/get-signals-request.json index f5f8035a9..c96a09245 100644 --- a/schemas/cache/bundled/signals/get-signals-request.json +++ b/schemas/cache/bundled/signals/get-signals-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/signals/get-signals-request.json", "title": "Get Signals Request", "description": "Request parameters for discovering and refining signals. Use signal_spec for natural language discovery, signal_ids for exact lookups, or both to refine previous results (signal_ids anchor the starting set, signal_spec guides adjustments).", "type": "object", @@ -51,6 +52,47 @@ "nike", "pampers" ] + }, + "industries": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json." + }, + "data_subject_contestation": { + "type": "object", + "description": "Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "email": { + "type": "string", + "format": "email" + }, + "languages": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "email" + ] + } + ], + "additionalProperties": false } }, "required": [ @@ -271,7 +313,7 @@ ], "enumDescriptions": { "marketplace": "Resold third-party segments (provider authorization verifiable via the provider's adagents.json)", - "custom": "Agent-native segment built on demand from models, composites, or buyer inputs \u2014 not attributable to a standing upstream provider", + "custom": "Agent-native segment built on demand from models, composites, or buyer inputs — not attributable to a standing upstream provider", "owned": "First-party segments derived from data the signal agent directly owns (retailer purchase data, publisher behavioral data, telco data)" } }, @@ -356,7 +398,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.479Z", + "generatedAt": "2026-04-19T02:29:11.858Z", "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/signals/get-signals-response.json b/schemas/cache/bundled/signals/get-signals-response.json index d0bc1f5ac..7fba9f5c7 100644 --- a/schemas/cache/bundled/signals/get-signals-response.json +++ b/schemas/cache/bundled/signals/get-signals-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/signals/get-signals-response.json", "title": "Get Signals Response", "description": "Response payload for get_signals task", "type": "object", @@ -137,7 +138,7 @@ ], "enumDescriptions": { "marketplace": "Resold third-party segments (provider authorization verifiable via the provider's adagents.json)", - "custom": "Agent-native segment built on demand from models, composites, or buyer inputs \u2014 not attributable to a standing upstream provider", + "custom": "Agent-native segment built on demand from models, composites, or buyer inputs — not attributable to a standing upstream provider", "owned": "First-party segments derived from data the signal agent directly owns (retailer purchase data, publisher behavioral data, telco data)" } }, @@ -339,7 +340,7 @@ "description": "Pricing options available for this signal. The buyer selects one and passes its pricing_option_id in report_usage for billing verification.", "items": { "title": "Vendor Pricing Option", - "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array \u2014 vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", + "description": "A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).", "allOf": [ { "type": "object", @@ -393,7 +394,7 @@ }, { "title": "PercentOfMediaPricing", - "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM \u2014 useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", + "description": "Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.", "type": "object", "properties": { "model": { @@ -408,7 +409,7 @@ }, "max_cpm": { "type": "number", - "description": "Optional CPM cap. When set, the effective charge is min(percent \u00d7 media_spend_per_mille, max_cpm).", + "description": "Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).", "minimum": 0 }, "currency": { @@ -485,7 +486,7 @@ }, "unit": { "type": "string", - "description": "What is counted \u2014 e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." + "description": "What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'." }, "unit_price": { "type": "number", @@ -633,7 +634,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.481Z", + "generatedAt": "2026-04-19T02:29:11.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/sponsored-intelligence/si-get-offering-request.json b/schemas/cache/bundled/sponsored-intelligence/si-get-offering-request.json index 8a17ae40b..9faa1e18c 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-get-offering-request.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-get-offering-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-get-offering-request.json", "title": "SI Get Offering Request", "description": "Get offering details and availability before session handoff. Returns offering information, availability status, and optionally matching products based on context.", "type": "object", @@ -42,7 +43,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.482Z", + "generatedAt": "2026-04-19T02:29:11.860Z", "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/sponsored-intelligence/si-get-offering-response.json b/schemas/cache/bundled/sponsored-intelligence/si-get-offering-response.json index 128f78e33..64b7377a7 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-get-offering-response.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-get-offering-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-get-offering-response.json", "title": "SI Get Offering Response", "description": "Offering details, availability status, and optionally matching products. Use the offering_token in si_initiate_session for correlation.", "type": "object", @@ -196,7 +197,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.483Z", + "generatedAt": "2026-04-19T02:29:11.861Z", "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/sponsored-intelligence/si-initiate-session-request.json b/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-request.json index caec2b7b2..1f352eb45 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-request.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-initiate-session-request.json", "title": "SI Initiate Session Request", "description": "Host initiates a session with a brand agent", "type": "object", @@ -302,7 +303,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.483Z", + "generatedAt": "2026-04-19T02:29:11.861Z", "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/sponsored-intelligence/si-initiate-session-response.json b/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-response.json index 1b60c39f0..0ff7fea67 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-response.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-initiate-session-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-initiate-session-response.json", "title": "SI Initiate Session Response", "description": "Brand agent's response to session initiation", "type": "object", @@ -607,7 +608,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.484Z", + "generatedAt": "2026-04-19T02:29:11.862Z", "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/sponsored-intelligence/si-send-message-request.json b/schemas/cache/bundled/sponsored-intelligence/si-send-message-request.json index 40035f50a..ecaee6de5 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-send-message-request.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-send-message-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-send-message-request.json", "title": "SI Send Message Request", "description": "Send a message to the brand agent within an active session", "type": "object", @@ -12,7 +13,7 @@ }, "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. Each conversational turn is a distinct mutation of session transcript \u2014 without this key, a timeout-and-retry produces a duplicate turn and a duplicate model response. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each user turn.", + "description": "Client-generated unique key for at-most-once execution. Each conversational turn is a distinct mutation of session transcript — without this key, a timeout-and-retry produces a duplicate turn and a duplicate model response. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each user turn.", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$" @@ -71,7 +72,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.485Z", + "generatedAt": "2026-04-19T02:29:11.863Z", "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/sponsored-intelligence/si-send-message-response.json b/schemas/cache/bundled/sponsored-intelligence/si-send-message-response.json index 5384ae9fa..e4e07d77e 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-send-message-response.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-send-message-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-send-message-response.json", "title": "SI Send Message Response", "description": "Brand agent's response to a user message", "type": "object", @@ -579,7 +580,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.486Z", + "generatedAt": "2026-04-19T02:29:11.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/sponsored-intelligence/si-terminate-session-request.json b/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-request.json index bde96d14a..dee188f9c 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-request.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-terminate-session-request.json", "title": "SI Terminate Session Request", - "description": "Request to terminate an SI session. Naturally idempotent \u2014 `session_id` is the dedup boundary, and terminating an already-terminated session is a no-op that returns the same terminal state. No `idempotency_key` is needed on this request.", + "description": "Request to terminate an SI session. Naturally idempotent — `session_id` is the dedup boundary, and terminating an already-terminated session is a no-op that returns the same terminal state. No `idempotency_key` is needed on this request.", "type": "object", "properties": { "adcp_major_version": { @@ -77,7 +78,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.487Z", + "generatedAt": "2026-04-19T02:29:11.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/sponsored-intelligence/si-terminate-session-response.json b/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-response.json index 8d11b251b..4f0da065c 100644 --- a/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-response.json +++ b/schemas/cache/bundled/sponsored-intelligence/si-terminate-session-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/bundled/sponsored-intelligence/si-terminate-session-response.json", "title": "SI Terminate Session Response", "description": "Confirmation of session termination", "type": "object", @@ -147,7 +148,7 @@ ], "additionalProperties": true, "_bundled": { - "generatedAt": "2026-04-18T19:54:51.487Z", + "generatedAt": "2026-04-19T02:29:11.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/collection/base-collection-source.json b/schemas/cache/collection/base-collection-source.json index 02a140a63..38971595a 100644 --- a/schemas/cache/collection/base-collection-source.json +++ b/schemas/cache/collection/base-collection-source.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/base-collection-source.json", "title": "Base Collection Source", "description": "A source of collections for a collection list. Supports three selection patterns: distribution identifiers (cross-publisher), publisher-specific collection IDs, or publisher-specific genres.", "discriminator": { @@ -23,7 +24,7 @@ "type": "object", "properties": { "type": { - "$ref": "../enums/distribution-identifier-type.json", + "$ref": "/schemas/latest/enums/distribution-identifier-type.json", "description": "Type of distribution identifier" }, "value": { @@ -31,19 +32,13 @@ "description": "The identifier value" } }, - "required": [ - "type", - "value" - ], + "required": ["type", "value"], "additionalProperties": false }, "minItems": 1 } }, - "required": [ - "selection_type", - "identifiers" - ], + "required": ["selection_type", "identifiers"], "additionalProperties": false }, { @@ -70,11 +65,7 @@ "minItems": 1 } }, - "required": [ - "selection_type", - "publisher_domain", - "collection_ids" - ], + "required": ["selection_type", "publisher_domain", "collection_ids"], "additionalProperties": false }, { @@ -101,17 +92,12 @@ "minItems": 1 }, "genre_taxonomy": { - "$ref": "../enums/genre-taxonomy.json", + "$ref": "/schemas/latest/enums/genre-taxonomy.json", "description": "Taxonomy for the genre values. Required so sellers can interpret genre strings unambiguously. Use 'custom' for free-form values negotiated out of band." } }, - "required": [ - "selection_type", - "publisher_domain", - "genres", - "genre_taxonomy" - ], + "required": ["selection_type", "publisher_domain", "genres", "genre_taxonomy"], "additionalProperties": false } ] -} \ No newline at end of file +} diff --git a/schemas/cache/collection/collection-list-changed-webhook.json b/schemas/cache/collection/collection-list-changed-webhook.json index 8cb6ecbab..1ad847f2c 100644 --- a/schemas/cache/collection/collection-list-changed-webhook.json +++ b/schemas/cache/collection/collection-list-changed-webhook.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/collection-list-changed-webhook.json", "title": "Collection List Changed Webhook", - "description": "Webhook notification sent when a collection list's resolved collections change. Contains a summary only \u2014 recipients must call get_collection_list to retrieve the updated collections.", + "description": "Webhook notification sent when a collection list's resolved collections change. Contains a summary only — recipients must call get_collection_list to retrieve the updated collections.", "type": "object", "properties": { "event": { @@ -48,17 +49,12 @@ }, "signature": { "type": "string", - "description": "HMAC-SHA256 webhook signature over {unix_timestamp}.{raw_http_body_bytes} using the secret exchanged out-of-band when the seller registered with the governance agent. Recipients MUST verify against the X-ADCP-Signature and X-ADCP-Timestamp headers using timing-safe comparison and MUST reject requests where |now - timestamp| > 300 seconds. The body copy of this field is a convenience only \u2014 the headers are authoritative. See docs/building/implementation/security#webhook-security." + "description": "HMAC-SHA256 webhook signature over {unix_timestamp}.{raw_http_body_bytes} using the secret exchanged out-of-band when the seller registered with the governance agent. Recipients MUST verify against the X-ADCP-Signature and X-ADCP-Timestamp headers using timing-safe comparison and MUST reject requests where |now - timestamp| > 300 seconds. The body copy of this field is a convenience only — the headers are authoritative. See docs/building/implementation/security#webhook-security." }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "event", - "list_id", - "resolved_at", - "signature" - ], + "required": ["event", "list_id", "resolved_at", "signature"], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/collection-list-filters.json b/schemas/cache/collection/collection-list-filters.json index c6ebf9966..67ac16823 100644 --- a/schemas/cache/collection/collection-list-filters.json +++ b/schemas/cache/collection/collection-list-filters.json @@ -1,14 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/collection-list-filters.json", "title": "Collection List Filters", "description": "Filters that dynamically modify a collection list when resolved. Include filters are allowlists (only matching collections pass). Exclude filters are blocklists (matching collections are removed). When both are present for the same dimension, include is applied first, then exclude narrows further.", "type": "object", "properties": { "content_ratings_exclude": { "type": "array", - "description": "Exclude collections with any of these content ratings (OR logic). This is a metadata filter on the collection's declared content_rating field \u2014 it does not evaluate episode content.", + "description": "Exclude collections with any of these content ratings (OR logic). This is a metadata filter on the collection's declared content_rating field — it does not evaluate episode content.", "items": { - "$ref": "../core/content-rating.json" + "$ref": "/schemas/latest/core/content-rating.json" }, "minItems": 1 }, @@ -16,7 +17,7 @@ "type": "array", "description": "Include only collections with any of these content ratings (OR logic). Collections without a declared content_rating are excluded.", "items": { - "$ref": "../core/content-rating.json" + "$ref": "/schemas/latest/core/content-rating.json" }, "minItems": 1 }, @@ -37,7 +38,7 @@ "minItems": 1 }, "genre_taxonomy": { - "$ref": "../enums/genre-taxonomy.json", + "$ref": "/schemas/latest/enums/genre-taxonomy.json", "description": "Taxonomy for genre filter values. When present, genres_include and genres_exclude values are interpreted as taxonomy IDs." }, "kinds": { @@ -45,12 +46,7 @@ "description": "Filter to these collection kinds", "items": { "type": "string", - "enum": [ - "series", - "publication", - "event_series", - "rotation" - ] + "enum": ["series", "publication", "event_series", "rotation"] }, "minItems": 1 }, @@ -61,7 +57,7 @@ "type": "object", "properties": { "type": { - "$ref": "../enums/distribution-identifier-type.json", + "$ref": "/schemas/latest/enums/distribution-identifier-type.json", "description": "Type of distribution identifier" }, "value": { @@ -69,10 +65,7 @@ "description": "The identifier value" } }, - "required": [ - "type", - "value" - ], + "required": ["type", "value"], "additionalProperties": false }, "minItems": 1 @@ -81,10 +74,10 @@ "type": "array", "description": "Filter by production quality tier", "items": { - "$ref": "../enums/production-quality.json" + "$ref": "/schemas/latest/enums/production-quality.json" }, "minItems": 1 } }, "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/collection-list.json b/schemas/cache/collection/collection-list.json index 2df2801c7..fc9d37462 100644 --- a/schemas/cache/collection/collection-list.json +++ b/schemas/cache/collection/collection-list.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/collection-list.json", "title": "Collection List", "description": "A managed collection list with optional filters for dynamic evaluation. Lists are resolved at setup time and cached by orchestrators/sellers for real-time use. Collections represent programs, shows, and other content entities independent of which properties carry them.", "type": "object", @@ -16,23 +17,23 @@ "type": "string", "description": "Description of the list's purpose" }, - "principal": { - "type": "string", - "description": "Principal identity that owns this list" + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Account that owns this list. Returned as account_id form (seller-assigned identifier)." }, "base_collections": { "type": "array", "description": "Array of collection sources to evaluate. Each entry is a discriminated union: distribution_ids (platform-independent identifiers), publisher_collections (publisher_domain + collection_ids), or publisher_genres (publisher_domain + genres). If omitted, queries the agent's entire collection database.", "items": { - "$ref": "base-collection-source.json" + "$ref": "/schemas/latest/collection/base-collection-source.json" } }, "filters": { - "$ref": "collection-list-filters.json", + "$ref": "/schemas/latest/collection/collection-list-filters.json", "description": "Dynamic filters applied when resolving the list" }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference used to automatically apply appropriate rules. Resolved to full brand identity at execution time." }, "webhook_url": { @@ -61,9 +62,6 @@ "description": "Number of collections in the resolved list (at time of last resolution)" } }, - "required": [ - "list_id", - "name" - ], + "required": ["list_id", "name"], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/create-collection-list-request.json b/schemas/cache/collection/create-collection-list-request.json index c1ae718ff..24b051e61 100644 --- a/schemas/cache/collection/create-collection-list-request.json +++ b/schemas/cache/collection/create-collection-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/create-collection-list-request.json", "title": "Create Collection List Request", "description": "Request parameters for creating a new collection list", "type": "object", @@ -10,6 +11,10 @@ "minimum": 1, "maximum": 99 }, + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Account that will own the list. Pass a natural key (brand, operator, optional sandbox) or a seller-assigned account_id from list_accounts. When omitted, the seller assigns the list to the agent's default account if exactly one is accessible; otherwise returns an error." + }, "name": { "type": "string", "description": "Human-readable name for the list" @@ -22,16 +27,16 @@ "type": "array", "description": "Array of collection sources to evaluate. Each entry is a discriminated union: distribution_ids (platform-independent identifiers), publisher_collections (publisher_domain + collection_ids), or publisher_genres (publisher_domain + genres). If omitted, queries the agent's entire collection database.", "items": { - "$ref": "base-collection-source.json" + "$ref": "/schemas/latest/collection/base-collection-source.json" }, "minItems": 1 }, "filters": { - "$ref": "collection-list-filters.json", + "$ref": "/schemas/latest/collection/collection-list-filters.json", "description": "Dynamic filters to apply when resolving the list" }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference. When provided, the agent automatically applies appropriate rules based on brand characteristics (industry, target_audience, etc.). Resolved at execution time." }, "idempotency_key": { @@ -42,10 +47,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -53,4 +58,4 @@ "name" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/create-collection-list-response.json b/schemas/cache/collection/create-collection-list-response.json index 0acfb0e8b..917f77fe9 100644 --- a/schemas/cache/collection/create-collection-list-response.json +++ b/schemas/cache/collection/create-collection-list-response.json @@ -1,22 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/create-collection-list-response.json", "title": "Create Collection List Response", "description": "Response payload for create_collection_list task", "type": "object", "properties": { "list": { - "$ref": "collection-list.json", + "$ref": "/schemas/latest/collection/collection-list.json", "description": "The created collection list" }, "auth_token": { "type": "string", - "description": "Token that authorizes sellers to fetch this list via get_collection_list. Only returned at creation time \u2014 buyers MUST store it in a secret manager. Scoped to this one list_id; MUST NOT be reused across lists. Governance agents MUST issue a distinct token per seller so per-relationship revocation is possible. Tokens MUST NOT be logged, appear in cache keys, or echo in error responses. delete_collection_list MUST revoke the token immediately; compromise-driven revocation MUST also signal cache invalidation to sellers (reduced cache_valid_until or a list-changed webhook). See Security considerations in docs/governance/collection/tasks/collection_lists." + "description": "Token that authorizes sellers to fetch this list via get_collection_list. Only returned at creation time — buyers MUST store it in a secret manager. Scoped to this one list_id; MUST NOT be reused across lists. Governance agents MUST issue a distinct token per seller so per-relationship revocation is possible. Tokens MUST NOT be logged, appear in cache keys, or echo in error responses. delete_collection_list MUST revoke the token immediately; compromise-driven revocation MUST also signal cache invalidation to sellers (reduced cache_valid_until or a list-changed webhook). See Security considerations in docs/governance/collection/tasks/collection_lists." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -24,4 +25,4 @@ "auth_token" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/delete-collection-list-request.json b/schemas/cache/collection/delete-collection-list-request.json index 4bace96b9..4bbcc97c8 100644 --- a/schemas/cache/collection/delete-collection-list-request.json +++ b/schemas/cache/collection/delete-collection-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/delete-collection-list-request.json", "title": "Delete Collection List Request", "description": "Request parameters for deleting a collection list", "type": "object", @@ -14,11 +15,15 @@ "type": "string", "description": "ID of the collection list to delete" }, + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts; optional otherwise." + }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" }, "idempotency_key": { "type": "string", @@ -33,4 +38,4 @@ "list_id" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/delete-collection-list-response.json b/schemas/cache/collection/delete-collection-list-response.json index 47abeb45c..d1a2493dd 100644 --- a/schemas/cache/collection/delete-collection-list-response.json +++ b/schemas/cache/collection/delete-collection-list-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/delete-collection-list-response.json", "title": "Delete Collection List Response", "description": "Response payload for delete_collection_list task", "type": "object", @@ -13,10 +14,10 @@ "description": "ID of the deleted list" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -24,4 +25,4 @@ "list_id" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/get-collection-list-request.json b/schemas/cache/collection/get-collection-list-request.json index b0c898f3c..46eb8bcf3 100644 --- a/schemas/cache/collection/get-collection-list-request.json +++ b/schemas/cache/collection/get-collection-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/get-collection-list-request.json", "title": "Get Collection List Request", "description": "Request parameters for retrieving a collection list with resolved collections", "type": "object", @@ -14,6 +15,10 @@ "type": "string", "description": "ID of the collection list to retrieve" }, + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts and the list_id is not globally unique within that scope; optional otherwise." + }, "resolve": { "type": "boolean", "description": "Whether to apply filters and return resolved collections (default: true)", @@ -38,14 +43,14 @@ "additionalProperties": false }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "list_id" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/get-collection-list-response.json b/schemas/cache/collection/get-collection-list-response.json index 3c639bda3..bcbf305b0 100644 --- a/schemas/cache/collection/get-collection-list-response.json +++ b/schemas/cache/collection/get-collection-list-response.json @@ -1,11 +1,12 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/get-collection-list-response.json", "title": "Get Collection List Response", "description": "Response payload for get_collection_list task. Returns resolved collection entries with identification and key metadata for matching. Consumers should cache the resolved collections and refresh based on cache_valid_until.", "type": "object", "properties": { "list": { - "$ref": "collection-list.json", + "$ref": "/schemas/latest/collection/collection-list.json", "description": "The collection list metadata (always returned)" }, "collections": { @@ -29,7 +30,7 @@ "type": "object", "properties": { "type": { - "$ref": "../enums/distribution-identifier-type.json", + "$ref": "/schemas/latest/enums/distribution-identifier-type.json", "description": "Type of distribution identifier" }, "value": { @@ -45,7 +46,7 @@ } }, "content_rating": { - "$ref": "../core/content-rating.json", + "$ref": "/schemas/latest/core/content-rating.json", "description": "Baseline content rating for this collection" }, "genre": { @@ -56,7 +57,7 @@ } }, "genre_taxonomy": { - "$ref": "../enums/genre-taxonomy.json", + "$ref": "/schemas/latest/enums/genre-taxonomy.json", "description": "Taxonomy system for genre values" }, "kind": { @@ -77,7 +78,7 @@ } }, "pagination": { - "$ref": "../core/pagination-response.json" + "$ref": "/schemas/latest/core/pagination-response.json" }, "resolved_at": { "type": "string", @@ -98,7 +99,7 @@ "type": "object", "properties": { "type": { - "$ref": "../enums/distribution-identifier-type.json", + "$ref": "/schemas/latest/enums/distribution-identifier-type.json", "description": "Type of distribution identifier" }, "value": { @@ -115,14 +116,14 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "list" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/list-collection-lists-request.json b/schemas/cache/collection/list-collection-lists-request.json index 4cbcbdea1..2e3aa71d6 100644 --- a/schemas/cache/collection/list-collection-lists-request.json +++ b/schemas/cache/collection/list-collection-lists-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/list-collection-lists-request.json", "title": "List Collection Lists Request", "description": "Request parameters for listing collection lists", "type": "object", @@ -10,23 +11,23 @@ "minimum": 1, "maximum": 99 }, - "principal": { - "type": "string", - "description": "Filter to lists owned by this principal" + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Filter to lists owned by this account. When omitted, returns lists across all accounts accessible to the authenticated agent." }, "name_contains": { "type": "string", "description": "Filter to lists whose name contains this string" }, "pagination": { - "$ref": "../core/pagination-request.json" + "$ref": "/schemas/latest/core/pagination-request.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/list-collection-lists-response.json b/schemas/cache/collection/list-collection-lists-response.json index 3786b8169..34c9795e4 100644 --- a/schemas/cache/collection/list-collection-lists-response.json +++ b/schemas/cache/collection/list-collection-lists-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/list-collection-lists-response.json", "title": "List Collection Lists Response", "description": "Response payload for list_collection_lists task", "type": "object", @@ -8,21 +9,21 @@ "type": "array", "description": "Array of collection lists (metadata only, not resolved collections)", "items": { - "$ref": "collection-list.json" + "$ref": "/schemas/latest/collection/collection-list.json" } }, "pagination": { - "$ref": "../core/pagination-response.json" + "$ref": "/schemas/latest/core/pagination-response.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "lists" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/update-collection-list-request.json b/schemas/cache/collection/update-collection-list-request.json index a3c849b21..0ec7622f6 100644 --- a/schemas/cache/collection/update-collection-list-request.json +++ b/schemas/cache/collection/update-collection-list-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/update-collection-list-request.json", "title": "Update Collection List Request", "description": "Request parameters for updating an existing collection list", "type": "object", @@ -14,6 +15,10 @@ "type": "string", "description": "ID of the collection list to update" }, + "account": { + "$ref": "/schemas/latest/core/account-ref.json", + "description": "Account that owns the list. Required when the authenticated agent has access to multiple accounts; optional otherwise." + }, "name": { "type": "string", "description": "New name for the list" @@ -26,15 +31,15 @@ "type": "array", "description": "Complete replacement for the base collections list (not a patch). Each entry is a discriminated union: distribution_ids (platform-independent identifiers), publisher_collections (publisher_domain + collection_ids), or publisher_genres (publisher_domain + genres).", "items": { - "$ref": "base-collection-source.json" + "$ref": "/schemas/latest/collection/base-collection-source.json" } }, "filters": { - "$ref": "collection-list-filters.json", + "$ref": "/schemas/latest/collection/collection-list-filters.json", "description": "Complete replacement for the filters (not a patch)" }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Update brand reference. Resolved to full brand identity at execution time." }, "webhook_url": { @@ -43,10 +48,10 @@ "description": "Update the webhook URL for list change notifications (set to empty string to remove). Governance agents MUST validate this URL against SSRF per docs/building/implementation/security#webhook-url-validation-ssrf." }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" }, "idempotency_key": { "type": "string", @@ -61,4 +66,4 @@ "list_id" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/collection/update-collection-list-response.json b/schemas/cache/collection/update-collection-list-response.json index 6320a95d2..cc71504ed 100644 --- a/schemas/cache/collection/update-collection-list-response.json +++ b/schemas/cache/collection/update-collection-list-response.json @@ -1,22 +1,23 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/collection/update-collection-list-response.json", "title": "Update Collection List Response", "description": "Response payload for update_collection_list task", "type": "object", "properties": { "list": { - "$ref": "collection-list.json", + "$ref": "/schemas/latest/collection/collection-list.json", "description": "The updated collection list" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "list" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/compliance/comply-test-controller-request.json b/schemas/cache/compliance/comply-test-controller-request.json index 89cd19557..2e0c6352f 100644 --- a/schemas/cache/compliance/comply-test-controller-request.json +++ b/schemas/cache/compliance/comply-test-controller-request.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/compliance/comply-test-controller-request.json", "title": "Comply Test Controller Request", - "description": "Request payload for the comply_test_controller tool. Triggers seller-side state transitions for compliance testing. Sandbox only \u2014 sellers MUST NOT expose this tool in production.", + "description": "Request payload for the comply_test_controller tool. Triggers seller-side state transitions for compliance testing. Sandbox only — sellers MUST NOT expose this tool in production.", "type": "object", "properties": { "scenario": { @@ -21,248 +22,67 @@ "type": "object", "description": "Scenario-specific parameters. Required for all scenarios except list_scenarios.", "properties": { - "creative_id": { - "type": "string", - "description": "Creative to transition. Used by force_creative_status." - }, - "account_id": { - "type": "string", - "description": "Account to transition. Used by force_account_status and simulate_budget_spend." - }, - "media_buy_id": { - "type": "string", - "description": "Media buy to transition. Used by force_media_buy_status, simulate_delivery, and simulate_budget_spend." - }, - "session_id": { - "type": "string", - "description": "Session to transition. Used by force_session_status." - }, + "creative_id": { "type": "string", "description": "Creative to transition. Used by force_creative_status." }, + "account_id": { "type": "string", "description": "Account to transition. Used by force_account_status and simulate_budget_spend." }, + "media_buy_id": { "type": "string", "description": "Media buy to transition. Used by force_media_buy_status, simulate_delivery, and simulate_budget_spend." }, + "session_id": { "type": "string", "description": "Session to transition. Used by force_session_status." }, "status": { "type": "string", "description": "Target status for the resource. Type depends on scenario: creative-status for force_creative_status, account-status for force_account_status, media-buy-status for force_media_buy_status. For force_session_status, must be 'complete' or 'terminated'." }, - "rejection_reason": { - "type": "string", - "description": "Reason for rejection. Used by force_creative_status and force_media_buy_status when status = rejected." - }, - "termination_reason": { - "type": "string", - "description": "Reason for termination (e.g., session_timeout, host_terminated, policy_violation). Used by force_session_status when status = terminated." - }, - "impressions": { - "type": "integer", - "minimum": 0, - "description": "Impressions to simulate. Used by simulate_delivery." - }, - "clicks": { - "type": "integer", - "minimum": 0, - "description": "Clicks to simulate. Used by simulate_delivery." - }, - "conversions": { - "type": "integer", - "minimum": 0, - "description": "Conversions to simulate. Used by simulate_delivery." - }, + "rejection_reason": { "type": "string", "description": "Reason for rejection. Used by force_creative_status and force_media_buy_status when status = rejected." }, + "termination_reason": { "type": "string", "description": "Reason for termination (e.g., session_timeout, host_terminated, policy_violation). Used by force_session_status when status = terminated." }, + "impressions": { "type": "integer", "minimum": 0, "description": "Impressions to simulate. Used by simulate_delivery." }, + "clicks": { "type": "integer", "minimum": 0, "description": "Clicks to simulate. Used by simulate_delivery." }, + "conversions": { "type": "integer", "minimum": 0, "description": "Conversions to simulate. Used by simulate_delivery." }, "reported_spend": { "type": "object", "description": "Spend as reported in delivery data. Does not affect budget. Used by simulate_delivery.", "properties": { - "amount": { - "type": "number", - "minimum": 0 - }, - "currency": { - "type": "string", - "pattern": "^[A-Z]{3}$" - } + "amount": { "type": "number", "minimum": 0 }, + "currency": { "type": "string", "pattern": "^[A-Z]{3}$" } }, - "required": [ - "amount", - "currency" - ] + "required": ["amount", "currency"] }, - "spend_percentage": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "Spend to this percentage of budget (0\u2013100). Used by simulate_budget_spend." - } + "spend_percentage": { "type": "number", "minimum": 0, "maximum": 100, "description": "Spend to this percentage of budget (0–100). Used by simulate_budget_spend." } }, "additionalProperties": true }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "context": { "$ref": "/schemas/latest/core/context.json" }, + "ext": { "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "scenario" - ], + "required": ["scenario"], "allOf": [ { - "if": { - "properties": { - "scenario": { - "const": "force_creative_status" - } - } - }, - "then": { - "required": [ - "params" - ], - "properties": { - "params": { - "required": [ - "creative_id", - "status" - ], - "properties": { - "status": { - "$ref": "../enums/creative-status.json" - } - } - } - } - } + "if": { "properties": { "scenario": { "const": "force_creative_status" } } }, + "then": { "required": ["params"], "properties": { "params": { "required": ["creative_id", "status"], "properties": { "status": { "$ref": "/schemas/latest/enums/creative-status.json" } } } } } }, { - "if": { - "properties": { - "scenario": { - "const": "force_account_status" - } - } - }, - "then": { - "required": [ - "params" - ], - "properties": { - "params": { - "required": [ - "account_id", - "status" - ], - "properties": { - "status": { - "$ref": "../enums/account-status.json" - } - } - } - } - } + "if": { "properties": { "scenario": { "const": "force_account_status" } } }, + "then": { "required": ["params"], "properties": { "params": { "required": ["account_id", "status"], "properties": { "status": { "$ref": "/schemas/latest/enums/account-status.json" } } } } } }, { - "if": { - "properties": { - "scenario": { - "const": "force_media_buy_status" - } - } - }, - "then": { - "required": [ - "params" - ], - "properties": { - "params": { - "required": [ - "media_buy_id", - "status" - ], - "properties": { - "status": { - "$ref": "../enums/media-buy-status.json" - } - } - } - } - } + "if": { "properties": { "scenario": { "const": "force_media_buy_status" } } }, + "then": { "required": ["params"], "properties": { "params": { "required": ["media_buy_id", "status"], "properties": { "status": { "$ref": "/schemas/latest/enums/media-buy-status.json" } } } } } }, { - "if": { - "properties": { - "scenario": { - "const": "force_session_status" - } - } - }, - "then": { - "required": [ - "params" - ], - "properties": { - "params": { - "required": [ - "session_id", - "status" - ], - "properties": { - "status": { - "type": "string", - "enum": [ - "complete", - "terminated" - ] - } - } - } - } - } + "if": { "properties": { "scenario": { "const": "force_session_status" } } }, + "then": { "required": ["params"], "properties": { "params": { "required": ["session_id", "status"], "properties": { "status": { "type": "string", "enum": ["complete", "terminated"] } } } } } }, { - "if": { - "properties": { - "scenario": { - "const": "simulate_delivery" - } - } - }, - "then": { - "required": [ - "params" - ], - "properties": { - "params": { - "required": [ - "media_buy_id" - ] - } - } - } + "if": { "properties": { "scenario": { "const": "simulate_delivery" } } }, + "then": { "required": ["params"], "properties": { "params": { "required": ["media_buy_id"] } } } }, { - "if": { - "properties": { - "scenario": { - "const": "simulate_budget_spend" - } - } - }, + "if": { "properties": { "scenario": { "const": "simulate_budget_spend" } } }, "then": { - "required": [ - "params" - ], + "required": ["params"], "properties": { "params": { - "required": [ - "spend_percentage" - ], + "required": ["spend_percentage"], "anyOf": [ - { - "required": [ - "account_id" - ] - }, - { - "required": [ - "media_buy_id" - ] - } + { "required": ["account_id"] }, + { "required": ["media_buy_id"] } ] } } @@ -317,10 +137,7 @@ "media_buy_id": "mb-789", "impressions": 10000, "clicks": 150, - "reported_spend": { - "amount": 150.0, - "currency": "USD" - } + "reported_spend": { "amount": 150.00, "currency": "USD" } } } }, @@ -335,4 +152,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/compliance/comply-test-controller-response.json b/schemas/cache/compliance/comply-test-controller-response.json index dbc6562c4..0e9089bcb 100644 --- a/schemas/cache/compliance/comply-test-controller-response.json +++ b/schemas/cache/compliance/comply-test-controller-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/compliance/comply-test-controller-response.json", "title": "Comply Test Controller Response", "description": "Response from the comply_test_controller tool. Shape varies by scenario type: list_scenarios returns available scenarios, force_* returns state transition results, simulate_* returns simulation results.", "type": "object", @@ -9,10 +10,7 @@ "description": "Lists which scenarios this seller's test controller supports", "type": "object", "properties": { - "success": { - "type": "boolean", - "const": true - }, + "success": { "type": "boolean", "const": true }, "scenarios": { "type": "array", "items": { @@ -28,101 +26,35 @@ }, "description": "Scenarios this seller has implemented" }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "context": { "$ref": "/schemas/latest/core/context.json" }, + "ext": { "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "scenarios" - ], + "required": ["success", "scenarios"], "additionalProperties": true, - "not": { - "anyOf": [ - { - "required": [ - "error" - ] - }, - { - "required": [ - "previous_state" - ] - }, - { - "required": [ - "simulated" - ] - } - ] - } + "not": { "anyOf": [{ "required": ["error"] }, { "required": ["previous_state"] }, { "required": ["simulated"] }] } }, { "title": "StateTransitionSuccess", "description": "A force_* scenario successfully transitioned the entity to the target state", "type": "object", "properties": { - "success": { - "type": "boolean", - "const": true - }, - "previous_state": { - "type": "string", - "description": "State before this transition" - }, - "current_state": { - "type": "string", - "description": "State after this transition" - }, - "message": { - "type": "string", - "description": "Human-readable description of the transition" - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "success": { "type": "boolean", "const": true }, + "previous_state": { "type": "string", "description": "State before this transition" }, + "current_state": { "type": "string", "description": "State after this transition" }, + "message": { "type": "string", "description": "Human-readable description of the transition" }, + "context": { "$ref": "/schemas/latest/core/context.json" }, + "ext": { "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "previous_state", - "current_state" - ], + "required": ["success", "previous_state", "current_state"], "additionalProperties": true, - "not": { - "anyOf": [ - { - "required": [ - "error" - ] - }, - { - "required": [ - "scenarios" - ] - }, - { - "required": [ - "simulated" - ] - } - ] - } + "not": { "anyOf": [{ "required": ["error"] }, { "required": ["scenarios"] }, { "required": ["simulated"] }] } }, { "title": "SimulationSuccess", "description": "A simulate_delivery or simulate_budget_spend scenario succeeded. For delivery: simulated contains impressions/clicks/reported_spend/conversions and cumulative contains running totals. For budget: simulated contains spend_percentage/computed_spend/budget.", "type": "object", "properties": { - "success": { - "type": "boolean", - "const": true - }, + "success": { "type": "boolean", "const": true }, "simulated": { "type": "object", "description": "Values injected or applied by this call. Shape depends on scenario.", @@ -133,105 +65,33 @@ "description": "Running totals across all simulation calls (simulate_delivery only)", "additionalProperties": true }, - "message": { - "type": "string" - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "message": { "type": "string" }, + "context": { "$ref": "/schemas/latest/core/context.json" }, + "ext": { "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "simulated" - ], + "required": ["success", "simulated"], "additionalProperties": true, - "not": { - "anyOf": [ - { - "required": [ - "error" - ] - }, - { - "required": [ - "scenarios" - ] - }, - { - "required": [ - "previous_state" - ] - } - ] - } + "not": { "anyOf": [{ "required": ["error"] }, { "required": ["scenarios"] }, { "required": ["previous_state"] }] } }, { "title": "ControllerError", - "description": "The scenario failed \u2014 invalid transition, unknown entity, unsupported scenario, or invalid params", + "description": "The scenario failed — invalid transition, unknown entity, unsupported scenario, or invalid params", "type": "object", "properties": { - "success": { - "type": "boolean", - "const": false - }, + "success": { "type": "boolean", "const": false }, "error": { "type": "string", - "enum": [ - "INVALID_TRANSITION", - "INVALID_STATE", - "NOT_FOUND", - "UNKNOWN_SCENARIO", - "INVALID_PARAMS", - "FORBIDDEN", - "INTERNAL_ERROR" - ], + "enum": ["INVALID_TRANSITION", "INVALID_STATE", "NOT_FOUND", "UNKNOWN_SCENARIO", "INVALID_PARAMS", "FORBIDDEN", "INTERNAL_ERROR"], "description": "Structured error code" }, - "error_detail": { - "type": "string", - "description": "Human-readable explanation of the failure" - }, - "current_state": { - "type": [ - "string", - "null" - ], - "description": "Current state of the entity, or null if not found" - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "error_detail": { "type": "string", "description": "Human-readable explanation of the failure" }, + "current_state": { "type": ["string", "null"], "description": "Current state of the entity, or null if not found" }, + "context": { "$ref": "/schemas/latest/core/context.json" }, + "ext": { "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "error" - ], + "required": ["success", "error"], "additionalProperties": true, - "not": { - "anyOf": [ - { - "required": [ - "scenarios" - ] - }, - { - "required": [ - "simulated" - ] - }, - { - "required": [ - "previous_state" - ] - } - ] - } + "not": { "anyOf": [{ "required": ["scenarios"] }, { "required": ["simulated"] }, { "required": ["previous_state"] }] } } ], "examples": [ @@ -239,11 +99,7 @@ "description": "List scenarios response", "data": { "success": true, - "scenarios": [ - "force_creative_status", - "force_account_status", - "force_media_buy_status" - ] + "scenarios": ["force_creative_status", "force_account_status", "force_media_buy_status"] } }, { @@ -262,18 +118,12 @@ "simulated": { "impressions": 10000, "clicks": 150, - "reported_spend": { - "amount": 150.0, - "currency": "USD" - } + "reported_spend": { "amount": 150.00, "currency": "USD" } }, "cumulative": { "impressions": 25000, "clicks": 380, - "reported_spend": { - "amount": 375.0, - "currency": "USD" - } + "reported_spend": { "amount": 375.00, "currency": "USD" } }, "message": "Delivery simulated for mb-789: 10000 impressions, 150 clicks, $150.00 spend" } @@ -284,14 +134,8 @@ "success": true, "simulated": { "spend_percentage": 95, - "computed_spend": { - "amount": 950.0, - "currency": "USD" - }, - "budget": { - "amount": 1000.0, - "currency": "USD" - } + "computed_spend": { "amount": 950.00, "currency": "USD" }, + "budget": { "amount": 1000.00, "currency": "USD" } }, "message": "Budget for mb-789 set to 95% consumed ($950.00 of $1000.00)" } @@ -301,7 +145,7 @@ "data": { "success": false, "error": "INVALID_TRANSITION", - "error_detail": "Cannot transition from archived to processing \u2014 archived is terminal", + "error_detail": "Cannot transition from archived to processing — archived is terminal", "current_state": "archived" } }, @@ -315,4 +159,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/artifact-webhook-payload.json b/schemas/cache/content-standards/artifact-webhook-payload.json index 723a92c97..0c3790a37 100644 --- a/schemas/cache/content-standards/artifact-webhook-payload.json +++ b/schemas/cache/content-standards/artifact-webhook-payload.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/artifact-webhook-payload.json", "title": "Artifact Webhook Payload", "description": "Payload sent by sales agents to orchestrators when pushing content artifacts for governance validation. Complements get_media_buy_artifacts for push-based artifact delivery.", "type": "object", @@ -24,7 +25,7 @@ "type": "object", "properties": { "artifact": { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "The content artifact" }, "delivered_at": { @@ -41,10 +42,7 @@ "description": "Package within the media buy this artifact relates to" } }, - "required": [ - "artifact", - "delivered_at" - ] + "required": ["artifact", "delivered_at"] } }, "pagination": { @@ -66,14 +64,9 @@ } }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "media_buy_id", - "batch_id", - "timestamp", - "artifacts" - ], + "required": ["media_buy_id", "batch_id", "timestamp", "artifacts"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/artifact.json b/schemas/cache/content-standards/artifact.json index 41f43d187..47d68ee11 100644 --- a/schemas/cache/content-standards/artifact.json +++ b/schemas/cache/content-standards/artifact.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/artifact.json", "title": "Artifact", "description": "Content artifact for safety and suitability evaluation. An artifact represents content adjacent to an ad placement - a news article, podcast segment, video chapter, or social post. Artifacts are collections of assets (text, images, video, audio) plus metadata and signals.", "type": "object", @@ -17,7 +18,7 @@ "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": { - "$ref": "../core/format-id.json", + "$ref": "/schemas/latest/core/format-id.json", "description": "Optional reference to a format definition. Uses the same format registry as creative formats." }, "url": { @@ -45,21 +46,10 @@ "type": "object", "description": "Text block (paragraph, heading, etc.)", "properties": { - "type": { - "type": "string", - "const": "text" - }, + "type": { "type": "string", "const": "text" }, "role": { "type": "string", - "enum": [ - "title", - "paragraph", - "heading", - "caption", - "quote", - "list_item", - "description" - ], + "enum": ["title", "paragraph", "heading", "caption", "quote", "list_item", "description"], "description": "Role of this text in the document. Use 'title' for the main artifact title, 'description' for summaries." }, "content": { @@ -69,12 +59,7 @@ }, "content_format": { "type": "string", - "enum": [ - "text/plain", - "text/markdown", - "text/html", - "application/json" - ], + "enum": ["text/plain", "text/markdown", "text/html", "application/json"], "description": "MIME type indicating how to parse the content field. Default: text/plain.", "default": "text/plain" }, @@ -89,23 +74,17 @@ "description": "Heading level (1-6), only for role=heading" }, "provenance": { - "$ref": "../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance for this text block, overrides artifact-level provenance" } }, - "required": [ - "type", - "content" - ] + "required": ["type", "content"] }, { "type": "object", "description": "Image asset", "properties": { - "type": { - "type": "string", - "const": "image" - }, + "type": { "type": "string", "const": "image" }, "url": { "type": "string", "format": "uri", @@ -132,23 +111,17 @@ "description": "Image height in pixels" }, "provenance": { - "$ref": "../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance for this image, overrides artifact-level provenance" } }, - "required": [ - "type", - "url" - ] + "required": ["type", "url"] }, { "type": "object", "description": "Video asset", "properties": { - "type": { - "type": "string", - "const": "video" - }, + "type": { "type": "string", "const": "video" }, "url": { "type": "string", "format": "uri", @@ -169,23 +142,13 @@ }, "transcript_format": { "type": "string", - "enum": [ - "text/plain", - "text/markdown", - "application/json" - ], + "enum": ["text/plain", "text/markdown", "application/json"], "description": "MIME type indicating how to parse the transcript field. Default: text/plain.", "default": "text/plain" }, "transcript_source": { "type": "string", - "enum": [ - "original_script", - "subtitles", - "closed_captions", - "dub", - "generated" - ], + "enum": ["original_script", "subtitles", "closed_captions", "dub", "generated"], "description": "How the transcript was generated" }, "thumbnail_url": { @@ -194,23 +157,17 @@ "description": "Video thumbnail URL" }, "provenance": { - "$ref": "../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance for this video, overrides artifact-level provenance" } }, - "required": [ - "type", - "url" - ] + "required": ["type", "url"] }, { "type": "object", "description": "Audio asset", "properties": { - "type": { - "type": "string", - "const": "audio" - }, + "type": { "type": "string", "const": "audio" }, "url": { "type": "string", "format": "uri", @@ -231,32 +188,21 @@ }, "transcript_format": { "type": "string", - "enum": [ - "text/plain", - "text/markdown", - "application/json" - ], + "enum": ["text/plain", "text/markdown", "application/json"], "description": "MIME type indicating how to parse the transcript field. Default: text/plain.", "default": "text/plain" }, "transcript_source": { "type": "string", - "enum": [ - "original_script", - "closed_captions", - "generated" - ], + "enum": ["original_script", "closed_captions", "generated"], "description": "How the transcript was generated" }, "provenance": { - "$ref": "../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance for this audio, overrides artifact-level provenance" } }, - "required": [ - "type", - "url" - ] + "required": ["type", "url"] } ] } @@ -291,16 +237,14 @@ "json_ld": { "type": "array", "description": "JSON-LD structured data (schema.org)", - "items": { - "type": "object" - } + "items": { "type": "object" } } }, "additionalProperties": true }, "provenance": { - "$ref": "../core/provenance.json", - "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact \u2014 individual assets can override with their own provenance." + "$ref": "/schemas/latest/core/provenance.json", + "description": "Provenance metadata for this artifact. Serves as the default provenance for all assets within this artifact — individual assets can override with their own provenance." }, "identifiers": { "type": "object", @@ -331,11 +275,7 @@ "additionalProperties": true } }, - "required": [ - "property_rid", - "artifact_id", - "assets" - ], + "required": ["property_rid", "artifact_id", "assets"], "additionalProperties": true, "$defs": { "asset_access": { @@ -346,34 +286,22 @@ "type": "object", "description": "Bearer token authentication", "properties": { - "method": { - "type": "string", - "const": "bearer_token" - }, + "method": { "type": "string", "const": "bearer_token" }, "token": { "type": "string", "description": "OAuth2 bearer token for Authorization header" } }, - "required": [ - "method", - "token" - ] + "required": ["method", "token"] }, { "type": "object", "description": "Service account authentication (GCP, AWS)", "properties": { - "method": { - "type": "string", - "const": "service_account" - }, + "method": { "type": "string", "const": "service_account" }, "provider": { "type": "string", - "enum": [ - "gcp", - "aws" - ], + "enum": ["gcp", "aws"], "description": "Cloud provider" }, "credentials": { @@ -382,25 +310,17 @@ "additionalProperties": true } }, - "required": [ - "method", - "provider" - ] + "required": ["method", "provider"] }, { "type": "object", "description": "Pre-signed URL (credentials embedded in URL)", "properties": { - "method": { - "type": "string", - "const": "signed_url" - } + "method": { "type": "string", "const": "signed_url" } }, - "required": [ - "method" - ] + "required": ["method"] } ] } } -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/calibrate-content-request.json b/schemas/cache/content-standards/calibrate-content-request.json index 43512f36f..030b1f35d 100644 --- a/schemas/cache/content-standards/calibrate-content-request.json +++ b/schemas/cache/content-standards/calibrate-content-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/calibrate-content-request.json", "title": "Calibrate Content Request", "description": "Request parameters for evaluating content during calibration. Multi-turn dialogue is handled at the protocol layer via contextId.", "type": "object", @@ -15,7 +16,7 @@ "description": "Standards configuration to calibrate against" }, "artifact": { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Artifact to evaluate" }, "idempotency_key": { @@ -26,10 +27,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -37,4 +38,4 @@ "standards_id", "artifact" ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/calibrate-content-response.json b/schemas/cache/content-standards/calibrate-content-response.json index 6d85bfef6..3d37db7f9 100644 --- a/schemas/cache/content-standards/calibrate-content-response.json +++ b/schemas/cache/content-standards/calibrate-content-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/calibrate-content-response.json", "title": "Calibrate Content Response", "description": "Response payload with verdict and detailed explanations for collaborative calibration", "type": "object", @@ -10,10 +11,7 @@ "properties": { "verdict": { "type": "string", - "enum": [ - "pass", - "fail" - ], + "enum": ["pass", "fail"], "description": "Overall pass/fail verdict for the content evaluation" }, "confidence": { @@ -38,12 +36,7 @@ }, "status": { "type": "string", - "enum": [ - "passed", - "failed", - "warning", - "unevaluated" - ], + "enum": ["passed", "failed", "warning", "unevaluated"], "description": "Evaluation status for this feature" }, "policy_id": { @@ -61,22 +54,17 @@ "description": "Optional evaluator confidence in this result (0-1). Distinguishes certain verdicts from ambiguous ones." } }, - "required": [ - "feature_id", - "status" - ] + "required": ["feature_id", "status"] } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "verdict" - ] + "required": ["verdict"] }, { "type": "object", @@ -84,20 +72,16 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/content-standards.json b/schemas/cache/content-standards/content-standards.json index 355f80148..8328210ec 100644 --- a/schemas/cache/content-standards/content-standards.json +++ b/schemas/cache/content-standards/content-standards.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/content-standards.json", "title": "Content Standards", "description": "A content standards configuration defining brand safety and suitability policies. Standards are scoped by brand, geography, and channel. Multiple standards can be active simultaneously for different scopes.", "type": "object", @@ -14,25 +15,19 @@ }, "countries_all": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "minItems": 1, "description": "ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic)." }, "channels_any": { "type": "array", - "items": { - "$ref": "../enums/channels.json" - }, + "items": { "$ref": "/schemas/latest/enums/channels.json" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." }, "languages_any": { "type": "array", - "items": { - "type": "string" - }, + "items": { "type": "string" }, "minItems": 1, "description": "BCP 47 language tags (e.g., 'en', 'de', 'fr'). Standards apply to content in ANY of these languages (OR logic). Content in unlisted languages is not covered by these standards." }, @@ -40,7 +35,7 @@ "type": "array", "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id; governance findings reference the policy_id that triggered them.", "items": { - "$ref": "../governance/policy-entry.json" + "$ref": "/schemas/latest/governance/policy-entry.json" }, "minItems": 1 }, @@ -50,16 +45,12 @@ "properties": { "pass": { "type": "array", - "items": { - "$ref": "artifact.json" - }, + "items": { "$ref": "/schemas/latest/content-standards/artifact.json" }, "description": "Artifacts that pass the content standards" }, "fail": { "type": "array", - "items": { - "$ref": "artifact.json" - }, + "items": { "$ref": "/schemas/latest/content-standards/artifact.json" }, "description": "Artifacts that fail the content standards" } } @@ -68,15 +59,13 @@ "type": "array", "description": "Pricing options for this content standards service. The buyer passes the selected pricing_option_id in report_usage for billing verification.", "items": { - "$ref": "../core/vendor-pricing-option.json" + "$ref": "/schemas/latest/core/vendor-pricing-option.json" }, "minItems": 1 }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "standards_id" - ] -} \ No newline at end of file + "required": ["standards_id"] +} diff --git a/schemas/cache/content-standards/create-content-standards-request.json b/schemas/cache/content-standards/create-content-standards-request.json index a54ebd0ea..93e81e2b0 100644 --- a/schemas/cache/content-standards/create-content-standards-request.json +++ b/schemas/cache/content-standards/create-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/create-content-standards-request.json", "title": "Create Content Standards Request", "description": "Request parameters for creating a new content standards configuration", "type": "object", @@ -25,7 +26,7 @@ "channels_any": { "type": "array", "items": { - "$ref": "../enums/channels.json" + "$ref": "/schemas/latest/enums/channels.json" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -56,9 +57,9 @@ }, "policies": { "type": "array", - "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id and carries its own enforcement (must|should); governance findings reference the policy_id that triggered them. Inline bespoke policies can omit version/name/category (defaulted by the server). Combines with registry_policy_ids \u2014 registry policies and bespoke policies are both evaluated. Bespoke policy_ids MUST be flat (no colons/slashes) to avoid collision with namespaced registry ids.", + "description": "Bespoke policies for this content-standards configuration, using the same shape as registry entries. Each policy is addressable by policy_id and carries its own enforcement (must|should); governance findings reference the policy_id that triggered them. Inline bespoke policies can omit version/name/category (defaulted by the server). Combines with registry_policy_ids — registry policies and bespoke policies are both evaluated. Bespoke policy_ids MUST be flat (no colons/slashes) to avoid collision with namespaced registry ids.", "items": { - "$ref": "../governance/policy-entry.json" + "$ref": "/schemas/latest/governance/policy-entry.json" }, "minItems": 1 }, @@ -95,7 +96,7 @@ ] }, { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Full artifact with pre-extracted content (text, images, video, audio)" } ] @@ -131,7 +132,7 @@ ] }, { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Full artifact with pre-extracted content (text, images, video, audio)" } ] @@ -148,10 +149,10 @@ "pattern": "^[A-Za-z0-9_.:-]{16,255}$" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ @@ -159,16 +160,8 @@ "scope" ], "anyOf": [ - { - "required": [ - "policies" - ] - }, - { - "required": [ - "registry_policy_ids" - ] - } + { "required": ["policies"] }, + { "required": ["registry_policy_ids"] } ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/create-content-standards-response.json b/schemas/cache/content-standards/create-content-standards-response.json index 9cf0e2457..9e16e14f9 100644 --- a/schemas/cache/content-standards/create-content-standards-response.json +++ b/schemas/cache/content-standards/create-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/create-content-standards-response.json", "title": "Create Content Standards Response", "description": "Response payload for creating a content standards configuration", "type": "object", @@ -13,15 +14,13 @@ "description": "Unique identifier for the created standards configuration" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "standards_id" - ] + "required": ["standards_id"] }, { "type": "object", @@ -29,24 +28,20 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "conflicting_standards_id": { "type": "string", "description": "If the error is a scope conflict, the ID of the existing standards that conflict" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/get-content-standards-request.json b/schemas/cache/content-standards/get-content-standards-request.json index 8f801db66..57434cb04 100644 --- a/schemas/cache/content-standards/get-content-standards-request.json +++ b/schemas/cache/content-standards/get-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/get-content-standards-request.json", "title": "Get Content Standards Request", "description": "Request parameters for retrieving content safety policies", "type": "object", @@ -15,13 +16,13 @@ "description": "Identifier for the standards configuration to retrieve" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "standards_id" ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/get-content-standards-response.json b/schemas/cache/content-standards/get-content-standards-response.json index 7e727e204..37b4dc70a 100644 --- a/schemas/cache/content-standards/get-content-standards-response.json +++ b/schemas/cache/content-standards/get-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/get-content-standards-response.json", "title": "Get Content Standards Response", "description": "Response payload with content safety policies", "type": "object", @@ -8,16 +9,14 @@ "type": "object", "description": "Success response - returns the content standards configuration", "allOf": [ - { - "$ref": "content-standards.json" - } + { "$ref": "/schemas/latest/content-standards/content-standards.json" } ], "properties": { "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } } }, @@ -27,20 +26,16 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/get-media-buy-artifacts-request.json b/schemas/cache/content-standards/get-media-buy-artifacts-request.json index 9a33dac0a..3028059a0 100644 --- a/schemas/cache/content-standards/get-media-buy-artifacts-request.json +++ b/schemas/cache/content-standards/get-media-buy-artifacts-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/get-media-buy-artifacts-request.json", "title": "Get Media Buy Artifacts Request", "description": "Request parameters for retrieving content artifacts from a media buy for validation", "type": "object", @@ -11,7 +12,7 @@ "maximum": 99 }, "account": { - "$ref": "../core/account-ref.json", + "$ref": "/schemas/latest/core/account-ref.json", "description": "Filter artifacts to a specific account. When omitted, returns artifacts across all accessible accounts." }, "media_buy_id": { @@ -66,13 +67,13 @@ "additionalProperties": false }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "media_buy_id" ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/get-media-buy-artifacts-response.json b/schemas/cache/content-standards/get-media-buy-artifacts-response.json index f3e443cc6..da8c35ac7 100644 --- a/schemas/cache/content-standards/get-media-buy-artifacts-response.json +++ b/schemas/cache/content-standards/get-media-buy-artifacts-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/get-media-buy-artifacts-response.json", "title": "Get Media Buy Artifacts Response", "description": "Response containing content artifacts from a media buy for validation", "type": "object", @@ -32,7 +33,7 @@ "description": "Which package this delivery belongs to" }, "artifact": { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Full artifact with content assets" }, "country": { @@ -59,23 +60,16 @@ }, "local_verdict": { "type": "string", - "enum": [ - "pass", - "fail", - "unevaluated" - ], + "enum": ["pass", "fail", "unevaluated"], "description": "Seller's local model verdict for this artifact" } }, - "required": [ - "record_id", - "artifact" - ] + "required": ["record_id", "artifact"] } }, "collection_info": { "type": "object", - "description": "Information about artifact collection for this media buy. Sampling is configured at buy creation time \u2014 this reports what was actually collected.", + "description": "Information about artifact collection for this media buy. Sampling is configured at buy creation time — this reports what was actually collected.", "properties": { "total_deliveries": { "type": "integer", @@ -96,19 +90,16 @@ } }, "pagination": { - "$ref": "../core/pagination-response.json" + "$ref": "/schemas/latest/core/pagination-response.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "media_buy_id", - "artifacts" - ] + "required": ["media_buy_id", "artifacts"] }, { "type": "object", @@ -116,20 +107,16 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/list-content-standards-request.json b/schemas/cache/content-standards/list-content-standards-request.json index 031806666..5826d618f 100644 --- a/schemas/cache/content-standards/list-content-standards-request.json +++ b/schemas/cache/content-standards/list-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/list-content-standards-request.json", "title": "List Content Standards Request", "description": "Request parameters for listing content standards configurations", "type": "object", @@ -13,7 +14,7 @@ "channels": { "type": "array", "items": { - "$ref": "../enums/channels.json" + "$ref": "/schemas/latest/enums/channels.json" }, "minItems": 1, "description": "Filter by channel" @@ -35,14 +36,14 @@ "description": "Filter by ISO 3166-1 alpha-2 country codes" }, "pagination": { - "$ref": "../core/pagination-request.json" + "$ref": "/schemas/latest/core/pagination-request.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/list-content-standards-response.json b/schemas/cache/content-standards/list-content-standards-response.json index 093e18681..cd4bdc846 100644 --- a/schemas/cache/content-standards/list-content-standards-response.json +++ b/schemas/cache/content-standards/list-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/list-content-standards-response.json", "title": "List Content Standards Response", "description": "Response payload with list of content standards configurations", "type": "object", @@ -10,24 +11,20 @@ "properties": { "standards": { "type": "array", - "items": { - "$ref": "content-standards.json" - }, + "items": { "$ref": "/schemas/latest/content-standards/content-standards.json" }, "description": "Array of content standards configurations matching the filter criteria" }, "pagination": { - "$ref": "../core/pagination-response.json" + "$ref": "/schemas/latest/core/pagination-response.json" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "standards" - ] + "required": ["standards"] }, { "type": "object", @@ -35,20 +32,16 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/update-content-standards-request.json b/schemas/cache/content-standards/update-content-standards-request.json index 27e24c748..b3d201abe 100644 --- a/schemas/cache/content-standards/update-content-standards-request.json +++ b/schemas/cache/content-standards/update-content-standards-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/update-content-standards-request.json", "title": "Update Content Standards Request", "description": "Request parameters for updating an existing content standards configuration. Creates a new version.", "type": "object", @@ -29,7 +30,7 @@ "channels_any": { "type": "array", "items": { - "$ref": "../enums/channels.json" + "$ref": "/schemas/latest/enums/channels.json" }, "minItems": 1, "description": "Advertising channels. Standards apply to ANY of the listed channels (OR logic)." @@ -59,7 +60,7 @@ "type": "array", "description": "Updated bespoke policies for this content-standards configuration, using the same shape as registry entries. Replaces the existing policies array; use stable policy_ids to track policies across versions. Combines with registry_policy_ids. Bespoke policy_ids MUST be flat (no colons/slashes).", "items": { - "$ref": "../governance/policy-entry.json" + "$ref": "/schemas/latest/governance/policy-entry.json" }, "minItems": 1 }, @@ -96,7 +97,7 @@ ] }, { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Full artifact with pre-extracted content (text, images, video, audio)" } ] @@ -132,7 +133,7 @@ ] }, { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Full artifact with pre-extracted content (text, images, video, audio)" } ] @@ -142,10 +143,10 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" }, "idempotency_key": { "type": "string", @@ -160,4 +161,4 @@ "standards_id" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/update-content-standards-response.json b/schemas/cache/content-standards/update-content-standards-response.json index 54c252aa2..86ddd4e7d 100644 --- a/schemas/cache/content-standards/update-content-standards-response.json +++ b/schemas/cache/content-standards/update-content-standards-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/update-content-standards-response.json", "title": "Update Content Standards Response", "description": "Response from updating a content standards configuration", "oneOf": [ @@ -17,16 +18,13 @@ "description": "ID of the updated standards configuration" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "standards_id" - ], + "required": ["success", "standards_id"], "additionalProperties": true }, { @@ -40,9 +38,7 @@ }, "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - }, + "items": { "$ref": "/schemas/latest/core/error.json" }, "description": "Errors that occurred during the update", "minItems": 1 }, @@ -51,17 +47,14 @@ "description": "If scope change conflicts with another configuration, the ID of the conflicting standards" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "success", - "errors" - ], + "required": ["success", "errors"], "additionalProperties": true } ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/validate-content-delivery-request.json b/schemas/cache/content-standards/validate-content-delivery-request.json index 7a04eafc7..ed5f5c330 100644 --- a/schemas/cache/content-standards/validate-content-delivery-request.json +++ b/schemas/cache/content-standards/validate-content-delivery-request.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/validate-content-delivery-request.json", "title": "Validate Content Delivery Request", "description": "Request parameters for batch validating delivery records against content safety policies", "type": "object", @@ -36,7 +37,7 @@ "description": "When the delivery occurred" }, "artifact": { - "$ref": "artifact.json", + "$ref": "/schemas/latest/content-standards/artifact.json", "description": "Artifact where ad was delivered" }, "country": { @@ -82,14 +83,14 @@ "description": "Include passed records in results" }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, "required": [ "standards_id", "records" ] -} \ No newline at end of file +} diff --git a/schemas/cache/content-standards/validate-content-delivery-response.json b/schemas/cache/content-standards/validate-content-delivery-response.json index 6d366aa79..85b0343d7 100644 --- a/schemas/cache/content-standards/validate-content-delivery-response.json +++ b/schemas/cache/content-standards/validate-content-delivery-response.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/content-standards/validate-content-delivery-response.json", "title": "Validate Content Delivery Response", "description": "Response payload with per-record verdicts and optional feature breakdown", "type": "object", @@ -12,21 +13,11 @@ "type": "object", "description": "Summary counts across all records", "properties": { - "total_records": { - "type": "integer" - }, - "passed_records": { - "type": "integer" - }, - "failed_records": { - "type": "integer" - } + "total_records": { "type": "integer" }, + "passed_records": { "type": "integer" }, + "failed_records": { "type": "integer" } }, - "required": [ - "total_records", - "passed_records", - "failed_records" - ] + "required": ["total_records", "passed_records", "failed_records"] }, "results": { "type": "array", @@ -40,10 +31,7 @@ }, "verdict": { "type": "string", - "enum": [ - "pass", - "fail" - ], + "enum": ["pass", "fail"], "description": "Overall pass/fail verdict for this record" }, "features": { @@ -58,12 +46,7 @@ }, "status": { "type": "string", - "enum": [ - "passed", - "failed", - "warning", - "unevaluated" - ] + "enum": ["passed", "failed", "warning", "unevaluated"] }, "policy_id": { "type": "string", @@ -71,7 +54,7 @@ }, "explanation": { "type": "string", - "description": "Directional human-readable explanation (e.g., 'Below minimum resolution for display placement'). Avoid quantitative thresholds \u2014 the evaluator is the oracle." + "description": "Directional human-readable explanation (e.g., 'Below minimum resolution for display placement'). Avoid quantitative thresholds — the evaluator is the oracle." }, "confidence": { "type": "number", @@ -80,30 +63,21 @@ "description": "Optional evaluator confidence in this result (0-1). Distinguishes certain verdicts from ambiguous ones." } }, - "required": [ - "feature_id", - "status" - ] + "required": ["feature_id", "status"] } } }, - "required": [ - "record_id", - "verdict" - ] + "required": ["record_id", "verdict"] } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "summary", - "results" - ] + "required": ["summary", "results"] }, { "type": "object", @@ -111,20 +85,16 @@ "properties": { "errors": { "type": "array", - "items": { - "$ref": "../core/error.json" - } + "items": { "$ref": "/schemas/latest/core/error.json" } }, "context": { - "$ref": "../core/context.json" + "$ref": "/schemas/latest/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "errors" - ] + "required": ["errors"] } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/account-ref.json b/schemas/cache/core/account-ref.json index 23a3d2ef4..f58e8dffb 100644 --- a/schemas/cache/core/account-ref.json +++ b/schemas/cache/core/account-ref.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/account-ref.json", "title": "Account Reference", "description": "Reference to an account by seller-assigned ID or natural key. Use account_id for explicit accounts (require_operator_auth: true, discovered via list_accounts). Use the natural key (brand + operator) for implicit accounts (require_operator_auth: false, declared via sync_accounts). For sandbox: explicit accounts use account_id (pre-existing test account), implicit accounts use the natural key with sandbox: true.", "type": "object", @@ -11,15 +12,13 @@ "description": "Seller-assigned account identifier (from sync_accounts or list_accounts)" } }, - "required": [ - "account_id" - ], + "required": ["account_id"], "additionalProperties": false }, { "properties": { "brand": { - "$ref": "brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference identifying the advertiser" }, "operator": { @@ -33,36 +32,14 @@ "default": false } }, - "required": [ - "brand", - "operator" - ], + "required": ["brand", "operator"], "additionalProperties": false } ], "examples": [ - { - "account_id": "acc_acme_001" - }, - { - "brand": { - "domain": "acme-corp.com" - }, - "operator": "acme-corp.com" - }, - { - "brand": { - "domain": "nova-brands.com", - "brand_id": "spark" - }, - "operator": "pinnacle-media.com" - }, - { - "brand": { - "domain": "acme-corp.com" - }, - "operator": "acme-corp.com", - "sandbox": true - } + { "account_id": "acc_acme_001" }, + { "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com" }, + { "brand": { "domain": "nova-brands.com", "brand_id": "spark" }, "operator": "pinnacle-media.com" }, + { "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com", "sandbox": true } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/account.json b/schemas/cache/core/account.json index fd609b3e0..7b29f01f2 100644 --- a/schemas/cache/core/account.json +++ b/schemas/cache/core/account.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/account.json", "title": "Account", "description": "A billing account representing the relationship between a buyer and seller. The account determines rate cards, payment terms, and billing entity.", "type": "object", @@ -21,11 +22,11 @@ "description": "Optional intermediary who receives invoices on behalf of the advertiser (e.g., agency)" }, "status": { - "$ref": "../enums/account-status.json", + "$ref": "/schemas/latest/enums/account-status.json", "description": "Account lifecycle status. See the Accounts Protocol overview for the operations matrix showing which tasks are permitted in each state." }, "brand": { - "$ref": "brand-ref.json", + "$ref": "/schemas/latest/core/brand-ref.json", "description": "Brand reference identifying the advertiser" }, "operator": { @@ -35,15 +36,11 @@ }, "billing": { "type": "string", - "enum": [ - "operator", - "agent", - "advertiser" - ], + "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." }, "billing_entity": { - "$ref": "business-entity.json", + "$ref": "/schemas/latest/core/business-entity.json", "description": "Business entity details for the party responsible for payment. Contains the legal name, tax IDs, address, and bank details needed for formal B2B invoicing. Corresponds to whoever billing points to (operator, agent, or advertiser). When this account appears in a response, bank details MUST be omitted (write-only)." }, "rate_card": { @@ -52,14 +49,7 @@ }, "payment_terms": { "type": "string", - "enum": [ - "net_15", - "net_30", - "net_45", - "net_60", - "net_90", - "prepay" - ], + "enum": ["net_15", "net_30", "net_45", "net_60", "net_90", "prepay"], "description": "Payment terms agreed for this account. Binding for all invoices when the account is active." }, "credit_limit": { @@ -75,10 +65,7 @@ "pattern": "^[A-Z]{3}$" } }, - "required": [ - "amount", - "currency" - ] + "required": ["amount", "currency"] }, "setup": { "type": "object", @@ -99,24 +86,17 @@ "description": "When this setup link expires." } }, - "required": [ - "message" - ], + "required": ["message"], "additionalProperties": true }, "account_scope": { "type": "string", - "enum": [ - "operator", - "brand", - "operator_brand", - "agent" - ], + "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 a specific operator+brand combination. agent: the agent's default account with no brand or operator association." }, "governance_agents": { "type": "array", - "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoints registered on this account. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -128,28 +108,22 @@ }, "categories": { "type": "array", - "items": { - "type": "string", - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_]*$" - }, + "items": { "type": "string", "maxLength": 64, "pattern": "^[a-z][a-z0-9_]*$" }, "description": "Governance categories this agent handles (e.g., ['budget_authority', 'strategic_alignment']). When omitted, the agent handles all categories.", "maxItems": 20 } }, - "required": [ - "url" - ], + "required": ["url"], "additionalProperties": false }, "maxItems": 10 }, "reporting_bucket": { "type": "object", - "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix \u2014 bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", + "description": "Cloud storage bucket where the seller delivers offline reporting files for this account. Seller provisions a dedicated bucket or a per-account prefix within a shared bucket, and grants the buyer read access out-of-band. Access MUST be scoped at the IAM layer so each account can only read its own prefix — bucket-wide grants are non-compliant even with per-account prefixes. Seller MUST revoke access when the account's status transitions to inactive, suspended, or closed. See security considerations for offline delivery in docs/media-buy/media-buys/optimization-reporting. Only present when the seller supports offline delivery (reporting_delivery_methods includes 'offline' in capabilities).", "properties": { "protocol": { - "$ref": "../enums/cloud-storage-protocol.json", + "$ref": "/schemas/latest/enums/cloud-storage-protocol.json", "description": "Cloud storage protocol" }, "bucket": { @@ -181,22 +155,13 @@ }, "format": { "type": "string", - "enum": [ - "jsonl", - "csv", - "parquet", - "avro", - "orc" - ], + "enum": ["jsonl", "csv", "parquet", "avro", "orc"], "description": "File format for delivered files. Parquet, Avro, and ORC use internal compression (the top-level compression field is ignored for these formats).", "default": "jsonl" }, "compression": { "type": "string", - "enum": [ - "gzip", - "none" - ], + "enum": ["gzip", "none"], "description": "Compression applied to delivered files", "default": "gzip" }, @@ -204,39 +169,27 @@ "type": "integer", "description": "How long reporting files are retained in the bucket before deletion. Buyers must read files within this window. Minimum recommended: 14 days.", "minimum": 1, - "examples": [ - 14, - 30, - 90 - ] + "examples": [14, 30, 90] }, "setup_instructions": { "type": "string", "format": "uri", "pattern": "^https://", - "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation \u2014 buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." + "description": "URL to documentation for configuring buyer read access to this bucket (IAM role, service account, etc.). Operator-facing documentation — buyer agents MUST NOT auto-fetch this URL; surface it to a human operator. If an implementation fetches it (for preview), apply webhook URL SSRF validation and do not pass the fetched content into an LLM context without indirect-prompt-injection guarding. See docs/media-buy/media-buys/optimization-reporting#security-considerations-for-offline-delivery." } }, - "required": [ - "protocol", - "bucket", - "file_retention_days" - ], + "required": ["protocol", "bucket", "file_retention_days"], "additionalProperties": false }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." + "description": "When true, this is a sandbox account — no real platform calls, no real spend. For explicit accounts (require_operator_auth: true), sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts. For implicit accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "ext": { - "$ref": "ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "account_id", - "name", - "status" - ], + "required": ["account_id", "name", "status"], "additionalProperties": true, "examples": [ { @@ -245,9 +198,7 @@ "account_id": "acc_acme_direct", "name": "Acme", "advertiser": "Acme Corp", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "acme-corp.com", "status": "active", "billing": "operator", @@ -263,9 +214,7 @@ "name": "Acme c/o Pinnacle", "advertiser": "Acme Corp", "billing_proxy": "Pinnacle Media", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "pinnacle-media.com", "status": "active", "billing": "operator", @@ -280,9 +229,7 @@ "account_id": "acc_pinnacle", "name": "Pinnacle", "advertiser": "Pinnacle Media", - "brand": { - "domain": "pinnacle-media.com" - }, + "brand": { "domain": "pinnacle-media.com" }, "operator": "pinnacle-media.com", "status": "active", "billing": "operator", @@ -298,10 +245,7 @@ "name": "Spark (via Pinnacle)", "advertiser": "Nova Brands", "status": "active", - "brand": { - "domain": "nova-brands.com", - "brand_id": "spark" - }, + "brand": { "domain": "nova-brands.com", "brand_id": "spark" }, "operator": "pinnacle-media.com", "billing": "agent", "account_scope": "operator_brand", @@ -315,10 +259,7 @@ "name": "Glow", "advertiser": "Nova Brands", "status": "pending_approval", - "brand": { - "domain": "nova-brands.com", - "brand_id": "glow" - }, + "brand": { "domain": "nova-brands.com", "brand_id": "glow" }, "operator": "pinnacle-media.com", "billing": "operator", "account_scope": "brand" @@ -330,9 +271,7 @@ "account_id": "acc_acme_direct_bill", "name": "Acme (billed direct)", "advertiser": "Acme Corp", - "brand": { - "domain": "acme-corp.com" - }, + "brand": { "domain": "acme-corp.com" }, "operator": "pinnacle-media.com", "status": "active", "billing": "advertiser", @@ -358,4 +297,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/activation-key.json b/schemas/cache/core/activation-key.json index 986b4677a..5f7e2820a 100644 --- a/schemas/cache/core/activation-key.json +++ b/schemas/cache/core/activation-key.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/activation-key.json", "title": "Activation Key", "description": "Universal identifier for using a signal on a destination platform. Can be either a segment ID or a key-value pair depending on the platform's targeting mechanism.", "type": "object", @@ -46,4 +47,4 @@ "additionalProperties": true } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/ad-inventory-config.json b/schemas/cache/core/ad-inventory-config.json index 60bc1bdd6..d7a56d109 100644 --- a/schemas/cache/core/ad-inventory-config.json +++ b/schemas/cache/core/ad-inventory-config.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/ad-inventory-config.json", "title": "Ad Inventory Configuration", "description": "Break-based ad inventory configuration for an installment. Describes the ad breaks available within the content. For non-break ad formats (host reads, integrations, sponsorships), use product placements instead.", "type": "object", @@ -31,8 +32,6 @@ } } }, - "required": [ - "expected_breaks" - ], + "required": ["expected_breaks"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/agent-encryption-key.json b/schemas/cache/core/agent-encryption-key.json index ea51dc2de..823d20c9f 100644 --- a/schemas/cache/core/agent-encryption-key.json +++ b/schemas/cache/core/agent-encryption-key.json @@ -1,12 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/agent-encryption-key.json", "title": "Agent Encryption Key", "description": "X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.", "type": "object", "properties": { "kid": { "type": "string", - "description": "Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information.", + "description": "Key identifier. Opaque — MUST NOT encode geographic or deployment information.", "maxLength": 8 }, "kty": { @@ -37,4 +38,4 @@ "x" ], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/core/agent-signing-key.json b/schemas/cache/core/agent-signing-key.json index fb6fe0a3f..543904e56 100644 --- a/schemas/cache/core/agent-signing-key.json +++ b/schemas/cache/core/agent-signing-key.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/agent-signing-key.json", "title": "Agent Signing Key", "description": "Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.", "type": "object", @@ -51,4 +52,4 @@ "kty" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/app-item.json b/schemas/cache/core/app-item.json index 7e0463386..d38cdeff7 100644 --- a/schemas/cache/core/app-item.json +++ b/schemas/cache/core/app-item.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/app-item.json", "title": "App Item", - "description": "A mobile application within an app-type catalog. Carries the app metadata and store identifiers that platforms use for app install campaigns and re-engagement ads. Maps to Google App Campaigns, Apple Search Ads, Meta App Ads, TikTok App Campaigns, and Snapchat App Install Ads. Each item represents one app on one platform \u2014 iOS and Android variants are separate items.", + "description": "A mobile application within an app-type catalog. Carries the app metadata and store identifiers that platforms use for app install campaigns and re-engagement ads. Maps to Google App Campaigns, Apple Search Ads, Meta App Ads, TikTok App Campaigns, and Snapchat App Install Ads. Each item represents one app on one platform — iOS and Android variants are separate items.", "type": "object", "properties": { "app_id": { @@ -14,10 +15,7 @@ }, "platform": { "type": "string", - "enum": [ - "ios", - "android" - ], + "enum": ["ios", "android"], "description": "Target platform. iOS and Android are separate items because they have distinct store identifiers and attribution mechanisms." }, "bundle_id": { @@ -44,7 +42,7 @@ "icon_url": { "type": "string", "format": "uri", - "description": "App icon image URL. Typically 1024\u00d71024 px." + "description": "App icon image URL. Typically 1024×1024 px." }, "screenshots": { "type": "array", @@ -71,14 +69,14 @@ "description": "Deep link URI for re-engagement campaigns targeting existing users. Use Universal Links (iOS) or App Links (Android) where available (e.g., 'https://acmegames.com/app/level/5'). Falls back to URI scheme (e.g., 'acmegames://level/5') when universal links are not configured." }, "price": { - "$ref": "price.json", + "$ref": "/schemas/latest/core/price.json", "description": "App download price. Set amount to 0 for free apps." }, "rating": { "type": "number", "minimum": 0, "maximum": 5, - "description": "Average store rating (0\u20135). Use 0 to indicate no ratings yet." + "description": "Average store rating (0–5). Use 0 to indicate no ratings yet." }, "rating_count": { "type": "integer", @@ -101,19 +99,15 @@ "type": "array", "description": "Typed creative asset pools for this app. Uses the same OfferingAssetGroup structure as offering-type catalogs. Standard group IDs: 'images_landscape' (promotional hero), 'images_vertical' (9:16 for Snap, Stories), 'images_square' (1:1 for display), 'video' (gameplay or demo video). Supplements icon_url and screenshots for platform-specific format requirements.", "items": { - "$ref": "offering-asset-group.json" + "$ref": "/schemas/latest/core/offering-asset-group.json" }, "minItems": 1 }, "ext": { - "$ref": "ext.json" + "$ref": "/schemas/latest/core/ext.json" } }, - "required": [ - "app_id", - "name", - "platform" - ], + "required": ["app_id", "name", "platform"], "additionalProperties": true, "examples": [ { @@ -128,17 +122,11 @@ "genre": "puzzle", "icon_url": "https://assets.acmegames.com/puzzlequest/icon-1024.png", "store_url": "https://apps.apple.com/app/puzzle-quest-match-3/id1234567890", - "price": { - "amount": 0, - "currency": "USD" - }, + "price": { "amount": 0, "currency": "USD" }, "rating": 4.7, "rating_count": 82000, "content_rating": "4+", - "tags": [ - "casual", - "offline" - ] + "tags": ["casual", "offline"] } }, { @@ -152,18 +140,12 @@ "icon_url": "https://assets.acmefinancial.com/app/icon.png", "store_url": "https://play.google.com/store/apps/details?id=com.acmefinancial.banking", "deep_link_url": "https://app.acmefinancial.com/offers", - "price": { - "amount": 0, - "currency": "USD" - }, + "price": { "amount": 0, "currency": "USD" }, "rating": 4.4, "rating_count": 31500, "content_rating": "Everyone", - "tags": [ - "finance", - "banking" - ] + "tags": ["finance", "banking"] } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/audio-asset.json b/schemas/cache/core/assets/audio-asset.json index 12817c48c..eac3a4cfe 100644 --- a/schemas/cache/core/assets/audio-asset.json +++ b/schemas/cache/core/assets/audio-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/audio-asset.json", "title": "Audio Asset", "description": "Audio asset with URL and technical specifications", "type": "object", @@ -33,21 +34,12 @@ }, "channels": { "type": "string", - "enum": [ - "mono", - "stereo", - "5.1", - "7.1" - ], + "enum": ["mono", "stereo", "5.1", "7.1"], "description": "Channel configuration" }, "bit_depth": { "type": "integer", - "enum": [ - 16, - 24, - 32 - ], + "enum": [16, 24, 32], "description": "Bit depth" }, "bitrate_kbps": { @@ -70,7 +62,7 @@ "x-accessibility": true }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -78,4 +70,4 @@ "url" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/brief-asset.json b/schemas/cache/core/assets/brief-asset.json index 8b7591454..c3be37520 100644 --- a/schemas/cache/core/assets/brief-asset.json +++ b/schemas/cache/core/assets/brief-asset.json @@ -1,10 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/brief-asset.json", "title": "Brief Asset", "description": "Campaign-level creative context as an asset. Carries the creative brief through the manifest so it travels with the creative through regeneration, resizing, and auditing.", "allOf": [ - { - "$ref": "../../core/creative-brief.json" - } + { "$ref": "/schemas/latest/core/creative-brief.json" } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/catalog-asset.json b/schemas/cache/core/assets/catalog-asset.json index 68e6026f7..8c351ff9a 100644 --- a/schemas/cache/core/assets/catalog-asset.json +++ b/schemas/cache/core/assets/catalog-asset.json @@ -1,10 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/catalog-asset.json", "title": "Catalog Asset", "description": "A typed data feed as a creative asset. Carries catalog context (products, stores, jobs, etc.) within the manifest's assets map.", "allOf": [ - { - "$ref": "../../core/catalog.json" - } + { "$ref": "/schemas/latest/core/catalog.json" } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/css-asset.json b/schemas/cache/core/assets/css-asset.json index 44e99ee8e..16c97ad91 100644 --- a/schemas/cache/core/assets/css-asset.json +++ b/schemas/cache/core/assets/css-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/css-asset.json", "title": "CSS Asset", "description": "CSS stylesheet asset", "type": "object", @@ -13,7 +14,7 @@ "description": "CSS media query context (e.g., 'screen', 'print')" }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -21,4 +22,4 @@ "content" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/daast-asset.json b/schemas/cache/core/assets/daast-asset.json index 287d33dec..669eb9dbb 100644 --- a/schemas/cache/core/assets/daast-asset.json +++ b/schemas/cache/core/assets/daast-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/daast-asset.json", "title": "DAAST Asset", "description": "DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving", "oneOf": [ @@ -17,7 +18,7 @@ "description": "URL endpoint that returns DAAST XML" }, "daast_version": { - "$ref": "../../enums/daast-version.json", + "$ref": "/schemas/latest/enums/daast-version.json", "description": "DAAST specification version" }, "duration_ms": { @@ -28,7 +29,7 @@ "tracking_events": { "type": "array", "items": { - "$ref": "../../enums/daast-tracking-event.json" + "$ref": "/schemas/latest/enums/daast-tracking-event.json" }, "description": "Tracking events supported by this DAAST tag" }, @@ -43,7 +44,7 @@ "x-accessibility": true }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -66,7 +67,7 @@ "description": "Inline DAAST XML content" }, "daast_version": { - "$ref": "../../enums/daast-version.json", + "$ref": "/schemas/latest/enums/daast-version.json", "description": "DAAST specification version" }, "duration_ms": { @@ -77,7 +78,7 @@ "tracking_events": { "type": "array", "items": { - "$ref": "../../enums/daast-tracking-event.json" + "$ref": "/schemas/latest/enums/daast-tracking-event.json" }, "description": "Tracking events supported by this DAAST tag" }, @@ -92,7 +93,7 @@ "x-accessibility": true }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -103,4 +104,4 @@ "additionalProperties": true } ] -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/html-asset.json b/schemas/cache/core/assets/html-asset.json index 10d9a28da..a3cb06c0d 100644 --- a/schemas/cache/core/assets/html-asset.json +++ b/schemas/cache/core/assets/html-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/html-asset.json", "title": "HTML Asset", "description": "HTML content asset", "type": "object", @@ -36,7 +37,7 @@ } }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -44,4 +45,4 @@ "content" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/image-asset.json b/schemas/cache/core/assets/image-asset.json index 93bc2c588..3496fe458 100644 --- a/schemas/cache/core/assets/image-asset.json +++ b/schemas/cache/core/assets/image-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/image-asset.json", "title": "Image Asset", "description": "Image asset with URL and dimensions", "type": "object", @@ -29,7 +30,7 @@ "x-accessibility": true }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -39,4 +40,4 @@ "height" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/javascript-asset.json b/schemas/cache/core/assets/javascript-asset.json index 4c7ba560a..de8957099 100644 --- a/schemas/cache/core/assets/javascript-asset.json +++ b/schemas/cache/core/assets/javascript-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/javascript-asset.json", "title": "JavaScript Asset", "description": "JavaScript code asset", "type": "object", @@ -9,7 +10,7 @@ "description": "JavaScript content" }, "module_type": { - "$ref": "../../enums/javascript-module-type.json", + "$ref": "/schemas/latest/enums/javascript-module-type.json", "description": "JavaScript module type" }, "accessibility": { @@ -36,7 +37,7 @@ } }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -44,4 +45,4 @@ "content" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/markdown-asset.json b/schemas/cache/core/assets/markdown-asset.json index 7a6505660..21813a329 100644 --- a/schemas/cache/core/assets/markdown-asset.json +++ b/schemas/cache/core/assets/markdown-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/markdown-asset.json", "title": "Markdown Asset", "description": "Markdown-formatted text content following CommonMark specification", "type": "object", @@ -13,7 +14,7 @@ "description": "Language code (e.g., 'en', 'es', 'fr')" }, "markdown_flavor": { - "$ref": "../../enums/markdown-flavor.json", + "$ref": "/schemas/latest/enums/markdown-flavor.json", "default": "commonmark", "description": "Markdown flavor used. CommonMark for strict compatibility, GFM for tables/task lists/strikethrough." }, @@ -27,4 +28,4 @@ "content" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/text-asset.json b/schemas/cache/core/assets/text-asset.json index 75a20bb89..40d169e0d 100644 --- a/schemas/cache/core/assets/text-asset.json +++ b/schemas/cache/core/assets/text-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/text-asset.json", "title": "Text Asset", "description": "Text content asset", "type": "object", @@ -13,7 +14,7 @@ "description": "Language code (e.g., 'en', 'es', 'fr')" }, "provenance": { - "$ref": "../../core/provenance.json", + "$ref": "/schemas/latest/core/provenance.json", "description": "Provenance metadata for this asset, overrides manifest-level provenance" } }, @@ -21,4 +22,4 @@ "content" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/core/assets/url-asset.json b/schemas/cache/core/assets/url-asset.json index da65a7705..17204e975 100644 --- a/schemas/cache/core/assets/url-asset.json +++ b/schemas/cache/core/assets/url-asset.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/latest/core/assets/url-asset.json", "title": "URL Asset", "description": "URL reference asset", "type": "object", @@ -10,7 +11,7 @@ "description": "URL reference" }, "url_type": { - "$ref": "../../enums/url-asset-type.json", + "$ref": "/schemas/latest/enums/url-asset-type.json", "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