From 0b444ed164d5a166932c00ebfdd63e98d124d249 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Fri, 28 Aug 2026 09:47:13 +0100 Subject: [PATCH 01/12] feat(reporting): add reliable ledger reconciliation --- SCHEMA_DELTAS.md | 4 +- scripts/collision_allowlist.json | 12 + scripts/generate_types.py | 16 + src/adcp/client.py | 76 +++ src/adcp/protocols/a2a.py | 6 + src/adcp/protocols/base.py | 12 + src/adcp/protocols/mcp.py | 9 +- src/adcp/reporting.py | 638 ++++++++++++++++++ src/adcp/types/__init__.py | 20 + src/adcp/types/_eager.py | 20 + .../types/generated_poc/a2ui/si_catalog.py | 8 +- .../account/sync_accounts_request.py | 17 +- .../account/sync_accounts_response.py | 2 + .../core/agent_configuration_state.py | 32 + .../core/agent_notification_config_state.py | 34 + .../core/agent_reporting_destination.py | 227 +++++++ .../core/agent_reporting_destination_state.py | 96 +++ .../core/agent_webhook_challenge.py | 4 +- .../generated_poc/core/assets/card_asset.py | 5 +- .../core/capabilities_changed_webhook.py | 4 +- .../generated_poc/core/delivery_provider.py | 23 + .../generated_poc/core/delivery_recipient.py | 26 + .../generated_poc/core/mcp_webhook_payload.py | 4 +- .../reporting_canonical_content_digest.py | 20 + .../core/reporting_control_total.py | 41 ++ .../reporting_dataset_share_destination.py | 93 +++ .../core/reporting_delivery_capabilities.py | 59 ++ .../core/reporting_delivery_config.py | 105 +++ .../core/reporting_delivery_config_state.py | 85 +++ .../core/reporting_delivery_method.py | 124 ++++ .../core/reporting_delivery_offering.py | 180 +++++ .../core/reporting_delivery_ready_webhook.py | 68 ++ .../core/reporting_file_compression.py | 14 + .../core/reporting_file_entry.py | 28 + .../core/reporting_file_manifest.py | 55 ++ .../core/reporting_materialization.py | 100 +++ .../core/reporting_obligation.py | 138 ++++ .../generated_poc/core/reporting_receipt.py | 71 ++ .../core/reporting_reconciliation_mode.py | 12 + .../generated_poc/core/reporting_resource.py | 87 +++ .../generated_poc/core/reporting_revision.py | 126 ++++ .../generated_poc/core/reporting_schedule.py | 44 ++ .../core/reporting_status_issue.py | 82 +++ .../core/reporting_verification.py | 98 +++ .../core/reporting_verification_profile.py | 13 + .../reporting_verification_profile_set.py | 24 + .../core/reporting_write_destination.py | 74 ++ .../generated_poc/enums/reporting_finality.py | 12 + .../generated_poc/enums/reporting_health.py | 15 + .../types/generated_poc/enums/task_type.py | 4 +- .../extensions/extension_meta.py | 10 +- .../media_buy/get_reporting_status_request.py | 115 ++++ .../get_reporting_status_response.py | 167 +++++ .../media_buy/product_refinement.py | 8 +- .../sync_reporting_receipts_request.py | 36 + .../sync_reporting_receipts_response.py | 51 ++ .../sync_agent_configuration_request.py | 72 ++ .../sync_agent_configuration_response.py | 84 +++ tests/fixtures/public_api_snapshot.json | 10 + tests/test_reporting_reconciliation.py | 415 ++++++++++++ 60 files changed, 4012 insertions(+), 23 deletions(-) create mode 100644 src/adcp/reporting.py create mode 100644 src/adcp/types/generated_poc/core/agent_configuration_state.py create mode 100644 src/adcp/types/generated_poc/core/agent_notification_config_state.py create mode 100644 src/adcp/types/generated_poc/core/agent_reporting_destination.py create mode 100644 src/adcp/types/generated_poc/core/agent_reporting_destination_state.py create mode 100644 src/adcp/types/generated_poc/core/delivery_provider.py create mode 100644 src/adcp/types/generated_poc/core/delivery_recipient.py create mode 100644 src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py create mode 100644 src/adcp/types/generated_poc/core/reporting_control_total.py create mode 100644 src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_capabilities.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_config.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_config_state.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_method.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_offering.py create mode 100644 src/adcp/types/generated_poc/core/reporting_delivery_ready_webhook.py create mode 100644 src/adcp/types/generated_poc/core/reporting_file_compression.py create mode 100644 src/adcp/types/generated_poc/core/reporting_file_entry.py create mode 100644 src/adcp/types/generated_poc/core/reporting_file_manifest.py create mode 100644 src/adcp/types/generated_poc/core/reporting_materialization.py create mode 100644 src/adcp/types/generated_poc/core/reporting_obligation.py create mode 100644 src/adcp/types/generated_poc/core/reporting_receipt.py create mode 100644 src/adcp/types/generated_poc/core/reporting_reconciliation_mode.py create mode 100644 src/adcp/types/generated_poc/core/reporting_resource.py create mode 100644 src/adcp/types/generated_poc/core/reporting_revision.py create mode 100644 src/adcp/types/generated_poc/core/reporting_schedule.py create mode 100644 src/adcp/types/generated_poc/core/reporting_status_issue.py create mode 100644 src/adcp/types/generated_poc/core/reporting_verification.py create mode 100644 src/adcp/types/generated_poc/core/reporting_verification_profile.py create mode 100644 src/adcp/types/generated_poc/core/reporting_verification_profile_set.py create mode 100644 src/adcp/types/generated_poc/core/reporting_write_destination.py create mode 100644 src/adcp/types/generated_poc/enums/reporting_finality.py create mode 100644 src/adcp/types/generated_poc/enums/reporting_health.py create mode 100644 src/adcp/types/generated_poc/media_buy/get_reporting_status_request.py create mode 100644 src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py create mode 100644 src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py create mode 100644 src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py create mode 100644 src/adcp/types/generated_poc/protocol/sync_agent_configuration_request.py create mode 100644 src/adcp/types/generated_poc/protocol/sync_agent_configuration_response.py create mode 100644 tests/test_reporting_reconciliation.py diff --git a/SCHEMA_DELTAS.md b/SCHEMA_DELTAS.md index c7f74de04..768c45bbb 100644 --- a/SCHEMA_DELTAS.md +++ b/SCHEMA_DELTAS.md @@ -2,5 +2,5 @@ ## Field changes -- `core/reporting_webhook.py` - - `ReportingWebhook`: `+operation_id` +- `core/reporting_receipt.py` + - `ReportingReceipt`: `+observed_native_version_ref` diff --git a/scripts/collision_allowlist.json b/scripts/collision_allowlist.json index 6100bc81d..61f5aa0b0 100644 --- a/scripts/collision_allowlist.json +++ b/scripts/collision_allowlist.json @@ -16,6 +16,7 @@ "Age", "AgeRestriction", "AiActRiskClass", + "Algorithm", "Amount", "AppliesToEnum", "Area", @@ -44,6 +45,7 @@ "CacheScope", "CalibrationExemplars", "Cancellation", + "CanonicalContentDigest", "CanonicalPayload", "Catalog", "CatalogId", @@ -55,6 +57,7 @@ "Channel", "CheckType", "ClaimType", + "Cloud", "Code", "Codec", "Collection", @@ -111,6 +114,7 @@ "Exemplars", "Fail", "Feature", + "FeedPurpose", "Field1", "Filters", "Finding", @@ -153,6 +157,7 @@ "MaximumAge", "MediaBuy", "MediaBuyDelivery", + "MediaBuyId", "Metadata", "Method", "Methodology", @@ -170,6 +175,7 @@ "Operation", "Opportunity", "OptimizationGoal", + "Orchestration", "Orientation", "Origin", "Outcome", @@ -179,6 +185,7 @@ "Parameters", "ParentMatchBehavior", "Pass", + "Pattern", "Payload", "PaymentTerms", "PerformanceFeedback", @@ -218,12 +225,14 @@ "Radius", "Range", "ReachWindow", + "ReaderCompatibilityItem", "Reason", "ReasonCode", "Recovery", "RefreshCadence", "Region", "Relationship", + "ReportingDeliveryMethod", "ReportingFrequency", "ReportingPeriod", "RequiredVendorMetric", @@ -243,6 +252,7 @@ "SelectionMode", "SellerPreference", "Setup", + "Severity", "Signal", "SignalId", "SignalTag", @@ -252,6 +262,7 @@ "Sort", "SortApplied", "Source", + "State", "Status", "StatusFilter", "Subject", @@ -291,6 +302,7 @@ "VendorMetric", "VendorMetricOptimization", "VerifyAgent", + "View", "Viewability", "Violation", "Warning" diff --git a/scripts/generate_types.py b/scripts/generate_types.py index e747941f8..466eb354f 100755 --- a/scripts/generate_types.py +++ b/scripts/generate_types.py @@ -120,6 +120,22 @@ def rewrite_refs(obj, current_schema_rel_path: Path): ref_path = obj["$ref"] file_part, separator, fragment = ref_path.partition("#") + # datamodel-code-generator rebases this cross-directory enum as + # ``core/enums/...`` (and sibling macro schemas as ``core/core``) + # when a macro schema is reached transitively. Point those refs at + # their eventual absolute temp-tree path. This keeps one generated + # model per canonical schema instead of inlining duplicate classes. + macro_ref_match = re.search( + r"/(enums/(?:macro-[^/]+|universal-macro)\.json|core/macro-[^/]+\.json)$", + file_part, + ) + if not fragment and macro_ref_match: + temp_rel = Path( + *(part.replace("-", "_") for part in macro_ref_match.group(1).split("/")) + ) + obj["$ref"] = (TEMP_DIR / temp_rel).as_posix() + return obj + # Convert root-relative and canonical absolute schema refs to # local files. This keeps generation deterministic and lets the # generator reuse source models instead of inlining a duplicate diff --git a/src/adcp/client.py b/src/adcp/client.py index 70138a291..235288f32 100644 --- a/src/adcp/client.py +++ b/src/adcp/client.py @@ -296,6 +296,18 @@ ) from adcp.types.generated_poc.governance.sync_plans_request import SyncPlansRequest from adcp.types.generated_poc.governance.sync_plans_response import SyncPlansResponse +from adcp.types.generated_poc.media_buy.get_reporting_status_request import ( + GetReportingStatusRequest, +) +from adcp.types.generated_poc.media_buy.get_reporting_status_response import ( + GetReportingStatusResponse, +) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_request import ( + SyncReportingReceiptsRequest, +) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_response import ( + SyncReportingReceiptsResponse, +) from adcp.types.generated_poc.property.create_property_list_request import ( CreatePropertyListRequest, ) @@ -2679,6 +2691,70 @@ async def get_media_buy_delivery( ) return self.adapter._parse_response(raw_result, GetMediaBuyDeliveryResponse) + @_task_options_method + async def get_reporting_status( + self, + request: GetReportingStatusRequest, + *, + options: TaskOptions | None = None, + ) -> TaskResult[GetReportingStatusResponse]: + """Read the stable reporting obligation/revision/materialization ledger.""" + operation_id = self._task_operation_id() + params = request.model_dump(mode="json", exclude_none=True) + self._emit_activity( + Activity( + type=ActivityType.PROTOCOL_REQUEST, + operation_id=operation_id, + agent_id=self.agent_config.id, + task_type="get_reporting_status", + timestamp=datetime.now(timezone.utc).isoformat(), + ) + ) + raw_result = await self.adapter.get_reporting_status(params) + self._emit_activity( + Activity( + type=ActivityType.PROTOCOL_RESPONSE, + operation_id=operation_id, + agent_id=self.agent_config.id, + task_type="get_reporting_status", + status=raw_result.status, + timestamp=datetime.now(timezone.utc).isoformat(), + ) + ) + return self.adapter._parse_response(raw_result, GetReportingStatusResponse) + + @_task_options_method + async def sync_reporting_receipts( + self, + request: SyncReportingReceiptsRequest, + *, + options: TaskOptions | None = None, + ) -> TaskResult[SyncReportingReceiptsResponse]: + """Submit durable authenticated consumer reconciliation receipts.""" + operation_id = self._task_operation_id() + params = request.model_dump(mode="json", exclude_none=True) + self._emit_activity( + Activity( + type=ActivityType.PROTOCOL_REQUEST, + operation_id=operation_id, + agent_id=self.agent_config.id, + task_type="sync_reporting_receipts", + timestamp=datetime.now(timezone.utc).isoformat(), + ) + ) + raw_result = await self.adapter.sync_reporting_receipts(params) + self._emit_activity( + Activity( + type=ActivityType.PROTOCOL_RESPONSE, + operation_id=operation_id, + agent_id=self.agent_config.id, + task_type="sync_reporting_receipts", + status=raw_result.status, + timestamp=datetime.now(timezone.utc).isoformat(), + ) + ) + return self.adapter._parse_response(raw_result, SyncReportingReceiptsResponse) + @_task_options_method async def get_media_buys( self, diff --git a/src/adcp/protocols/a2a.py b/src/adcp/protocols/a2a.py index 798332f72..663819b90 100644 --- a/src/adcp/protocols/a2a.py +++ b/src/adcp/protocols/a2a.py @@ -832,6 +832,12 @@ async def get_media_buy_delivery(self, params: dict[str, Any]) -> TaskResult[Any """Get media buy delivery.""" return await self._call_a2a_tool("get_media_buy_delivery", params) + async def get_reporting_status(self, params: dict[str, Any]) -> TaskResult[Any]: + return await self._call_a2a_tool("get_reporting_status", params) + + async def sync_reporting_receipts(self, params: dict[str, Any]) -> TaskResult[Any]: + return await self._call_a2a_tool("sync_reporting_receipts", params) + async def get_media_buys(self, params: dict[str, Any]) -> TaskResult[Any]: """Get media buys with status, creative approval state, and optional delivery snapshots.""" return await self._call_a2a_tool("get_media_buys", params) diff --git a/src/adcp/protocols/base.py b/src/adcp/protocols/base.py index 3b5ac0dd6..e90c38047 100644 --- a/src/adcp/protocols/base.py +++ b/src/adcp/protocols/base.py @@ -228,6 +228,18 @@ async def get_media_buy_delivery(self, params: dict[str, Any]) -> TaskResult[Any """Get media buy delivery.""" pass + async def get_reporting_status(self, params: dict[str, Any]) -> TaskResult[Any]: + """Read the caller/account-isolated reporting reliability ledger.""" + raise NotImplementedError( + "get_reporting_status is not implemented by this protocol adapter" + ) + + async def sync_reporting_receipts(self, params: dict[str, Any]) -> TaskResult[Any]: + """Submit authenticated consumer reporting reconciliation receipts.""" + raise NotImplementedError( + "sync_reporting_receipts is not implemented by this protocol adapter" + ) + @abstractmethod async def get_media_buys(self, params: dict[str, Any]) -> TaskResult[Any]: """Get media buys with status, creative approval state, and optional delivery snapshots.""" diff --git a/src/adcp/protocols/mcp.py b/src/adcp/protocols/mcp.py index 736dd89d0..eef78ba2b 100644 --- a/src/adcp/protocols/mcp.py +++ b/src/adcp/protocols/mcp.py @@ -517,8 +517,7 @@ def _log_cleanup_error(self, exc: BaseException, context: str) -> None: and ("cancel scope" in exc_str or "async context" in exc_str) ) or ( # HTTP errors during cleanup (if httpx is available) - HTTPX_AVAILABLE - and isinstance(exc, _ALL_HTTP_STATUS_ERROR_TYPES) + HTTPX_AVAILABLE and isinstance(exc, _ALL_HTTP_STATUS_ERROR_TYPES) ) if is_known_cleanup_error: @@ -985,6 +984,12 @@ async def get_media_buy_delivery(self, params: dict[str, Any]) -> TaskResult[Any """Get media buy delivery.""" return await self._call_mcp_tool("get_media_buy_delivery", params) + async def get_reporting_status(self, params: dict[str, Any]) -> TaskResult[Any]: + return await self._call_mcp_tool("get_reporting_status", params) + + async def sync_reporting_receipts(self, params: dict[str, Any]) -> TaskResult[Any]: + return await self._call_mcp_tool("sync_reporting_receipts", params) + async def get_media_buys(self, params: dict[str, Any]) -> TaskResult[Any]: """Get media buys with status, creative approval state, and optional delivery snapshots.""" return await self._call_mcp_tool("get_media_buys", params) diff --git a/src/adcp/reporting.py b/src/adcp/reporting.py new file mode 100644 index 000000000..1100b3970 --- /dev/null +++ b/src/adcp/reporting.py @@ -0,0 +1,638 @@ +"""Reliable AdCP reporting-ledger reconciliation. + +The wire schemas describe facts. This module turns those facts into the +operational guarantee buyers care about: a closed, retained reporting scope +whose expected periods, current revisions, destination materializations, and +consumer receipts all agree. +""" + +from __future__ import annotations + +import json +from collections.abc import Awaitable, Callable +from dataclasses import dataclass, field +from datetime import datetime, timezone +from typing import Protocol, TypeVar +from uuid import uuid4 + +from pydantic import BaseModel + +from adcp.types import ( + GetReportingStatusRequest, + GetReportingStatusResponse, + ReportingCanonicalContentDigest, + ReportingControlTotal, + ReportingMaterialization, + ReportingObligation, + ReportingReceipt, + ReportingRevision, + SyncReportingReceiptsRequest, + SyncReportingReceiptsResponse, +) +from adcp.types.core import TaskResult + + +class ReportingReconciliationClient(Protocol): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: ... + + async def sync_reporting_receipts( + self, request: SyncReportingReceiptsRequest + ) -> TaskResult[SyncReportingReceiptsResponse]: ... + + +class ReportingCheckpointStore(Protocol): + async def get(self, reporting_materialization_id: str) -> ReportingReceipt | None: ... + + async def put(self, receipt: ReportingReceipt) -> None: ... + + +class ReportingReconciliationError(RuntimeError): + def __init__(self, code: str, message: str) -> None: + super().__init__(message) + self.code = code + + +@dataclass(frozen=True) +class ExpectedReportingPeriod: + delivery_config_id: str + delivery_config_version: int + period_start: str + period_end: str + + +@dataclass(frozen=True) +class ReportingObservation: + row_count: int + control_totals: list[ReportingControlTotal] + canonical_content_digest: ReportingCanonicalContentDigest | None = None + manifest_sha256: str | None = None + native_version_ref: str | None = None + consumer_commit_ref: str | None = None + + +@dataclass(frozen=True) +class ReportingInspectionContext: + obligation: ReportingObligation + revision: ReportingRevision + materialization: ReportingMaterialization + + +@dataclass +class ReportingLedger: + ledger_snapshot_id: str + ledger_as_of: datetime + account_id: str + scope: BaseModel + obligations: list[ReportingObligation] + revisions: list[ReportingRevision] + materializations: list[ReportingMaterialization] + receipts: list[ReportingReceipt] + + +@dataclass(frozen=True) +class ObligationReconciliation: + reporting_obligation_id: str + definitive: bool + reporting_revision_id: str | None = None + reporting_materialization_id: str | None = None + reasons: tuple[str, ...] = () + + +@dataclass +class ReportingReconciliationResult: + definitive: bool + ledger: ReportingLedger + obligations: list[ObligationReconciliation] + missing_expected_periods: list[ExpectedReportingPeriod] + submitted_receipts: list[ReportingReceipt] = field(default_factory=list) + totals_by_revision: list[tuple[str, int, list[ReportingControlTotal]]] = field( + default_factory=list + ) + + +def _json(value: object) -> str: + if isinstance(value, BaseModel): + value = value.model_dump(mode="json", exclude_none=True) + return json.dumps(value, sort_keys=True, separators=(",", ":"), default=str) + + +def _enum(value: object) -> str: + return str(getattr(value, "value", value)) + + +def _iso(value: str) -> str: + return datetime.fromisoformat(value.replace("Z", "+00:00")).isoformat() + + +def _totals(value: list[ReportingControlTotal]) -> str: + return _json( + sorted((item.model_dump(mode="json") for item in value), key=lambda item: item["name"]) + ) + + +_RecordT = TypeVar("_RecordT") + + +def _add_immutable( + target: dict[str, _RecordT], identifier: str, value: _RecordT, kind: str +) -> None: + previous = target.get(identifier) + if previous is not None and _json(previous) != _json(value): + raise ReportingReconciliationError( + "IMMUTABLE_RECORD_CHANGED", f"{kind} {identifier} changed within one ledger snapshot" + ) + target[identifier] = value + + +async def load_reporting_ledger( + client: ReportingReconciliationClient, + request: GetReportingStatusRequest, + *, + max_snapshot_restarts: int = 2, +) -> ReportingLedger: + """Exhaust a stable periods cursor and verify its declared record count.""" + + base = request.model_dump(mode="json", exclude_none=True) + base["view"] = "periods" + base.pop("pagination", None) + for restart in range(max_snapshot_restarts + 1): + try: + obligations: dict[str, ReportingObligation] = {} + revisions: dict[str, ReportingRevision] = {} + materializations: dict[str, ReportingMaterialization] = {} + receipts: dict[str, ReportingReceipt] = {} + cursor: str | None = None + seen_cursors: set[str] = set() + snapshot_id: str | None = None + ledger_as_of: datetime | None = None + account_id: str | None = None + scope: BaseModel | None = None + total_count: int | None = None + + while True: + payload = dict(base) + if cursor: + payload["pagination"] = {"cursor": cursor} + result = await client.get_reporting_status( + GetReportingStatusRequest.model_validate(payload) + ) + response = result.data + if not result.success or response is None or _enum(response.view) != "periods": + raise ReportingReconciliationError( + "STATUS_READ_FAILED", + "get_reporting_status did not return a completed periods view", + ) + pagination = response.pagination + if ( + not response.ledger_snapshot_id + or not response.ledger_as_of + or not response.account_id + or not response.scope + or pagination is None + ): + raise ReportingReconciliationError( + "INCOMPLETE_LEDGER_PAGE", "get_reporting_status omitted ledger metadata" + ) + if snapshot_id and snapshot_id != response.ledger_snapshot_id: + raise ReportingReconciliationError("SNAPSHOT_CHANGED", "snapshot changed") + if ledger_as_of and ledger_as_of != response.ledger_as_of: + raise ReportingReconciliationError( + "SNAPSHOT_CHANGED", "ledger boundary changed" + ) + if account_id and account_id != response.account_id: + raise ReportingReconciliationError("SNAPSHOT_CHANGED", "account changed") + if scope and _json(scope) != _json(response.scope): + raise ReportingReconciliationError("SNAPSHOT_CHANGED", "denominator changed") + if total_count is not None and total_count != pagination.total_count: + raise ReportingReconciliationError("SNAPSHOT_CHANGED", "record total changed") + + snapshot_id = response.ledger_snapshot_id + ledger_as_of = response.ledger_as_of + account_id = response.account_id + scope = response.scope + total_count = pagination.total_count + for obligation in response.periods or []: + _add_immutable( + obligations, + obligation.reporting_obligation_id, + obligation, + "obligation", + ) + for revision in response.revisions or []: + _add_immutable(revisions, revision.reporting_revision_id, revision, "revision") + for materialization in response.materializations or []: + _add_immutable( + materializations, + materialization.reporting_materialization_id, + materialization, + "materialization", + ) + for receipt in response.receipts or []: + _add_immutable(receipts, receipt.reporting_receipt_id, receipt, "receipt") + + if not pagination.has_more: + break + cursor = pagination.cursor + if not cursor or cursor in seen_cursors: + raise ReportingReconciliationError( + "CURSOR_LOOP", "ledger pagination did not advance" + ) + seen_cursors.add(cursor) + + count = len(obligations) + len(revisions) + len(materializations) + len(receipts) + if total_count is not None and total_count != count: + raise ReportingReconciliationError( + "LEDGER_COUNT_MISMATCH", + f"ledger declared {total_count} records but returned {count}", + ) + if not snapshot_id or not ledger_as_of or not account_id or not scope: + raise ReportingReconciliationError( + "EMPTY_LEDGER_RESPONSE", "get_reporting_status returned no ledger page" + ) + return ReportingLedger( + snapshot_id, + ledger_as_of, + account_id, + scope, + list(obligations.values()), + list(revisions.values()), + list(materializations.values()), + list(receipts.values()), + ) + except ReportingReconciliationError as error: + if error.code != "SNAPSHOT_CHANGED" or restart == max_snapshot_restarts: + raise + raise ReportingReconciliationError("SNAPSHOT_CHANGED", "ledger never stabilized") + + +def _select_current( + obligation: ReportingObligation, ledger: ReportingLedger +) -> tuple[ReportingRevision | None, ReportingMaterialization | None, list[str]]: + reasons: list[str] = [] + attempts = [ + item + for item in ledger.materializations + if item.reporting_obligation_id == obligation.reporting_obligation_id + ] + revision_ids = {item.reporting_revision_id for item in attempts} + candidates = [item for item in ledger.revisions if item.reporting_revision_id in revision_ids] + receipts = [ + item + for item in ledger.receipts + if item.reporting_obligation_id == obligation.reporting_obligation_id + ] + successful_attempts = [ + item for item in attempts if _enum(item.status) in {"available", "delivered"} + ] + accepted_receipts = [item for item in receipts if _enum(item.status) == "accepted"] + if ( + len(candidates) != obligation.revision_count + or len(attempts) != obligation.materialization_count + or len(successful_attempts) != obligation.successful_materialization_count + or len(receipts) != obligation.receipt_count + or len(accepted_receipts) != obligation.accepted_receipt_count + ): + reasons.append("ASSOCIATED_HISTORY_INCOMPLETE") + superseded = { + item.supersedes_reporting_revision_id + for item in candidates + if item.supersedes_reporting_revision_id + } + current = [item for item in candidates if item.reporting_revision_id not in superseded] + if len(current) != 1: + reasons.append("MISSING_CURRENT_REVISION" if not current else "AMBIGUOUS_REVISION_CHAIN") + return None, None, reasons + revision = current[0] + if ( + revision.account_id != obligation.account_id + or revision.report_definition_id != obligation.report_definition_id + or revision.reporting_profile != obligation.reporting_profile + or _json(revision.period) != _json(obligation.period) + ): + reasons.append("REVISION_SCOPE_MISMATCH") + if _enum(obligation.required_finality) == "official" and _enum(revision.finality) != "official": + reasons.append("FINALITY_NOT_MET") + + successful = sorted( + ( + item + for item in successful_attempts + if item.reporting_revision_id == revision.reporting_revision_id + ), + key=lambda item: item.attempt, + reverse=True, + ) + materialization = successful[0] if successful else None + if not materialization or not materialization.verification or not materialization.resource: + reasons.append("MISSING_VERIFIED_MATERIALIZATION") + return revision, materialization, reasons + if ( + materialization.delivery_config_id != obligation.delivery_config_id + or materialization.delivery_config_version != obligation.delivery_config_version + or materialization.destination_ref != obligation.destination_ref + or _enum(materialization.feed_purpose) != _enum(obligation.feed_purpose) + ): + reasons.append("MATERIALIZATION_SCOPE_MISMATCH") + if materialization.verification.row_count != revision.row_count or _totals( + materialization.verification.control_totals + ) != _totals(revision.control_totals): + reasons.append("PRODUCER_CONTROL_TOTAL_MISMATCH") + if _enum(materialization.verification.verification_profile) == "canonical_digest" and ( + not revision.canonical_content_digest + or _json(materialization.verification.canonical_content_digest) + != _json(revision.canonical_content_digest) + ): + reasons.append("PRODUCER_DIGEST_MISMATCH") + if _enum(materialization.verification.verification_profile) == "native_commit": + evidence = materialization.verification.native_commit_evidence + if ( + not evidence + or not materialization.resource.native_version_ref + or evidence.native_version_ref != materialization.resource.native_version_ref + or _enum(evidence.observed_through) + != _enum(materialization.verification.verification_path) + ): + reasons.append("PRODUCER_NATIVE_EVIDENCE_MISMATCH") + if _enum(materialization.verification.verification_profile) == "manifest_checksums" and ( + _enum(materialization.resource.kind) != "manifest" + or materialization.resource.manifest_version != "1.0" + or not materialization.resource.manifest_sha256 + or not materialization.verification.physical_checksums + ): + reasons.append("PRODUCER_MANIFEST_EVIDENCE_MISSING") + return revision, materialization, reasons + + +def _receipt_matches( + receipt: ReportingReceipt, + revision: ReportingRevision, + materialization: ReportingMaterialization, +) -> bool: + verification = materialization.verification + resource = materialization.resource + if not verification or not resource or _enum(receipt.status) != "accepted": + return False + if ( + receipt.reporting_obligation_id != materialization.reporting_obligation_id + or receipt.reporting_revision_id != revision.reporting_revision_id + or receipt.reporting_materialization_id != materialization.reporting_materialization_id + or _enum(receipt.verification_profile) != _enum(verification.verification_profile) + or receipt.observed_row_count != revision.row_count + or _totals(receipt.observed_control_totals) != _totals(revision.control_totals) + ): + return False + profile = _enum(receipt.verification_profile) + if profile == "canonical_digest": + return bool( + revision.canonical_content_digest + and receipt.observed_canonical_content_digest + and _json(receipt.observed_canonical_content_digest) + == _json(revision.canonical_content_digest) + ) + if profile == "manifest_checksums": + return bool( + resource.manifest_sha256 + and receipt.observed_manifest_sha256 == resource.manifest_sha256 + ) + return bool( + resource.native_version_ref + and getattr(receipt, "observed_native_version_ref", None) == resource.native_version_ref + ) + + +def build_reporting_receipt( + context: ReportingInspectionContext, + observation: ReportingObservation, + *, + reporting_receipt_id: str | None = None, + observed_at: datetime | None = None, +) -> ReportingReceipt: + materialization = context.materialization + revision = context.revision + if not materialization.verification or not materialization.resource: + raise ReportingReconciliationError( + "MATERIALIZATION_NOT_READY", "cannot receipt an unverified materialization" + ) + failures: list[str] = [] + if observation.row_count != revision.row_count: + failures.append("ROW_COUNT_MISMATCH") + if _totals(observation.control_totals) != _totals(revision.control_totals): + failures.append("CONTROL_TOTAL_MISMATCH") + profile = _enum(materialization.verification.verification_profile) + if profile == "canonical_digest" and ( + not revision.canonical_content_digest + or _json(observation.canonical_content_digest) != _json(revision.canonical_content_digest) + ): + failures.append("CANONICAL_DIGEST_MISMATCH") + if ( + profile == "manifest_checksums" + and observation.manifest_sha256 != materialization.resource.manifest_sha256 + ): + failures.append("MANIFEST_DIGEST_MISMATCH") + if ( + profile == "native_commit" + and observation.native_version_ref != materialization.resource.native_version_ref + ): + failures.append("NATIVE_VERSION_MISMATCH") + payload: dict[str, object] = { + "reporting_receipt_id": reporting_receipt_id or f"reporting-receipt:{uuid4()}", + "reporting_obligation_id": context.obligation.reporting_obligation_id, + "reporting_revision_id": revision.reporting_revision_id, + "reporting_materialization_id": materialization.reporting_materialization_id, + "status": "rejected" if failures else "accepted", + "verification_profile": profile, + "observed_row_count": observation.row_count, + "observed_control_totals": observation.control_totals, + "observed_at": observed_at or datetime.now(timezone.utc), + } + if observation.canonical_content_digest: + payload["observed_canonical_content_digest"] = observation.canonical_content_digest + if observation.manifest_sha256: + payload["observed_manifest_sha256"] = observation.manifest_sha256 + if observation.native_version_ref: + payload["observed_native_version_ref"] = observation.native_version_ref + if observation.consumer_commit_ref: + payload["consumer_commit_ref"] = observation.consumer_commit_ref + if failures: + payload["rejection_codes"] = failures + return ReportingReceipt.model_validate(payload) + + +def evaluate_reporting_ledger( + ledger: ReportingLedger, + *, + expected_periods: list[ExpectedReportingPeriod] | None = None, + now: datetime | None = None, +) -> ReportingReconciliationResult: + now = now or datetime.now(timezone.utc) + outcomes: list[ObligationReconciliation] = [] + unique_revisions: dict[str, ReportingRevision] = {} + for obligation in ledger.obligations: + revision, materialization, reasons = _select_current(obligation, ledger) + if _enum(obligation.health) != "complete": + reasons.append(f"OBLIGATION_{_enum(obligation.health).upper()}") + if ( + materialization + and materialization.resource + and materialization.resource.expires_at <= now + ): + reasons.append("RESOURCE_EXPIRED") + if revision: + unique_revisions[revision.reporting_revision_id] = revision + if ( + _enum(obligation.reconciliation_mode) == "consumer_receipt" + and revision + and materialization + and not any( + _receipt_matches(receipt, revision, materialization) for receipt in ledger.receipts + ) + ): + reasons.append("MISSING_MATCHING_CONSUMER_RECEIPT") + outcomes.append( + ObligationReconciliation( + obligation.reporting_obligation_id, + not reasons, + revision.reporting_revision_id if revision else None, + materialization.reporting_materialization_id if materialization else None, + tuple(reasons), + ) + ) + + actual = { + ( + item.delivery_config_id, + item.delivery_config_version, + item.period.start.isoformat(), + item.period.end.isoformat(), + ) + for item in ledger.obligations + } + missing = [ + item + for item in expected_periods or [] + if ( + item.delivery_config_id, + item.delivery_config_version, + _iso(item.period_start), + _iso(item.period_end), + ) + not in actual + ] + definitive = bool( + expected_periods is not None + and bool(getattr(ledger.scope, "scope_closed", False)) + and bool(getattr(ledger.scope, "coverage_complete", False)) + and not missing + and all(item.definitive for item in outcomes) + ) + return ReportingReconciliationResult( + definitive, + ledger, + outcomes, + missing, + totals_by_revision=[ + (item.reporting_revision_id, item.row_count, item.control_totals) + for item in unique_revisions.values() + ], + ) + + +async def reconcile_reporting( + client: ReportingReconciliationClient, + request: GetReportingStatusRequest, + inspect: Callable[[ReportingInspectionContext], Awaitable[ReportingObservation]], + *, + expected_periods: list[ExpectedReportingPeriod], + checkpoint_store: ReportingCheckpointStore | None = None, + max_snapshot_restarts: int = 2, + max_inspection_attempts: int = 3, + now: datetime | None = None, +) -> ReportingReconciliationResult: + """Reconcile a closed ledger, persist observations, and submit receipts.""" + + ledger = await load_reporting_ledger( + client, request, max_snapshot_restarts=max_snapshot_restarts + ) + submitted: list[ReportingReceipt] = [] + for obligation in ledger.obligations: + if _enum(obligation.reconciliation_mode) != "consumer_receipt": + continue + revision, materialization, reasons = _select_current(obligation, ledger) + if not revision or not materialization or reasons: + continue + if any(_receipt_matches(item, revision, materialization) for item in ledger.receipts): + continue + receipt = ( + await checkpoint_store.get(materialization.reporting_materialization_id) + if checkpoint_store + else None + ) + if not receipt or receipt.reporting_revision_id != revision.reporting_revision_id: + last_error: Exception | None = None + observation = None + for _ in range(max_inspection_attempts): + try: + observation = await inspect( + ReportingInspectionContext(obligation, revision, materialization) + ) + break + except Exception as error: # destination SDKs define their own transient errors + last_error = error + if observation is None: + raise ReportingReconciliationError( + "INSPECTION_FAILED", + "materialization inspection failed after " + f"{max_inspection_attempts} attempts: {last_error}", + ) + receipt = build_reporting_receipt( + ReportingInspectionContext(obligation, revision, materialization), observation + ) + if checkpoint_store: + await checkpoint_store.put(receipt) + submitted.append(receipt) + + if submitted: + write = await client.sync_reporting_receipts( + SyncReportingReceiptsRequest.model_validate( + { + "account": request.account, + "idempotency_key": str(uuid4()), + "receipts": submitted, + } + ) + ) + if not write.success or write.data is None: + raise ReportingReconciliationError( + "RECEIPT_WRITE_FAILED", "seller did not record reporting receipts" + ) + failed = [item for item in write.data.results if _enum(item.result) == "failed"] + if failed: + raise ReportingReconciliationError( + "RECEIPT_WRITE_FAILED", f"{len(failed)} reporting receipt(s) failed" + ) + ledger = await load_reporting_ledger( + client, request, max_snapshot_restarts=max_snapshot_restarts + ) + + result = evaluate_reporting_ledger(ledger, expected_periods=expected_periods, now=now) + result.submitted_receipts = submitted + return result + + +__all__ = [ + "ExpectedReportingPeriod", + "ObligationReconciliation", + "ReportingCheckpointStore", + "ReportingInspectionContext", + "ReportingLedger", + "ReportingObservation", + "ReportingReconciliationClient", + "ReportingReconciliationError", + "ReportingReconciliationResult", + "build_reporting_receipt", + "evaluate_reporting_ledger", + "load_reporting_ledger", + "reconcile_reporting", +] diff --git a/src/adcp/types/__init__.py b/src/adcp/types/__init__.py index 7027d5da1..62a2aef67 100644 --- a/src/adcp/types/__init__.py +++ b/src/adcp/types/__init__.py @@ -139,9 +139,17 @@ "ReportUsageRequest", "ReportUsageResponse", "ReportingBucket", + "ReportingCanonicalContentDigest", + "ReportingControlTotal", + "ReportingMaterialization", + "ReportingObligation", + "ReportingReceipt", + "ReportingRevision", "Setup", "SyncAccountsRequest", "SyncAccountsResponse", + "SyncReportingReceiptsRequest", + "SyncReportingReceiptsResponse", # Request/Response types "ActivateSignalRequest", "ActivateSignalResponse", @@ -161,6 +169,8 @@ "GetMediaBuysResponse", "GetProductsRequest", "GetProductsResponse", + "GetReportingStatusRequest", + "GetReportingStatusResponse", "GetSignalsRequest", "GetSignalsResponse", "DownstreamConnectionRequirement", @@ -1458,6 +1468,8 @@ def __dir__() -> list[str]: GetProductsWorkingResponse, GetPropertyListRequest, GetPropertyListResponse, + GetReportingStatusRequest, + GetReportingStatusResponse, GetRightsErrorResponse, GetRightsRequest, GetRightsResponse, @@ -1733,9 +1745,15 @@ def __dir__() -> list[str]: Renders, RepeatableAssetGroup, ReportingBucket, + ReportingCanonicalContentDigest, ReportingCapabilities, + ReportingControlTotal, ReportingFrequency, + ReportingMaterialization, + ReportingObligation, ReportingPeriod, + ReportingReceipt, + ReportingRevision, ReportingWebhook, ReportingWebhookAuthentication, ReportPlanAdjustmentRequest, @@ -1849,6 +1867,8 @@ def __dir__() -> list[str]: SyncGovernanceResponse, SyncPlansRequest, SyncPlansResponse, + SyncReportingReceiptsRequest, + SyncReportingReceiptsResponse, Tags, TargetingOverlay, TaskResult, diff --git a/src/adcp/types/_eager.py b/src/adcp/types/_eager.py index da54678bd..afbb8f944 100644 --- a/src/adcp/types/_eager.py +++ b/src/adcp/types/_eager.py @@ -220,6 +220,8 @@ GetPlanAuditLogsResponse, GetPropertyListRequest, GetPropertyListResponse, + GetReportingStatusRequest, + GetReportingStatusResponse, GetRightsRequest, GetRightsResponse, GetSignalsRequest, @@ -334,9 +336,15 @@ RegistryAcceptancePolicyProfileReference, Renders, ReportingBucket, + ReportingCanonicalContentDigest, ReportingCapabilities, + ReportingControlTotal, ReportingFrequency, + ReportingMaterialization, + ReportingObligation, ReportingPeriod, + ReportingReceipt, + ReportingRevision, ReportingWebhook, ReportPlanAdjustmentRequest, ReportPlanAdjustmentResponse, @@ -401,6 +409,8 @@ SyncGovernanceResponse, SyncPlansRequest, SyncPlansResponse, + SyncReportingReceiptsRequest, + SyncReportingReceiptsResponse, Tags, TargetingOverlay, TaskType, @@ -1388,6 +1398,8 @@ def __init__(self, *args: object, **kwargs: object) -> None: "GetMediaBuysMediaBuy", "GetMediaBuysRequest", "GetMediaBuysResponse", + "GetReportingStatusRequest", + "GetReportingStatusResponse", "GetPlanAuditLogsRequest", "GetPlanAuditLogsResponse", "GetProductsBriefRequest", @@ -1660,9 +1672,15 @@ def __init__(self, *args: object, **kwargs: object) -> None: "ReportUsageRequest", "ReportUsageResponse", "ReportingBucket", + "ReportingCanonicalContentDigest", "ReportingCapabilities", + "ReportingControlTotal", "ReportingFrequency", + "ReportingMaterialization", + "ReportingObligation", "ReportingPeriod", + "ReportingReceipt", + "ReportingRevision", "ReportingWebhook", "ReportingWebhookAuthentication", "Request", @@ -1747,6 +1765,8 @@ def __init__(self, *args: object, **kwargs: object) -> None: "SyncCreativesResponse", "SyncCreativesResponse1", "SyncCreativesResponse3", + "SyncReportingReceiptsRequest", + "SyncReportingReceiptsResponse", "SyncCreativesSubmittedResponse", "SyncCreativesSuccessResponse", "SyncEventSourcesErrorResponse", diff --git a/src/adcp/types/generated_poc/a2ui/si_catalog.py b/src/adcp/types/generated_poc/a2ui/si_catalog.py index 03326be01..56464ac5b 100644 --- a/src/adcp/types/generated_poc/a2ui/si_catalog.py +++ b/src/adcp/types/generated_poc/a2ui/si_catalog.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: a2ui/si_catalog.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -82,7 +82,7 @@ class Image(AdCPBaseModel): height: Annotated[int | None, Field(description='Image height in pixels')] = None -class Action19(AdCPBaseModel): +class Action21(AdCPBaseModel): name: str context: dict[str, bound_value.A2UiBoundValue] | None = None @@ -96,7 +96,7 @@ class Card(AdCPBaseModel): badge: Annotated[ bound_value.A2UiBoundValue | None, Field(description="Badge text (e.g., 'New', 'Sale')") ] = None - action: Annotated[Action19 | None, Field(description='Action to trigger on card click')] = None + action: Annotated[Action21 | None, Field(description='Action to trigger on card click')] = None children: Annotated[list[str] | None, Field(description='Child component IDs')] = None @@ -115,7 +115,7 @@ class ProductCard(AdCPBaseModel): ctaLabel: Annotated[ bound_value.A2UiBoundValue | None, Field(description='CTA button label') ] = None - action: Action19 | None = None + action: Action21 | None = None class Template(AdCPBaseModel): diff --git a/src/adcp/types/generated_poc/account/sync_accounts_request.py b/src/adcp/types/generated_poc/account/sync_accounts_request.py index 46d671cae..ca4fa6f82 100644 --- a/src/adcp/types/generated_poc/account/sync_accounts_request.py +++ b/src/adcp/types/generated_poc/account/sync_accounts_request.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: account/sync_accounts_request.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -16,6 +16,7 @@ from ..core import operator_identity as operator_identity_1 from ..core import operator_unit as operator_unit_1 from ..core import push_notification_config as push_notification_config_1 +from ..core import reporting_delivery_config from ..core.version_envelope import AdcpVersionEnvelope from ..enums import billing_party, cloud_storage_protocol from ..enums import payment_terms as payment_terms_1 @@ -113,6 +114,13 @@ class Accounts(AdCPBaseModel): 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'." ), ] = None + reporting_delivery_configs: Annotated[ + list[reporting_delivery_config.ReportingDeliveryConfiguration] | None, + Field( + description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller/account-bound seller-issued destination_ref. Unknown, unauthorized, cross-account, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + max_length=16, + ), + ] = None notification_configs: Annotated[ list[notification_config.NotificationConfig] | None, Field( @@ -214,6 +222,13 @@ class Accounts1(AdCPBaseModel): 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'." ), ] = None + reporting_delivery_configs: Annotated[ + list[reporting_delivery_config.ReportingDeliveryConfiguration] | None, + Field( + description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller/account-bound seller-issued destination_ref. Unknown, unauthorized, cross-account, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + max_length=16, + ), + ] = None notification_configs: Annotated[ list[notification_config.NotificationConfig] | None, Field( diff --git a/src/adcp/types/generated_poc/account/sync_accounts_response.py b/src/adcp/types/generated_poc/account/sync_accounts_response.py index 65a71a2d8..f8f28c406 100644 --- a/src/adcp/types/generated_poc/account/sync_accounts_response.py +++ b/src/adcp/types/generated_poc/account/sync_accounts_response.py @@ -19,6 +19,7 @@ from ..core import ext as ext_1 from ..core import notification_config as notification_config_1 from ..core import operator_unit as operator_unit_1 +from ..core import reporting_delivery_config_state as reporting_delivery_config_state_1 from ..enums import account_scope as account_scope_1 from ..enums import billing_party as billing_party_1 from ..enums import payment_terms as payment_terms_1 @@ -63,6 +64,7 @@ class Account(AdcpVersionEnvelope): warnings: list[str] | None = None sandbox: bool | None = None notification_configs: Annotated[list[notification_config_1.NotificationConfig], Field(max_length=16)] | None = None + reporting_delivery_configs: Annotated[list[reporting_delivery_config_state_1.ReportingDeliveryConfigurationState], Field(max_length=16)] | None = None authorization: account_authorization_1.AccountAuthorization | None = None diff --git a/src/adcp/types/generated_poc/core/agent_configuration_state.py b/src/adcp/types/generated_poc/core/agent_configuration_state.py new file mode 100644 index 000000000..af8c7fc67 --- /dev/null +++ b/src/adcp/types/generated_poc/core/agent_configuration_state.py @@ -0,0 +1,32 @@ +# generated by datamodel-codegen: +# filename: core/agent_configuration_state.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from . import agent_notification_config_state, agent_reporting_destination_state + + +class AgentConfigurationState(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + notification_configs: Annotated[ + list[agent_notification_config_state.AgentNotificationConfigState], + Field( + description='Current agent-level webhook subscribers. authentication.credentials is always omitted because it is write-only.', + max_length=16, + ), + ] + reporting_destinations: Annotated[ + list[agent_reporting_destination_state.AgentReportingDestinationState], + Field( + description='Current reusable reporting destination bindings and setup states. destination_id and destination_ref values MUST each be unique within this caller-scoped array.', + max_length=64, + ), + ] diff --git a/src/adcp/types/generated_poc/core/agent_notification_config_state.py b/src/adcp/types/generated_poc/core/agent_notification_config_state.py new file mode 100644 index 000000000..a54f32061 --- /dev/null +++ b/src/adcp/types/generated_poc/core/agent_notification_config_state.py @@ -0,0 +1,34 @@ +# generated by datamodel-codegen: +# filename: core/agent_notification_config_state.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AnyUrl, ConfigDict, Field + +from ..enums import auth_scheme +from . import ext as ext_1 + + +class Authentication(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + schemes: Annotated[list[auth_scheme.AuthenticationScheme], Field(max_length=1, min_length=1)] + + +class AgentNotificationConfigState(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + subscriber_id: Annotated[ + str, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$') + ] + url: AnyUrl + event_types: Annotated[list[Literal['capabilities.changed']], Field(min_length=1)] + authentication: Annotated[Authentication | None, Field(deprecated=True)] = None + active: bool | None = True + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/core/agent_reporting_destination.py b/src/adcp/types/generated_poc/core/agent_reporting_destination.py new file mode 100644 index 000000000..dde97c5a2 --- /dev/null +++ b/src/adcp/types/generated_poc/core/agent_reporting_destination.py @@ -0,0 +1,227 @@ +# generated by datamodel-codegen: +# filename: core/agent_reporting_destination.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Any, Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + +from . import delivery_provider, delivery_recipient, reporting_verification_profile_set + + +class Pattern(StrEnum): + file_transfer = 'file_transfer' + warehouse_materialization = 'warehouse_materialization' + dataset_share = 'dataset_share' + + +class AcceptedFormat(StrEnum): + jsonl = 'jsonl' + csv = 'csv' + parquet = 'parquet' + avro = 'avro' + orc = 'orc' + + +class AgentReportingDestination1(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + pattern: Literal['file_transfer'] = 'file_transfer' + destination_id: Annotated[ + str, + Field( + description='Caller-selected stable key, unique within this seller relationship. Reusing it replaces desired configuration.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + active: Annotated[ + bool, + Field( + description='Whether new account-level delivery configurations may use this destination. False does not delete caller-owned data.' + ), + ] + provider: delivery_provider.DeliveryProvider + transport: Annotated[ + str, + Field( + description='Open provider transport name, such as s3, bigquery, delta_sharing, or snowflake_secure_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + location: Annotated[ + str, + Field( + description='Provider-native bucket/prefix, project/dataset, database/schema, catalog/schema, or equivalent locator. Never a credential or signed URL.', + max_length=2048, + min_length=1, + pattern='^(?![A-Za-z][A-Za-z0-9+.-]*://[^/\\s]*@)(?!.*\\?)[^\\r\\n]+$', + ), + ] + accepted_formats: Annotated[ + list[AcceptedFormat], + Field( + description='Physical formats accepted by a file-transfer destination.', min_length=1 + ), + ] + access_mode: Annotated[ + str | None, + Field( + description='Dataset-share access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] = None + recipient: delivery_recipient.DeliveryRecipient | None = None + accepted_verification_profiles: ( + reporting_verification_profile_set.ReportingVerificationProfileSet + ) + + +class AgentReportingDestination2(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + pattern: Literal['warehouse_materialization'] = 'warehouse_materialization' + destination_id: Annotated[ + str, + Field( + description='Caller-selected stable key, unique within this seller relationship. Reusing it replaces desired configuration.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + active: Annotated[ + bool, + Field( + description='Whether new account-level delivery configurations may use this destination. False does not delete caller-owned data.' + ), + ] + provider: delivery_provider.DeliveryProvider + transport: Annotated[ + str, + Field( + description='Open provider transport name, such as s3, bigquery, delta_sharing, or snowflake_secure_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + location: Annotated[ + str, + Field( + description='Provider-native bucket/prefix, project/dataset, database/schema, catalog/schema, or equivalent locator. Never a credential or signed URL.', + max_length=2048, + min_length=1, + pattern='^(?![A-Za-z][A-Za-z0-9+.-]*://[^/\\s]*@)(?!.*\\?)[^\\r\\n]+$', + ), + ] + accepted_formats: Annotated[ + list[AcceptedFormat] | None, + Field( + description='Physical formats accepted by a file-transfer destination.', min_length=1 + ), + ] = None + access_mode: Annotated[ + str | None, + Field( + description='Dataset-share access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] = None + recipient: delivery_recipient.DeliveryRecipient | None = None + accepted_verification_profiles: ( + reporting_verification_profile_set.ReportingVerificationProfileSet + ) + + +class AgentReportingDestination3(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + pattern: Literal['dataset_share'] = 'dataset_share' + destination_id: Annotated[ + str, + Field( + description='Caller-selected stable key, unique within this seller relationship. Reusing it replaces desired configuration.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + active: Annotated[ + bool, + Field( + description='Whether new account-level delivery configurations may use this destination. False does not delete caller-owned data.' + ), + ] + provider: delivery_provider.DeliveryProvider + transport: Annotated[ + str, + Field( + description='Open provider transport name, such as s3, bigquery, delta_sharing, or snowflake_secure_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + location: Annotated[ + str | None, + Field( + description='Provider-native bucket/prefix, project/dataset, database/schema, catalog/schema, or equivalent locator. Never a credential or signed URL.', + max_length=2048, + min_length=1, + pattern='^(?![A-Za-z][A-Za-z0-9+.-]*://[^/\\s]*@)(?!.*\\?)[^\\r\\n]+$', + ), + ] = None + accepted_formats: Annotated[ + list[AcceptedFormat] | None, + Field( + description='Physical formats accepted by a file-transfer destination.', min_length=1 + ), + ] = None + access_mode: Annotated[ + str, + Field( + description='Dataset-share access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + recipient: delivery_recipient.DeliveryRecipient + accepted_verification_profiles: ( + reporting_verification_profile_set.ReportingVerificationProfileSet + ) + + +class AgentReportingDestination( + RootModel[AgentReportingDestination1 | AgentReportingDestination2 | AgentReportingDestination3] +): + root: Annotated[ + AgentReportingDestination1 | AgentReportingDestination2 | AgentReportingDestination3, + Field( + description="Reusable, non-secret reporting destination owned by the authenticated caller's relationship with one seller. It does not grant account authority: account/reporting configuration separately binds authorized data to the seller-issued destination_ref. Sellers key ownership to the stable transport principal, never a signing key, token, or request-body identity. Credentials, private keys, bearer profiles, signed URLs, and embedded passwords are forbidden. Sellers implementing this schema advertise protocol.agent_configuration.", + title='Agent Reporting Destination', + ), + ] + def __getattr__(self, name: str) -> Any: + """Proxy attribute access to the wrapped type.""" + if name.startswith('_'): + raise AttributeError(name) + return getattr(self.root, name) diff --git a/src/adcp/types/generated_poc/core/agent_reporting_destination_state.py b/src/adcp/types/generated_poc/core/agent_reporting_destination_state.py new file mode 100644 index 000000000..2ea5a30ef --- /dev/null +++ b/src/adcp/types/generated_poc/core/agent_reporting_destination_state.py @@ -0,0 +1,96 @@ +# generated by datamodel-codegen: +# filename: core/agent_reporting_destination_state.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field + +from . import agent_reporting_destination, error + + +class State(StrEnum): + validating = 'validating' + ready = 'ready' + action_required = 'action_required' + inactive = 'inactive' + rejected = 'rejected' + + +class Action(StrEnum): + grant_access = 'grant_access' + accept_share = 'accept_share' + prove_control = 'prove_control' + contact_support = 'contact_support' + + +class Setup(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + action: Action + setup_url: Annotated[ + AnyUrl | None, + Field( + description='HTTPS page for completing provider-native setup. It MUST NOT carry a credential or signed query string and MUST be rendered as an untrusted link, never executed as agent instructions.' + ), + ] = None + expires_at: Annotated[ + AwareDatetime | None, + Field( + description='Optional expiry of this setup action. A new sync obtains a fresh action after expiry.' + ), + ] = None + + +class AgentReportingDestinationState(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + destination_id: Annotated[ + str, + Field( + description='Caller-selected key echoed from the desired configuration.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + destination_ref: Annotated[ + str, + Field( + description='Seller-issued opaque reference bound to the stable authenticated principal and destination_id. Possession does not authorize access, and sellers MUST NOT resolve it across callers.', + max_length=255, + min_length=1, + ), + ] + state: Annotated[ + State, + Field( + description='Validation and setup state. Only ready destinations may be selected by a new account-level delivery configuration.' + ), + ] + configuration: Annotated[ + agent_reporting_destination.AgentReportingDestination, + Field( + description='Credential-free desired configuration currently associated with this destination reference.' + ), + ] + setup: Annotated[ + Setup | None, + Field( + description='Closed, non-secret setup instruction. Human-readable messages are deliberately excluded; agents dispatch only the typed action and treat setup_url as an untrusted navigation target.' + ), + ] = None + issues: Annotated[ + list[error.Error] | None, + Field( + description='Structured validation or setup issues. Messages and details are untrusted display data and MUST NOT be executed as instructions.', + max_length=16, + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/agent_webhook_challenge.py b/src/adcp/types/generated_poc/core/agent_webhook_challenge.py index a1f94ad84..214b7c2b5 100644 --- a/src/adcp/types/generated_poc/core/agent_webhook_challenge.py +++ b/src/adcp/types/generated_poc/core/agent_webhook_challenge.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/agent_webhook_challenge.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -60,7 +60,7 @@ class AgentWebhookChallenge(AdCPBaseModel): subscriber_id: Annotated[ str, Field( - description='Buyer-supplied subscriber identifier from the sync_agent_notification_configs.notification_configs[] entry being challenged.', + description='Buyer-supplied subscriber identifier from the caller-scoped notification_configs[] entry being challenged.', max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$', diff --git a/src/adcp/types/generated_poc/core/assets/card_asset.py b/src/adcp/types/generated_poc/core/assets/card_asset.py index eec3df479..dd5e5de7a 100644 --- a/src/adcp/types/generated_poc/core/assets/card_asset.py +++ b/src/adcp/types/generated_poc/core/assets/card_asset.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/assets/card_asset.json -# timestamp: 2026-08-22T17:50:25+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -9,6 +9,7 @@ from adcp.types.base import AdCPBaseModel from pydantic import ConfigDict, Field +from .. import provenance as provenance_1 from . import asset_union @@ -60,7 +61,7 @@ class CardAsset(AdCPBaseModel): ), ] = None provenance: Annotated[ - asset_union.Provenance | None, + provenance_1.Provenance | None, Field( description='Provenance metadata for this card, overrides manifest-level provenance.' ), diff --git a/src/adcp/types/generated_poc/core/capabilities_changed_webhook.py b/src/adcp/types/generated_poc/core/capabilities_changed_webhook.py index 1955cd69f..20c7f8e30 100644 --- a/src/adcp/types/generated_poc/core/capabilities_changed_webhook.py +++ b/src/adcp/types/generated_poc/core/capabilities_changed_webhook.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/capabilities_changed_webhook.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -64,7 +64,7 @@ class CapabilitiesChangedWebhook(AdCPBaseModel): subscriber_id: Annotated[ str, Field( - description="Identifies which `sync_agent_notification_configs.notification_configs[]` entry is receiving this fire. Echoed verbatim from the entry's `subscriber_id`.", + description="Identifies which caller-scoped notification_configs[] entry is receiving this fire. Echoed verbatim from the entry's subscriber_id.", max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$', diff --git a/src/adcp/types/generated_poc/core/delivery_provider.py b/src/adcp/types/generated_poc/core/delivery_provider.py new file mode 100644 index 000000000..da7a6584b --- /dev/null +++ b/src/adcp/types/generated_poc/core/delivery_provider.py @@ -0,0 +1,23 @@ +# generated by datamodel-codegen: +# filename: core/delivery_provider.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class DeliveryProvider(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + domain: Annotated[ + str, + Field( + description="Lowercase dotted provider domain, such as a provider's operating domain. Single-label and localhost-style names are invalid.", + pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$', + ), + ] diff --git a/src/adcp/types/generated_poc/core/delivery_recipient.py b/src/adcp/types/generated_poc/core/delivery_recipient.py new file mode 100644 index 000000000..c0c5122cb --- /dev/null +++ b/src/adcp/types/generated_poc/core/delivery_recipient.py @@ -0,0 +1,26 @@ +# generated by datamodel-codegen: +# filename: core/delivery_recipient.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class Cloud(StrEnum): + aws = 'aws' + azure = 'azure' + gcp = 'gcp' + + +class DeliveryRecipient(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + identity: Annotated[str, Field(max_length=512, min_length=1)] + cloud: Cloud | None = None + region: Annotated[str | None, Field(max_length=128, min_length=1)] = None diff --git a/src/adcp/types/generated_poc/core/mcp_webhook_payload.py b/src/adcp/types/generated_poc/core/mcp_webhook_payload.py index b57fdf0eb..745dc9778 100644 --- a/src/adcp/types/generated_poc/core/mcp_webhook_payload.py +++ b/src/adcp/types/generated_poc/core/mcp_webhook_payload.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/mcp_webhook_payload.json -# timestamp: 2026-08-22T17:50:25+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -39,7 +39,7 @@ class McpWebhookPayload(AdCPBaseModel): operation_id: Annotated[ str, Field( - description='Client-generated correlation identifier for the operation that produced this webhook. Buyers supply this value at webhook registration time via `push_notification_config.operation_id` or, for scheduled delivery reports, `reporting_webhook.operation_id`; sellers MUST echo it verbatim in every webhook payload. Sellers MUST NOT derive `operation_id` by parsing either registration URL — URLs are opaque to the seller. Receivers MAY dispatch endpoints by URL path or query string, but MUST correlate the operation using this payload field, not URL-derived values. See [Webhooks — Operation IDs and URL templates](/docs/building/by-layer/L3/webhooks#operation-ids-and-url-templates) for the full normative wire contract.' + description='Client-generated correlation identifier for the operation that produced this webhook. Buyers supply this value at webhook registration time via `push_notification_config.operation_id`; sellers MUST echo it verbatim in every webhook payload. Sellers MUST NOT derive `operation_id` by parsing `push_notification_config.url` — the URL is opaque to the seller. Receivers MAY dispatch endpoints by URL path or query string, but MUST correlate the operation using this payload field, not URL-derived values. See [Webhooks — Operation IDs and URL templates](/docs/building/by-layer/L3/webhooks#operation-ids-and-url-templates) for the full normative wire contract.' ), ] task_id: Annotated[ diff --git a/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py b/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py new file mode 100644 index 000000000..531f3c24d --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py @@ -0,0 +1,20 @@ +# generated by datamodel-codegen: +# filename: core/reporting_canonical_content_digest.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class ReportingCanonicalContentDigest(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + algorithm: Literal['sha256'] = 'sha256' + value: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] + canonicalization_id: Annotated[str, Field(max_length=128, min_length=1)] + canonicalization_sha256: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] diff --git a/src/adcp/types/generated_poc/core/reporting_control_total.py b/src/adcp/types/generated_poc/core/reporting_control_total.py new file mode 100644 index 000000000..8a22181a8 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_control_total.py @@ -0,0 +1,41 @@ +# generated by datamodel-codegen: +# filename: core/reporting_control_total.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class ValueType(StrEnum): + integer = 'integer' + decimal = 'decimal' + + +class ReportingControlTotal(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + name: Annotated[ + str, Field(max_length=128, min_length=1, pattern='^[A-Za-z][A-Za-z0-9_.:-]{0,127}$') + ] + value: Annotated[ + str, + Field( + description='Canonical base-10 value with no exponent, grouping separator, or insignificant leading zeroes.', + pattern='^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$', + ), + ] + value_type: ValueType + unit: Annotated[ + str | None, + Field( + description='Profile-defined unit such as impressions or an ISO 4217 currency code.', + max_length=32, + min_length=1, + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py b/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py new file mode 100644 index 000000000..b1524f77d --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py @@ -0,0 +1,93 @@ +# generated by datamodel-codegen: +# filename: core/reporting_dataset_share_destination.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Any, Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + + +class ReportingDatasetShareDestination1(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + mode: Literal['existing'] = 'existing' + destination_ref: Annotated[ + str, + Field( + description='Seller-issued reference returned by an earlier sync or bilateral setup.', + max_length=255, + min_length=1, + ), + ] + + +class Provider(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + domain: Annotated[ + str, Field(pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$') + ] + + +class Cloud(StrEnum): + aws = 'aws' + azure = 'azure' + gcp = 'gcp' + + +class Recipient(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + identity: Annotated[str, Field(max_length=512, min_length=1)] + cloud: Cloud | None = None + region: Annotated[str | None, Field(max_length=128, min_length=1)] = None + + +class ReportingDatasetShareDestination2(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + mode: Literal['provision'] = 'provision' + provider: Annotated[ + Provider, + Field(description='Data-sharing platform, such as databricks.com or snowflake.com.'), + ] + access_mode: Annotated[ + str, + Field( + description='Provider access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + recipient: Annotated[ + Recipient, + Field( + description='Intended buyer principal. The identity is interpreted by the provider and access mode; for example, a Databricks sharing identifier, Snowflake organization/account pair, or Open Sharing recipient email. It is an identifier, never a credential.' + ), + ] + + +class ReportingDatasetShareDestination( + RootModel[ReportingDatasetShareDestination1 | ReportingDatasetShareDestination2] +): + root: Annotated[ + ReportingDatasetShareDestination1 | ReportingDatasetShareDestination2, + Field( + description='Recipient configuration for a producer-hosted reporting share. The caller either references an existing seller-issued binding or asks the seller to provision one for the named recipient. The seller verifies authenticated-caller authority to disclose the selected account/feed/scope and proves recipient control before readiness. A destination_ref is bound to that caller/account and cannot be probed or reused across scopes. No bearer profile, token, private key, password, or other credential may appear here.', + title='Reporting Dataset Share Destination', + ), + ] + def __getattr__(self, name: str) -> Any: + """Proxy attribute access to the wrapped type.""" + if name.startswith('_'): + raise AttributeError(name) + return getattr(self.root, name) diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_capabilities.py b/src/adcp/types/generated_poc/core/reporting_delivery_capabilities.py new file mode 100644 index 000000000..5181f3123 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_capabilities.py @@ -0,0 +1,59 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_capabilities.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from . import reporting_delivery_offering + + +class ReportingDeliveryCapabilities(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + supported: Literal[True] + configuration_task: Literal['sync_accounts'] = 'sync_accounts' + status_task: Literal['get_reporting_status'] = 'get_reporting_status' + receipt_task: Literal['sync_reporting_receipts'] = 'sync_reporting_receipts' + readiness_notification: Literal['reporting.delivery_ready'] = 'reporting.delivery_ready' + offerings: Annotated[ + list[reporting_delivery_offering.ReportingDeliveryOffering], + Field( + description='Atomic supported feed/profile/schedule/finality/method combinations. offering_id values MUST be unique.', + min_length=1, + ), + ] + automated_recovery_window_seconds: Annotated[ + int, + Field( + description='Maximum late interval during which a due obligation may remain delayed while automated recovery continues before action_required.', + ge=0, + ), + ] + status_retention_days: Annotated[ + int, + Field( + description='Minimum period for which obligation, revision, and materialization metadata remain queryable.', + ge=1, + ), + ] + resource_retention_days: Annotated[ + int, + Field( + description='Minimum period after publication for which at least one verified exact materialization remains readable to every still-authorized intended consumer.', + ge=1, + ), + ] + supports_webhook_activity: bool | None = False + authorization_revocation_seconds: Annotated[ + int, + Field( + description="Maximum delay after caller/account authorization ends before seller-controlled transport access, provider grants, and write credentials are revoked. It cannot revoke a buyer's access to data already written into a buyer-owned destination.", + ge=0, + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config.py b/src/adcp/types/generated_poc/core/reporting_delivery_config.py new file mode 100644 index 000000000..585252c6c --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config.py @@ -0,0 +1,105 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_config.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + +from ..enums import reporting_finality +from . import reporting_delivery_method, reporting_reconciliation_mode, reporting_schedule + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class Scope(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + all_media_buys: Literal[True] = True + media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + + +class ReportingDeliveryConfiguration(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + delivery_config_id: Annotated[ + str, + Field( + description='Caller-selected stable identifier, unique within the authenticated caller and account.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + delivery_config_version: Annotated[ + int, + Field( + description='Caller-selected immutable semantic generation. Increment when feed/profile/scope/finality/schedule/method/destination changes; lifecycle fields may change in place.', + ge=1, + ), + ] + offering_id: Annotated[ + str, + Field( + description='Atomic reporting offering advertised by the seller that binds feed, profile, schedule, finality, and delivery support.', + max_length=128, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,128}$', + ), + ] + active: Annotated[ + bool, + Field( + description='Whether new reporting obligations should use this configuration. Inactive configurations remain visible for historical resolution.' + ), + ] + feed_purpose: Annotated[ + FeedPurpose, + Field( + description='Operational use of this independently reconciled feed. pacing is the fast snapshot path; billing is invoice-authoritative. Event-level exposure is intentionally deferred until a privacy and authorization contract exists.' + ), + ] + reporting_profile: Annotated[ + str, + Field( + description='Versioned semantic profile for the aggregate report, such as media_buy_delivery_v1. It MUST match the selected offering.', + max_length=128, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,128}$', + ), + ] + scope: Annotated[Scope, Field(description='Media buys covered by this configuration.')] + required_finality: Annotated[ + reporting_finality.ReportingFinality, + Field( + description='Finality the durable path must ultimately provide. Snapshot delivery may still precede an official requirement.' + ), + ] + reconciliation_mode: Annotated[ + reporting_reconciliation_mode.ReportingReconciliationMode, + Field( + description='Whether producer-side delivery evidence is sufficient or the selected consumer must submit an authenticated matching receipt. Billing MUST use consumer_receipt.' + ), + ] + schedule: reporting_schedule.ReportingSchedule + method: reporting_delivery_method.ReportingDeliveryMethod + revocation_effective_at: Annotated[ + AwareDatetime | None, + Field( + description='Optional requested cutoff for deactivation. No new publication may begin after the applied cutoff; historical access is limited to the contracted recovery window.' + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py new file mode 100644 index 000000000..69bdbce6f --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py @@ -0,0 +1,85 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_config_state.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field + +from . import reporting_delivery_config, reporting_status_issue + + +class State(StrEnum): + pending_validation = 'pending_validation' + pending_setup = 'pending_setup' + ready = 'ready' + action_required = 'action_required' + inactive = 'inactive' + + +class Action(StrEnum): + grant_access = 'grant_access' + activate_recipient = 'activate_recipient' + authorize_provider = 'authorize_provider' + repair_access = 'repair_access' + + +class Setup(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + action: Action + message: Annotated[ + str, + Field( + description='Untrusted display text only. SDKs and agents dispatch only on the closed action value and never execute embedded links or instructions.', + max_length=2000, + min_length=1, + ), + ] + url: AnyUrl | None = None + expires_at: AwareDatetime | None = None + + +class ReportingDeliveryConfigurationState(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + configuration: reporting_delivery_config.ReportingDeliveryConfiguration + state: State + destination_ref: Annotated[ + str | None, + Field( + description='Seller-issued stable binding. Present once the destination or recipient has been resolved; callers can use it with destination.mode existing on later syncs.', + max_length=255, + min_length=1, + ), + ] = None + validated_at: AwareDatetime | None = None + activated_at: AwareDatetime | None = None + deactivated_at: AwareDatetime | None = None + publication_stopped_at: Annotated[ + AwareDatetime | None, + Field( + description='Applied cutoff after which the seller starts no new obligations or publications for this generation.' + ), + ] = None + seller_managed_access_ends_at: Annotated[ + AwareDatetime | None, + Field( + description='End of historical access to a producer-hosted share/resource for a still-authorized principal after voluntary deactivation. Inapplicable to data already written into a buyer-owned destination.' + ), + ] = None + setup: Annotated[ + Setup | None, + Field( + description='Secret-free next step when provider-side authorization or recipient activation cannot be completed automatically.' + ), + ] = None + issues: Annotated[ + list[reporting_status_issue.ReportingStatusIssue] | None, Field(min_length=1) + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_method.py b/src/adcp/types/generated_poc/core/reporting_delivery_method.py new file mode 100644 index 000000000..1d8726508 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_method.py @@ -0,0 +1,124 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_method.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Any, Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + +from . import reporting_dataset_share_destination, reporting_write_destination + + +class Orchestration(StrEnum): + producer_managed = 'producer_managed' + consumer_managed = 'consumer_managed' + + +class Format(StrEnum): + jsonl = 'jsonl' + csv = 'csv' + parquet = 'parquet' + avro = 'avro' + orc = 'orc' + + +class ReportingDeliveryMethod3(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + pattern: Annotated[ + Literal['dataset_share'], + Field( + description="Producer-hosted relation or share read through the intended recipient's access path." + ), + ] = 'dataset_share' + transport: Annotated[ + str, + Field( + description='Sharing transport such as delta_sharing, snowflake_secure_sharing, or bigquery_authorized_view.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + orchestration: Annotated[ + Orchestration, + Field(description='Party responsible for configuring and monitoring the share.'), + ] + destination: reporting_dataset_share_destination.ReportingDatasetShareDestination + + +class ReportingDeliveryMethod2(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + pattern: Annotated[ + Literal['file_transfer'], + Field( + description='Immutable file/object publication with a manifest-last commit boundary.' + ), + ] = 'file_transfer' + transport: Annotated[ + str, + Field( + description='Storage transport such as s3, gcs, azure_blob, or sftp.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + orchestration: Annotated[ + Orchestration, + Field( + description='Party responsible for starting and monitoring the transfer. Independent of destination ownership and the service that copies bytes.' + ), + ] + destination: reporting_write_destination.ReportingWriteDestination + format: Annotated[Format, Field(description='Physical file format.')] + + +class ReportingDeliveryMethod4(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + pattern: Annotated[ + Literal['warehouse_materialization'], + Field(description='Exact-revision publication into a warehouse relation or partition.'), + ] = 'warehouse_materialization' + transport: Annotated[ + str, + Field( + description='Warehouse or transfer transport such as bigquery, snowflake, databricks_sql, or gam_bigquery_transfer.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] + orchestration: Annotated[ + Orchestration, + Field( + description='Party responsible for starting and monitoring materialization. consumer_managed covers platform transfer services that physically write consumer-owned tables.' + ), + ] + destination: reporting_write_destination.ReportingWriteDestination + + +class ReportingDeliveryMethod( + RootModel[ReportingDeliveryMethod2 | ReportingDeliveryMethod3 | ReportingDeliveryMethod4] +): + root: Annotated[ + ReportingDeliveryMethod2 | ReportingDeliveryMethod3 | ReportingDeliveryMethod4, + Field( + description='Provider-neutral durable reporting delivery method. The caller may request protocol-managed provisioning or reuse an existing seller-issued binding. Transport names are open so new platforms do not require an AdCP enum change. Credentials, bearer profiles, and private keys MUST NOT appear. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.', + title='Reporting Delivery Method', + ), + ] + def __getattr__(self, name: str) -> Any: + """Proxy attribute access to the wrapped type.""" + if name.startswith('_'): + raise AttributeError(name) + return getattr(self.root, name) diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_offering.py b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py new file mode 100644 index 000000000..5d5212906 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py @@ -0,0 +1,180 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_offering.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AnyUrl, ConfigDict, Field, RootModel + +from ..enums import reporting_finality +from . import reporting_reconciliation_mode, reporting_schedule + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class PrimaryKey(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1)] + + +class ReportingProfile(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + id: Annotated[str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$')] + version: Annotated[str, Field(max_length=64, min_length=1)] + schema_uri: Annotated[ + AnyUrl, + Field( + description='Authenticated seller/provider or AdCP-registry HTTPS origin only; never an IP literal, userinfo URL, redirect target, or mutable validation authority.' + ), + ] + schema_sha256: Annotated[ + str, + Field( + description='Digest of the exact schema bytes. SDKs verify this before parsing and cache by digest.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] + schema_dialect: Annotated[ + Literal['https://json-schema.org/draft/2020-12/schema'], + Field( + description="Closed SDK-bundled dialect. The SDK never resolves a metaschema over the network, and the fetched document's $schema MUST equal this value." + ), + ] = 'https://json-schema.org/draft/2020-12/schema' + schema_ref_policy: Annotated[ + Literal['local_fragment_only'], + Field( + description='The fetched schema is a self-contained bundle. Every $ref is a local # fragment; remote and relative-document dependencies are forbidden.' + ), + ] = 'local_fragment_only' + grain: Annotated[ + str, + Field( + description='Stable description of what one logical row represents.', + max_length=128, + min_length=1, + ), + ] + primary_keys: Annotated[list[PrimaryKey], Field(min_length=1)] + canonicalization_id: Annotated[ + str, + Field( + description='Rules for stable logical row ordering, value encoding, nulls, and schema used by canonical_content_digest.', + max_length=128, + min_length=1, + ), + ] + canonicalization_sha256: Annotated[ + str, + Field( + description='Digest of the exact canonicalization contract identified by canonicalization_id.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] + + +class Pattern(StrEnum): + file_transfer = 'file_transfer' + dataset_share = 'dataset_share' + warehouse_materialization = 'warehouse_materialization' + + +class Orchestration(StrEnum): + producer_managed = 'producer_managed' + consumer_managed = 'consumer_managed' + + +class DestinationMode(StrEnum): + provision = 'provision' + existing = 'existing' + + +class Provider(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + domain: Annotated[ + str, Field(pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$') + ] + + +class Format(StrEnum): + jsonl = 'jsonl' + csv = 'csv' + parquet = 'parquet' + avro = 'avro' + orc = 'orc' + + +class Cloud(StrEnum): + aws = 'aws' + azure = 'azure' + gcp = 'gcp' + + +class ProducerIdentity(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + provider: Provider + identity: Annotated[str, Field(max_length=512, min_length=1)] + cloud: Cloud | None = None + region: Annotated[str | None, Field(max_length=128, min_length=1)] = None + + +class ReaderCompatibilityItem(PrimaryKey): + pass + + +class Method(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + pattern: Pattern + transport: Annotated[str, Field(max_length=64, min_length=1, pattern='^[a-z][a-z0-9_.-]*$')] + orchestration: Orchestration + destination_modes: Annotated[list[DestinationMode], Field(min_length=1)] + provider: Provider | None = None + format: Format | None = None + access_mode: Annotated[ + str | None, Field(max_length=64, min_length=1, pattern='^[a-z][a-z0-9_.-]*$') + ] = None + producer_identity: Annotated[ + ProducerIdentity | None, + Field( + description='Seller principal a buyer grants access to for this exact buyer-hosted destination offering.' + ), + ] = None + reader_compatibility: list[ReaderCompatibilityItem] | None = None + + +class ReportingDeliveryOffering(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + offering_id: Annotated[ + str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$') + ] + feed_purpose: FeedPurpose + reporting_profile: Annotated[ + ReportingProfile, + Field(description='Machine-readable semantic and validation contract for delivered rows.'), + ] + schedule: reporting_schedule.ReportingSchedule + supported_finality: Annotated[list[reporting_finality.ReportingFinality], Field(min_length=1)] + reconciliation_mode: Annotated[ + reporting_reconciliation_mode.ReportingReconciliationMode, + Field( + description='Receipt contract included in this atomic offering. Billing offerings MUST require consumer_receipt.' + ), + ] + method: Method diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_ready_webhook.py b/src/adcp/types/generated_poc/core/reporting_delivery_ready_webhook.py new file mode 100644 index 000000000..8a486d738 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_delivery_ready_webhook.py @@ -0,0 +1,68 @@ +# generated by datamodel-codegen: +# filename: core/reporting_delivery_ready_webhook.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field + +from ..enums import reporting_finality + + +class Readiness(StrEnum): + available = 'available' + delivered = 'delivered' + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class ReportingDeliveryReadyWebhook(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + idempotency_key: Annotated[ + str, + Field( + description='Stable across transport retries of this fire; new for a later re-emission.', + max_length=255, + min_length=16, + pattern='^[A-Za-z0-9_.:-]{16,255}$', + ), + ] + notification_id: Annotated[ + str, + Field( + description='Stable for this logical materialization-ready event across re-emissions.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + notification_type: Literal['reporting.delivery_ready'] = 'reporting.delivery_ready' + fired_at: AwareDatetime + subscriber_id: Annotated[ + str, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$') + ] + account_id: Annotated[str, Field(min_length=1)] + delivery_config_id: Annotated[ + str, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$') + ] + delivery_config_version: Annotated[int, Field(ge=1)] + reporting_revision_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_materialization_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + readiness: Readiness + finality: reporting_finality.ReportingFinality + data_through: AwareDatetime | None + feed_purpose: FeedPurpose diff --git a/src/adcp/types/generated_poc/core/reporting_file_compression.py b/src/adcp/types/generated_poc/core/reporting_file_compression.py new file mode 100644 index 000000000..f9e2ae022 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_file_compression.py @@ -0,0 +1,14 @@ +# generated by datamodel-codegen: +# filename: core/reporting_file_compression.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum + + +class ReportingFileCompression(StrEnum): + none = 'none' + gzip = 'gzip' + zstd = 'zstd' + snappy = 'snappy' diff --git a/src/adcp/types/generated_poc/core/reporting_file_entry.py b/src/adcp/types/generated_poc/core/reporting_file_entry.py new file mode 100644 index 000000000..764718adb --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_file_entry.py @@ -0,0 +1,28 @@ +# generated by datamodel-codegen: +# filename: core/reporting_file_entry.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class ReportingFileEntry(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + object_ref: Annotated[ + str, + Field( + description='Credential-free object identifier resolved through the configured destination.', + max_length=1024, + min_length=1, + ), + ] + size_bytes: Annotated[int, Field(ge=0)] + sha256: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] + row_count: Annotated[int, Field(ge=0)] + partition: dict[str, str] | None = None diff --git a/src/adcp/types/generated_poc/core/reporting_file_manifest.py b/src/adcp/types/generated_poc/core/reporting_file_manifest.py new file mode 100644 index 000000000..04bb47ec1 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_file_manifest.py @@ -0,0 +1,55 @@ +# generated by datamodel-codegen: +# filename: core/reporting_file_manifest.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field + +from . import reporting_control_total, reporting_file_compression, reporting_file_entry + + +class Period(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + start: AwareDatetime + end: AwareDatetime + source_timezone: Annotated[str, Field(min_length=1)] + + +class Format(StrEnum): + jsonl = 'jsonl' + csv = 'csv' + parquet = 'parquet' + avro = 'avro' + orc = 'orc' + + +class ReportingFileManifest(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + manifest_version: Literal['1.0'] = '1.0' + complete: Literal[True] + reporting_revision_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_obligation_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_materialization_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + period: Period + format: Format + compression: reporting_file_compression.ReportingFileCompression + files: Annotated[list[reporting_file_entry.ReportingFileEntry], Field(min_length=1)] + total_size_bytes: Annotated[int, Field(ge=0)] + row_count: Annotated[int, Field(ge=0)] + control_totals: list[reporting_control_total.ReportingControlTotal] + created_at: AwareDatetime diff --git a/src/adcp/types/generated_poc/core/reporting_materialization.py b/src/adcp/types/generated_poc/core/reporting_materialization.py new file mode 100644 index 000000000..b3ce98f4e --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_materialization.py @@ -0,0 +1,100 @@ +# generated by datamodel-codegen: +# filename: core/reporting_materialization.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field + +from . import reporting_resource, reporting_verification + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class Method(StrEnum): + file_transfer = 'file_transfer' + dataset_share = 'dataset_share' + warehouse_materialization = 'warehouse_materialization' + + +class Status(StrEnum): + pending = 'pending' + available = 'available' + delivered = 'delivered' + failed = 'failed' + + +class ReportingMaterialization(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + reporting_materialization_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_revision_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_obligation_id: Annotated[ + str, + Field( + description='Destination-specific obligation this materialization attempts to satisfy.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + delivery_config_id: Annotated[ + str, + Field( + description='Durable configuration that requested this materialization.', + max_length=64, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,64}$', + ), + ] + delivery_config_version: Annotated[int, Field(ge=1)] + destination_ref: Annotated[ + str, + Field( + description='Resolved destination/share binding, scoped to the authenticated caller and account.', + max_length=255, + min_length=1, + ), + ] + feed_purpose: FeedPurpose + method: Method + transport: Annotated[ + str | None, Field(max_length=64, min_length=1, pattern='^[a-z][a-z0-9_.-]*$') + ] = None + attempt: Annotated[int, Field(ge=1)] + status: Annotated[ + Status, + Field( + description='Immutable result of this attempt. Staleness is evaluated in get_reporting_status health, not stored as a materialization state.' + ), + ] + ready_at: Annotated[ + AwareDatetime | None, + Field(description='When consumer-path or destination verification completed.'), + ] = None + failed_at: AwareDatetime | None = None + failure_code: Annotated[ + str | None, + Field( + description='Stable safe failure classification. MUST NOT include credentials or provider response bodies.', + max_length=128, + min_length=1, + pattern='^[A-Z][A-Z0-9_]*$', + ), + ] = None + resource: reporting_resource.ReportingResource | None = None + verification: reporting_verification.ReportingVerification | None = None + created_at: AwareDatetime diff --git a/src/adcp/types/generated_poc/core/reporting_obligation.py b/src/adcp/types/generated_poc/core/reporting_obligation.py new file mode 100644 index 000000000..bf97a1a27 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_obligation.py @@ -0,0 +1,138 @@ +# generated by datamodel-codegen: +# filename: core/reporting_obligation.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + +from ..enums import reporting_finality, reporting_health +from . import reporting_reconciliation_mode, reporting_schedule, reporting_status_issue + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class Period(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + start: AwareDatetime + end: AwareDatetime + source_timezone: Annotated[str, Field(min_length=1)] + + +class ReconciliationStatus(StrEnum): + not_required = 'not_required' + pending = 'pending' + accepted = 'accepted' + rejected = 'rejected' + + +class ProductionStatus(StrEnum): + not_due = 'not_due' + pending = 'pending' + published = 'published' + failed = 'failed' + + +class ReportingObligation(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + reporting_obligation_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + delivery_config_id: Annotated[ + str, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$') + ] + delivery_config_version: Annotated[int, Field(ge=1)] + report_definition_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + feed_purpose: FeedPurpose + reporting_profile: Annotated[str, Field(max_length=128, min_length=1)] + account_id: Annotated[str, Field(min_length=1)] + media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + period: Period + expected_at: AwareDatetime + schedule: Annotated[ + reporting_schedule.ReportingSchedule, + Field(description='Resolved immutable schedule generation that created this obligation.'), + ] + destination_ref: Annotated[ + str, + Field( + description='Resolved caller/account-bound destination or recipient binding for this obligation.', + max_length=255, + min_length=1, + ), + ] + required_finality: reporting_finality.ReportingFinality + reconciliation_mode: reporting_reconciliation_mode.ReportingReconciliationMode + reconciliation_status: Annotated[ + ReconciliationStatus, + Field( + description='Consumer agreement state for the current required revision. A later superseding revision returns a receipt-required obligation to pending until that revision is accepted.' + ), + ] + health: reporting_health.ReportingHealth + production_status: Annotated[ + ProductionStatus, + Field( + description='Whether any revision has been produced for this obligation. published includes zero-row revisions.' + ), + ] + revision_count: Annotated[ + int, + Field( + description='Number of revision records for this obligation in the consistent ledger snapshot.', + ge=0, + ), + ] + materialization_count: Annotated[ + int, + Field( + description="Number of materialization records for this obligation's revisions in the consistent ledger snapshot.", + ge=0, + ), + ] + successful_materialization_count: Annotated[ + int, + Field( + description='Number of available/delivered verified materializations in the consistent ledger snapshot.', + ge=0, + ), + ] + receipt_count: Annotated[ + int, + Field( + description='Complete number of authenticated receipts associated with this obligation in the ledger snapshot.', + ge=0, + ), + ] + accepted_receipt_count: Annotated[ + int, + Field( + description='Number of accepted receipts. At most one current accepted receipt per consumer and revision contributes to reconciliation_status.', + ge=0, + ), + ] + issues: list[reporting_status_issue.ReportingStatusIssue] + resource_retained_until: Annotated[ + AwareDatetime | None, + Field( + description='Minimum time through which at least one verified materialization for a completed obligation remains readable.' + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_receipt.py b/src/adcp/types/generated_poc/core/reporting_receipt.py new file mode 100644 index 000000000..faaf7365c --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_receipt.py @@ -0,0 +1,71 @@ +# generated by datamodel-codegen: +# filename: core/reporting_receipt.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + +from . import ( + reporting_canonical_content_digest, + reporting_control_total, + reporting_verification_profile, +) + + +class Status(StrEnum): + accepted = 'accepted' + rejected = 'rejected' + + +class RejectionCode(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1, pattern='^[A-Z][A-Z0-9_]*$')] + + +class ReportingReceipt(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + reporting_receipt_id: Annotated[ + str, Field(max_length=255, min_length=16, pattern='^[A-Za-z0-9_.:-]{16,255}$') + ] + reporting_obligation_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_revision_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_materialization_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + status: Status + verification_profile: reporting_verification_profile.ReportingVerificationProfile + observed_row_count: Annotated[int, Field(ge=0)] + observed_control_totals: list[reporting_control_total.ReportingControlTotal] + observed_canonical_content_digest: ( + reporting_canonical_content_digest.ReportingCanonicalContentDigest | None + ) = None + observed_manifest_sha256: Annotated[str | None, Field(pattern='^[A-Fa-f0-9]{64}$')] = None + observed_native_version_ref: Annotated[ + str | None, + Field( + description='Immutable provider-native version observed by the consumer for native_commit verification.', + max_length=512, + min_length=1, + ), + ] = None + consumer_commit_ref: Annotated[ + str | None, + Field( + description='Optional non-secret consumer checkpoint, transaction, or load identifier. It is evidence for operations, not authorization or a credential.', + max_length=512, + min_length=1, + ), + ] = None + rejection_codes: Annotated[list[RejectionCode] | None, Field(min_length=1)] = None + observed_at: AwareDatetime + received_at: AwareDatetime | None = None diff --git a/src/adcp/types/generated_poc/core/reporting_reconciliation_mode.py b/src/adcp/types/generated_poc/core/reporting_reconciliation_mode.py new file mode 100644 index 000000000..00952ac9e --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_reconciliation_mode.py @@ -0,0 +1,12 @@ +# generated by datamodel-codegen: +# filename: core/reporting_reconciliation_mode.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum + + +class ReportingReconciliationMode(StrEnum): + delivery_only = 'delivery_only' + consumer_receipt = 'consumer_receipt' diff --git a/src/adcp/types/generated_poc/core/reporting_resource.py b/src/adcp/types/generated_poc/core/reporting_resource.py new file mode 100644 index 000000000..7fd366278 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_resource.py @@ -0,0 +1,87 @@ +# generated by datamodel-codegen: +# filename: core/reporting_resource.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + + +class Kind(StrEnum): + manifest = 'manifest' + dataset = 'dataset' + warehouse_relation = 'warehouse_relation' + + +class Immutability(StrEnum): + immutable_location = 'immutable_location' + native_version = 'native_version' + + +class ReaderCompatibilityItem(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1)] + + +class ReportingResource(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + resource_ref: Annotated[ + str, + Field( + description='Seller-issued opaque reference to this exact authenticated resource descriptor.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + kind: Annotated[ + Kind, Field(description='Shape through which the durable revision is consumed.') + ] + location: Annotated[ + str, + Field( + description='Non-secret provider-native object, relation, or share identifier. MUST NOT contain an activation URL, signed URL, bearer token, password, private key, or embedded credential.', + max_length=2048, + min_length=1, + ), + ] + native_version_ref: Annotated[ + str | None, + Field( + description='Optional immutable provider-native table version, transaction, snapshot, manifest generation, job, or run reference. It supplements but never replaces reporting_revision_id.', + max_length=512, + min_length=1, + ), + ] = None + manifest_version: Annotated[ + Literal['1.0'], + Field(description='Version of reporting-file-manifest.json used by a manifest resource.'), + ] = '1.0' + manifest_sha256: Annotated[ + str | None, + Field( + description='SHA-256 over the exact manifest bytes. Consumers verify this before parsing the manifest.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] = None + immutability: Annotated[ + Immutability, + Field(description='How this descriptor selects the exact immutable materialization.'), + ] + expires_at: Annotated[ + AwareDatetime, + Field( + description='Mandatory finite lower-bound endpoint through which this exact resource remains resolvable; it cannot be earlier than the advertised retention contract.' + ), + ] + reader_compatibility: Annotated[ + list[ReaderCompatibilityItem] | None, + Field( + description='Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.' + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_revision.py b/src/adcp/types/generated_poc/core/reporting_revision.py new file mode 100644 index 000000000..b43780e68 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_revision.py @@ -0,0 +1,126 @@ +# generated by datamodel-codegen: +# filename: core/reporting_revision.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field, RootModel + +from ..enums import reporting_finality +from . import reporting_canonical_content_digest, reporting_control_total + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class Period(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + start: AwareDatetime + end: AwareDatetime + source_timezone: Annotated[str, Field(min_length=1)] + + +class DataThroughPrecision(StrEnum): + exact = 'exact' + lower_bound = 'lower_bound' + unknown = 'unknown' + + +class ReportingRevision(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + reporting_revision_id: Annotated[ + str, + Field( + description='Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + report_definition_id: Annotated[ + str, + Field( + description='Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + reporting_profile: Annotated[str, Field(max_length=128, min_length=1)] + schema_version: Annotated[str, Field(max_length=64, min_length=1)] + schema_uri: Annotated[ + AnyUrl, + Field( + description='Machine-readable schema on the authenticated seller/provider or AdCP-registry origin.' + ), + ] + schema_sha256: Annotated[ + str, + Field( + description='Digest of the exact schema bytes used to validate this immutable revision.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] + schema_dialect: Annotated[ + Literal['https://json-schema.org/draft/2020-12/schema'], + Field(description='Closed SDK-bundled dialect; the metaschema is never network-fetched.'), + ] = 'https://json-schema.org/draft/2020-12/schema' + schema_ref_policy: Annotated[ + Literal['local_fragment_only'], + Field( + description='The fetched schema is self-contained and every $ref is a local # fragment.' + ), + ] = 'local_fragment_only' + account_id: Annotated[str, Field(min_length=1)] + media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + period: Annotated[ + Period, Field(description='Half-open reporting interval with its source calendar boundary.') + ] + finality: reporting_finality.ReportingFinality + observed_at: Annotated[ + AwareDatetime, + Field(description='When the seller obtained or committed this source observation.'), + ] + data_through: Annotated[ + AwareDatetime | None, + Field( + description='Latest event time conservatively included, or null when precision is unknown.' + ), + ] + data_through_precision: DataThroughPrecision + supersedes_reporting_revision_id: Annotated[ + str | None, + Field( + description='Immediately superseded revision of the same logical slice. Both snapshot and official revisions may be superseded.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] = None + row_count: Annotated[ + int, + Field( + description='Logical row count, including zero for a successfully evaluated empty report.', + ge=0, + ), + ] + control_totals: Annotated[ + list[reporting_control_total.ReportingControlTotal], + Field( + description='Profile-defined totals computed from the canonical logical revision. Names MUST be unique.' + ), + ] + canonical_content_digest: ( + reporting_canonical_content_digest.ReportingCanonicalContentDigest | None + ) = None + created_at: AwareDatetime diff --git a/src/adcp/types/generated_poc/core/reporting_schedule.py b/src/adcp/types/generated_poc/core/reporting_schedule.py new file mode 100644 index 000000000..8772fd711 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_schedule.py @@ -0,0 +1,44 @@ +# generated by datamodel-codegen: +# filename: core/reporting_schedule.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + + +class Alignment(StrEnum): + utc = 'utc' + account_timezone = 'account_timezone' + billing_cycle = 'billing_cycle' + + +class ReportingSchedule(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + period_duration: Annotated[ + str, + Field( + description='Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M.', + pattern='^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$', + ), + ] + alignment: Annotated[ + Alignment, + Field( + description='Calendar used to establish exact period boundaries. The obligation echoes resolved timestamps and source timezone.' + ), + ] + delivery_sla: Annotated[ + str, + Field( + description='Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration.', + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$', + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_status_issue.py b/src/adcp/types/generated_poc/core/reporting_status_issue.py new file mode 100644 index 000000000..e23d9116a --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_status_issue.py @@ -0,0 +1,82 @@ +# generated by datamodel-codegen: +# filename: core/reporting_status_issue.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + + +class Code(StrEnum): + REPORT_OVERDUE = 'REPORT_OVERDUE' + PRODUCTION_FAILED = 'PRODUCTION_FAILED' + DELIVERY_FAILED = 'DELIVERY_FAILED' + ACCESS_REQUIRED = 'ACCESS_REQUIRED' + CONFIGURATION_REQUIRED = 'CONFIGURATION_REQUIRED' + RESOURCE_EXPIRED = 'RESOURCE_EXPIRED' + READER_INCOMPATIBLE = 'READER_INCOMPATIBLE' + HISTORY_UNAVAILABLE = 'HISTORY_UNAVAILABLE' + + +class Severity(StrEnum): + delayed = 'delayed' + action_required = 'action_required' + + +class ResponsibleParty(StrEnum): + buyer = 'buyer' + seller = 'seller' + provider = 'provider' + + +class RecommendedAction(StrEnum): + wait_for_retry = 'wait_for_retry' + contact_buyer = 'contact_buyer' + contact_seller = 'contact_seller' + contact_provider = 'contact_provider' + repair_access = 'repair_access' + update_configuration = 'update_configuration' + use_supported_reader = 'use_supported_reader' + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class ReportingStatusIssue(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + code: Code + severity: Severity + responsible_party: ResponsibleParty + recommended_action: RecommendedAction + message: Annotated[ + str | None, + Field( + description='Untrusted display text only. SDKs and agents dispatch exclusively on closed code/recommended_action values and never execute embedded links or instructions.', + max_length=500, + ), + ] = None + reporting_obligation_id: Annotated[ + str | None, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] = None + delivery_config_id: Annotated[ + str | None, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$') + ] = None + delivery_config_version: Annotated[int | None, Field(ge=1)] = None + feed_purpose: FeedPurpose | None = None + media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + period_start: AwareDatetime | None = None + period_end: AwareDatetime | None = None + expected_at: AwareDatetime | None = None diff --git a/src/adcp/types/generated_poc/core/reporting_verification.py b/src/adcp/types/generated_poc/core/reporting_verification.py new file mode 100644 index 000000000..2bc027610 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_verification.py @@ -0,0 +1,98 @@ +# generated by datamodel-codegen: +# filename: core/reporting_verification.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field + +from . import ( + reporting_canonical_content_digest, + reporting_control_total, + reporting_verification_profile, +) + + +class VerificationPath(StrEnum): + producer = 'producer' + representative_consumer = 'representative_consumer' + destination = 'destination' + + +class Algorithm(StrEnum): + sha256 = 'sha256' + sha512 = 'sha512' + + +class PhysicalChecksum(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + object_ref: Annotated[str, Field(max_length=1024, min_length=1)] + algorithm: Algorithm + value: Annotated[str, Field(pattern='^(?:[A-Fa-f0-9]{64}|[A-Fa-f0-9]{128})$')] + + +class ObservedThrough(StrEnum): + representative_consumer = 'representative_consumer' + destination = 'destination' + + +class NativeCommitEvidence(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + native_version_ref: Annotated[str, Field(max_length=512, min_length=1)] + observed_through: ObservedThrough + + +class ReportingVerification(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + verified_at: Annotated[ + AwareDatetime, + Field( + description='When the producer completed verification through the claimed consumer/destination path.' + ), + ] + verification_path: Annotated[ + VerificationPath, + Field( + description='Path on which verification succeeded. dataset_share readiness requires representative_consumer; delivered warehouse state requires destination.' + ), + ] + verification_profile: reporting_verification_profile.ReportingVerificationProfile + row_count: Annotated[ + int, + Field( + description='Verified row count. Zero explicitly distinguishes an empty committed revision from a missing revision.', + ge=0, + ), + ] + control_totals: Annotated[ + list[reporting_control_total.ReportingControlTotal], + Field( + description='Profile-defined totals recomputed through verification_path. Names MUST be unique.' + ), + ] + canonical_content_digest: ( + reporting_canonical_content_digest.ReportingCanonicalContentDigest | None + ) = None + physical_checksums: Annotated[ + list[PhysicalChecksum] | None, + Field( + description='Method-specific byte/object checksums. Different encodings of the same logical revision normally have different values.', + min_length=1, + ), + ] = None + native_commit_evidence: Annotated[ + NativeCommitEvidence | None, + Field( + description='Provider-native immutable version evidence observed through the named consumer or destination path.' + ), + ] = None diff --git a/src/adcp/types/generated_poc/core/reporting_verification_profile.py b/src/adcp/types/generated_poc/core/reporting_verification_profile.py new file mode 100644 index 000000000..efc4183e8 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_verification_profile.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: core/reporting_verification_profile.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum + + +class ReportingVerificationProfile(StrEnum): + native_commit = 'native_commit' + manifest_checksums = 'manifest_checksums' + canonical_digest = 'canonical_digest' diff --git a/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py b/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py new file mode 100644 index 000000000..64dba5263 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py @@ -0,0 +1,24 @@ +# generated by datamodel-codegen: +# filename: core/reporting_verification_profile_set.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from pydantic import Field, RootModel + +from . import reporting_verification_profile + + +class ReportingVerificationProfileSet( + RootModel[list[reporting_verification_profile.ReportingVerificationProfile]] +): + root: Annotated[ + list[reporting_verification_profile.ReportingVerificationProfile], + Field( + description="Verification profiles the destination can accept. native_commit requires provider-native transaction/version evidence plus counts and control totals; manifest_checksums requires a committed file manifest with cryptographic checksums; canonical_digest requires recomputation of the canonical logical-content digest. A reporting feed selects one profile from this allowed set according to the seller offering and the feed's strictness requirements.", + min_length=1, + title='Reporting Verification Profile Set', + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_write_destination.py b/src/adcp/types/generated_poc/core/reporting_write_destination.py new file mode 100644 index 000000000..365b91a5f --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_write_destination.py @@ -0,0 +1,74 @@ +# generated by datamodel-codegen: +# filename: core/reporting_write_destination.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Any, Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + + +class ReportingWriteDestination1(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + mode: Literal['existing'] = 'existing' + destination_ref: Annotated[ + str, + Field( + description='Seller-issued reference returned by an earlier sync or bilateral setup.', + max_length=255, + min_length=1, + ), + ] + + +class Provider(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + domain: Annotated[ + str, Field(pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$') + ] + + +class ReportingWriteDestination2(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + mode: Literal['provision'] = 'provision' + provider: Annotated[Provider, Field(description='Platform hosting the destination.')] + location: Annotated[ + str, + Field( + description='Provider-native bucket, prefix, project/dataset, catalog/schema, or equivalent locator. It MUST NOT contain an embedded credential or signed URL.', + max_length=2048, + min_length=1, + ), + ] + access_mode: Annotated[ + str | None, + Field( + description='Optional provider access family used for capability matching.', + max_length=64, + min_length=1, + pattern='^[a-z][a-z0-9_.-]*$', + ), + ] = None + + +class ReportingWriteDestination(RootModel[ReportingWriteDestination1 | ReportingWriteDestination2]): + root: Annotated[ + ReportingWriteDestination1 | ReportingWriteDestination2, + Field( + description='Storage or warehouse destination for durable reporting. The caller either references an existing seller-issued binding or asks the seller to validate and bind a provider-native location. The seller verifies authenticated-caller authority for the account/feed/scope and destination control before readiness. A destination_ref is bound to that caller/account and cannot be probed or reused across scopes. Access grants name advertised producer identities; credentials never transit AdCP.', + title='Reporting Write Destination', + ), + ] + def __getattr__(self, name: str) -> Any: + """Proxy attribute access to the wrapped type.""" + if name.startswith('_'): + raise AttributeError(name) + return getattr(self.root, name) diff --git a/src/adcp/types/generated_poc/enums/reporting_finality.py b/src/adcp/types/generated_poc/enums/reporting_finality.py new file mode 100644 index 000000000..e8898b344 --- /dev/null +++ b/src/adcp/types/generated_poc/enums/reporting_finality.py @@ -0,0 +1,12 @@ +# generated by datamodel-codegen: +# filename: enums/reporting_finality.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum + + +class ReportingFinality(StrEnum): + snapshot = 'snapshot' + official = 'official' diff --git a/src/adcp/types/generated_poc/enums/reporting_health.py b/src/adcp/types/generated_poc/enums/reporting_health.py new file mode 100644 index 000000000..0e961e9b3 --- /dev/null +++ b/src/adcp/types/generated_poc/enums/reporting_health.py @@ -0,0 +1,15 @@ +# generated by datamodel-codegen: +# filename: enums/reporting_health.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum + + +class ReportingHealth(StrEnum): + healthy = 'healthy' + waiting = 'waiting' + delayed = 'delayed' + action_required = 'action_required' + complete = 'complete' diff --git a/src/adcp/types/generated_poc/enums/task_type.py b/src/adcp/types/generated_poc/enums/task_type.py index d8cfe9759..b539fa8be 100644 --- a/src/adcp/types/generated_poc/enums/task_type.py +++ b/src/adcp/types/generated_poc/enums/task_type.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: enums/task_type.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -41,3 +41,5 @@ class TaskType(StrEnum): acquire_rights = 'acquire_rights' update_rights = 'update_rights' sync_agent_notification_configs = 'sync_agent_notification_configs' + sync_agent_configuration = 'sync_agent_configuration' + sync_reporting_receipts = 'sync_reporting_receipts' diff --git a/src/adcp/types/generated_poc/extensions/extension_meta.py b/src/adcp/types/generated_poc/extensions/extension_meta.py index 28d3acde7..94b25efbe 100644 --- a/src/adcp/types/generated_poc/extensions/extension_meta.py +++ b/src/adcp/types/generated_poc/extensions/extension_meta.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: extensions/extension_meta.json -# timestamp: 2026-08-22T17:50:25+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -14,6 +14,14 @@ class AdcpExtensionFileSchema(AdCPBaseModel): field_schema: Annotated[ Literal['http://json-schema.org/draft-07/schema#'], Field(alias='$schema') ] = 'http://json-schema.org/draft-07/schema#' + field_id: Annotated[ + str, + Field( + alias='$id', + description='Extension ID following pattern /schemas/extensions/{namespace}.json', + pattern='^/schemas/extensions/[a-z][a-z0-9_]*\\.json$', + ), + ] title: Annotated[str, Field(description='Human-readable title for the extension')] description: Annotated[str, Field(description='Description of what this extension provides')] valid_from: Annotated[ diff --git a/src/adcp/types/generated_poc/media_buy/get_reporting_status_request.py b/src/adcp/types/generated_poc/media_buy/get_reporting_status_request.py new file mode 100644 index 000000000..1a5ff4334 --- /dev/null +++ b/src/adcp/types/generated_poc/media_buy/get_reporting_status_request.py @@ -0,0 +1,115 @@ +# generated by datamodel-codegen: +# filename: media_buy/get_reporting_status_request.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + +from ..core import canonical_account_ref +from ..core import context as context_1 +from ..core import ext as ext_1 +from ..core import pagination_request +from ..core.version_envelope import AdcpVersionEnvelope +from ..enums import reporting_finality, reporting_health + + +class View(StrEnum): + summary = 'summary' + periods = 'periods' + revision = 'revision' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class DeliveryConfigId(RootModel[str]): + root: Annotated[str, Field(max_length=64, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,64}$')] + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class Period(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + start: AwareDatetime + end: AwareDatetime + + +class GetReportingStatusRequest(AdcpVersionEnvelope): + account: Annotated[ + canonical_account_ref.CanonicalAccountReference, + Field(description='Account whose caller-owned reporting status is queried.'), + ] + view: Annotated[ + View, + Field( + description='Stable response-shape discriminator. SDK convenience methods may default this to summary, but the wire request is explicit.' + ), + ] + media_buy_ids: Annotated[ + list[MediaBuyId] | None, + Field( + description='Optional summary/periods scope. Omit for every accessible media buy in the account.', + max_length=100, + min_length=1, + ), + ] = None + delivery_config_ids: Annotated[ + list[DeliveryConfigId] | None, + Field( + description='Optional summary/periods scope. Use to reconcile billing, analytics, and pacing independently. Omit for every active caller-owned configuration.', + max_length=16, + min_length=1, + ), + ] = None + feed_purposes: Annotated[ + list[FeedPurpose] | None, + Field( + description='Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate.', + min_length=1, + ), + ] = None + period: Annotated[ + Period | None, + Field( + description="Half-open summary/periods horizon. Omit for the seller's documented operational default horizon; the response always echoes the evaluated scope." + ), + ] = None + health: Annotated[ + list[reporting_health.ReportingHealth] | None, + Field( + description='Periods-view result filter only; it never changes summary health.', + min_length=1, + ), + ] = None + finality: Annotated[list[reporting_finality.ReportingFinality] | None, Field(min_length=1)] = ( + None + ) + reporting_revision_id: Annotated[ + str | None, + Field( + description='Exact retained revision to resolve in revision view.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] = None + pagination: Annotated[ + pagination_request.PaginationRequest | None, + Field( + description='Periods or revision-view pagination. Cursors are bound to the authenticated caller, account, filters, and ledger snapshot.' + ), + ] = None + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py b/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py new file mode 100644 index 000000000..161e01db7 --- /dev/null +++ b/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py @@ -0,0 +1,167 @@ +# generated by datamodel-codegen: +# filename: media_buy/get_reporting_status_response.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + +from ..core import context as context_1 +from ..core import error +from ..core import ext as ext_1 +from ..core import ( + pagination_response, + reporting_materialization, + reporting_obligation, + reporting_receipt, + reporting_revision, + reporting_status_issue, +) +from ..core.protocol_envelope import ProtocolEnvelope +from ..core.version_envelope import AdcpVersionEnvelope +from ..enums import reporting_finality, reporting_health + + +class View(StrEnum): + summary = 'summary' + periods = 'periods' + revision = 'revision' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class FeedPurpose(StrEnum): + pacing = 'pacing' + analytics = 'analytics' + billing = 'billing' + + +class DeliveryConfigGeneration(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + delivery_config_id: Annotated[str, Field(max_length=64, min_length=1)] + delivery_config_version: Annotated[int, Field(ge=1)] + feed_purpose: FeedPurpose + + +class ObligationCounts(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + total: Annotated[int, Field(ge=0)] + waiting: Annotated[int, Field(ge=0)] + healthy: Annotated[int, Field(ge=0)] + delayed: Annotated[int, Field(ge=0)] + action_required: Annotated[int, Field(ge=0)] + complete: Annotated[int, Field(ge=0)] + + +class Scope(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + period_start: AwareDatetime + period_end: AwareDatetime + scope_closed: Annotated[ + bool, Field(description='True only when no new obligation can enter this evaluated scope.') + ] + media_buy_ids: list[MediaBuyId] | None = None + all_accessible_media_buys: Annotated[ + bool, + Field( + description='True when media_buy_ids was omitted and the scope covers all caller-accessible account buys.' + ), + ] + delivery_config_generations: Annotated[ + list[DeliveryConfigGeneration], + Field( + description='Exact independently reconciled configuration generations in the denominator.', + min_length=1, + ), + ] + feed_purposes: Annotated[list[FeedPurpose], Field(min_length=1)] + finality: Annotated[list[reporting_finality.ReportingFinality], Field(min_length=1)] + ledger_retained_from: Annotated[ + AwareDatetime, + Field( + description='Earliest period boundary for which anti-entropy metadata is retained for every selected configuration generation.' + ), + ] + coverage_complete: Annotated[ + bool, + Field( + description='Whether the requested horizon is fully inside retained ledger coverage. False means health cannot prove completeness for the whole requested horizon.' + ), + ] + + +class GetReportingStatusResponse(AdcpVersionEnvelope, ProtocolEnvelope): + model_config = ConfigDict( + extra='allow', + ) + view: View | None = None + ledger_snapshot_id: Annotated[ + str | None, + Field( + description="Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value.", + max_length=255, + min_length=1, + ), + ] = None + ledger_as_of: Annotated[ + AwareDatetime | None, + Field( + description='Exclusive observation boundary for ledger_snapshot_id. Revisions committed later appear only in a later reconciliation.' + ), + ] = None + account_id: Annotated[ + str | None, + Field(description='Resolved seller/storefront account identifier.', min_length=1), + ] = None + scope: Annotated[ + Scope | None, + Field( + description='Exact denominator evaluated for summary or periods health. complete is valid only when scope_closed is true.' + ), + ] = None + health: reporting_health.ReportingHealth | None = None + data_through: Annotated[ + AwareDatetime | None, + Field( + description='Conservative latest included event time across satisfied obligations in scope, or null when unavailable/unknown.' + ), + ] = None + next_expected_at: Annotated[ + AwareDatetime | None, + Field( + description='Next obligation due time for an open scope. Omitted for a closed complete scope.' + ), + ] = None + obligation_counts: ObligationCounts | None = None + issues: list[reporting_status_issue.ReportingStatusIssue] | None = None + periods: list[reporting_obligation.ReportingObligation] | None = None + revisions: Annotated[ + list[reporting_revision.ReportingRevision] | None, + Field( + description='Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, materializations, and receipts, avoiding unbounded nested history.' + ), + ] = None + pagination: pagination_response.PaginationResponse | None = None + revision: reporting_revision.ReportingRevision | None = None + materializations: list[reporting_materialization.ReportingMaterialization] | None = None + receipts: Annotated[ + list[reporting_receipt.ReportingReceipt] | None, + Field( + description="Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." + ), + ] = None + errors: list[error.Error] | None = None + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/media_buy/product_refinement.py b/src/adcp/types/generated_poc/media_buy/product_refinement.py index fa3655f1d..389291f32 100644 --- a/src/adcp/types/generated_poc/media_buy/product_refinement.py +++ b/src/adcp/types/generated_poc/media_buy/product_refinement.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: media_buy/product_refinement.json -# timestamp: 2026-08-17T23:02:13+00:00 +# timestamp: 2026-08-28T07:58:14+00:00 from __future__ import annotations @@ -44,7 +44,7 @@ class ProductRefinementRequests3(AdCPBaseModel): ] = None -class Action9(StrEnum): +class Action10(StrEnum): include = 'include' omit = 'omit' finalize = 'finalize' @@ -61,8 +61,8 @@ class ProductRefinementRequests4(AdCPBaseModel): str, Field(description='Proposal ID from a previous product-discovery response.', min_length=1), ] - action: Annotated[Action9 | None, Field(description='Requested proposal-level action.')] = ( - Action9.include + action: Annotated[Action10 | None, Field(description='Requested proposal-level action.')] = ( + Action10.include ) ask: Annotated[ str | None, diff --git a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py new file mode 100644 index 000000000..441001908 --- /dev/null +++ b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py @@ -0,0 +1,36 @@ +# generated by datamodel-codegen: +# filename: media_buy/sync_reporting_receipts_request.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from ..core import canonical_account_ref +from ..core import context as context_1 +from ..core import ext as ext_1 +from ..core import reporting_receipt + + +class SyncReportingReceiptsRequest(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + account: canonical_account_ref.CanonicalAccountReference + idempotency_key: Annotated[ + str, + Field( + description='Client-generated batch key. Exact retries reuse the key and body.', + max_length=255, + min_length=16, + pattern='^[A-Za-z0-9_.:-]{16,255}$', + ), + ] + receipts: Annotated[ + list[reporting_receipt.ReportingReceipt], Field(max_length=100, min_length=1) + ] + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py new file mode 100644 index 000000000..d89887606 --- /dev/null +++ b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py @@ -0,0 +1,51 @@ +# generated by datamodel-codegen: +# filename: media_buy/sync_reporting_receipts_response.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from ..core import context as context_1 +from ..core import error +from ..core import ext as ext_1 +from ..core import reporting_receipt + + +class Results(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + result: Literal['failed'] = 'failed' + reporting_receipt_id: Annotated[ + str, Field(max_length=255, min_length=16, pattern='^[A-Za-z0-9_.:-]{16,255}$') + ] + errors: Annotated[list[error.Error], Field(max_length=16, min_length=1)] + + +class Results18(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + result: Literal['recorded'] = 'recorded' + receipt: reporting_receipt.ReportingReceipt + + +class Results19(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + result: Literal['unchanged'] = 'unchanged' + receipt: reporting_receipt.ReportingReceipt + + +class SyncReportingReceiptsResponse(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + results: Annotated[list[Results18 | Results19 | Results], Field(max_length=100, min_length=1)] + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/protocol/sync_agent_configuration_request.py b/src/adcp/types/generated_poc/protocol/sync_agent_configuration_request.py new file mode 100644 index 000000000..358618120 --- /dev/null +++ b/src/adcp/types/generated_poc/protocol/sync_agent_configuration_request.py @@ -0,0 +1,72 @@ +# generated by datamodel-codegen: +# filename: protocol/sync_agent_configuration_request.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from ..core import agent_notification_config, agent_reporting_destination +from ..core import context as context_1 +from ..core import ext as ext_1 +from ..core.version_envelope import AdcpVersionEnvelope + + +class Configuration(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + notification_configs: Annotated[ + list[agent_notification_config.AgentNotificationConfig] | None, + Field( + description='Complete desired agent-level subscriber set. The same caller-scoping, proof-of-control, secret handling, and replacement rules as sync_agent_notification_configs apply.', + max_length=16, + ), + ] = None + reporting_destinations: Annotated[ + list[agent_reporting_destination.AgentReportingDestination] | None, + Field( + description="Complete desired reusable reporting destination set. [] deactivates/removes the caller's connection-level bindings for new use; it does not delete caller-owned data already delivered. destination_id values MUST be unique.", + max_length=64, + ), + ] = None + + +class SyncAgentConfigurationRequest(AdcpVersionEnvelope): + model_config = ConfigDict( + extra='allow', + ) + idempotency_key: Annotated[ + str, + Field( + description='Client-generated key for at-most-once execution. Retries MUST reuse the same key with the same body.', + max_length=255, + min_length=16, + pattern='^[A-Za-z0-9_.:-]{16,255}$', + ), + ] + expected_configuration_version: Annotated[ + str | None, + Field( + description='Optional optimistic-concurrency fence returned by a previous successful sync. When present and stale, the seller rejects the whole request without mutation. Compare only for equality.', + max_length=255, + min_length=1, + ), + ] = None + configuration: Annotated[ + Configuration, + Field( + description='Sections to replace atomically. At least one section is required. A present array is complete desired state for that section; [] clears it; omission leaves it unchanged.' + ), + ] + dry_run: Annotated[ + bool | None, + Field( + description='Validate the proposed replacements and report the would-be action without persisting them, issuing durable identifiers or grants, or sending endpoint proof challenges.' + ), + ] = False + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/generated_poc/protocol/sync_agent_configuration_response.py b/src/adcp/types/generated_poc/protocol/sync_agent_configuration_response.py new file mode 100644 index 000000000..e3446957f --- /dev/null +++ b/src/adcp/types/generated_poc/protocol/sync_agent_configuration_response.py @@ -0,0 +1,84 @@ +# generated by datamodel-codegen: +# filename: protocol/sync_agent_configuration_response.json +# timestamp: 2026-08-28T07:58:14+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field + +from ..core import agent_configuration_state +from ..core import context as context_1 +from ..core import error +from ..core import ext as ext_1 +from ..core.protocol_envelope import ProtocolEnvelope +from ..core.version_envelope import AdcpVersionEnvelope + + +class Action(StrEnum): + updated = 'updated' + unchanged = 'unchanged' + cleared = 'cleared' + + +class Action26(StrEnum): + would_update = 'would_update' + would_be_unchanged = 'would_be_unchanged' + would_clear = 'would_clear' + + +class Result(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + kind: Literal['validated'] = 'validated' + action: Action26 + dry_run: Literal[True] + warnings: Annotated[list[error.Error] | None, Field(max_length=16)] = None + + +class Result11(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + kind: Literal['failed'] = 'failed' + errors: Annotated[list[error.Error], Field(max_length=16, min_length=1)] + + +class Result9(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + kind: Literal['applied'] = 'applied' + action: Annotated[Action, Field(description='Persisted outcome for the submitted sections.')] + dry_run: Literal[False] + connection_id: Annotated[ + str, + Field( + description='Seller-issued opaque identifier for this authenticated caller relationship. It is response-only, not a credential, not caller identity, and not advertiser-account authority.', + max_length=255, + min_length=1, + ), + ] + configuration_version: Annotated[ + str, + Field( + description='Opaque version of the persisted configuration. Compare only for equality and return it as expected_configuration_version on a later guarded replacement.', + max_length=255, + min_length=1, + ), + ] + configuration: agent_configuration_state.AgentConfigurationState + warnings: Annotated[list[error.Error] | None, Field(max_length=16)] = None + + +class SyncAgentConfigurationResponse(AdcpVersionEnvelope, ProtocolEnvelope): + model_config = ConfigDict( + extra='allow', + ) + result: Result9 | Result | Result11 + context: context_1.ContextObject | None = None + ext: ext_1.ExtensionObject | None = None diff --git a/tests/fixtures/public_api_snapshot.json b/tests/fixtures/public_api_snapshot.json index f27b21375..b5a876956 100644 --- a/tests/fixtures/public_api_snapshot.json +++ b/tests/fixtures/public_api_snapshot.json @@ -1015,6 +1015,8 @@ "GetProductsWorkingResponse", "GetPropertyListRequest", "GetPropertyListResponse", + "GetReportingStatusRequest", + "GetReportingStatusResponse", "GetRightsErrorResponse", "GetRightsRequest", "GetRightsResponse", @@ -1296,9 +1298,15 @@ "ReportUsageRequest", "ReportUsageResponse", "ReportingBucket", + "ReportingCanonicalContentDigest", "ReportingCapabilities", + "ReportingControlTotal", "ReportingFrequency", + "ReportingMaterialization", + "ReportingObligation", "ReportingPeriod", + "ReportingReceipt", + "ReportingRevision", "ReportingWebhook", "ReportingWebhookAuthentication", "Request", @@ -1406,6 +1414,8 @@ "SyncGovernanceResponse", "SyncPlansRequest", "SyncPlansResponse", + "SyncReportingReceiptsRequest", + "SyncReportingReceiptsResponse", "Tags", "TargetingOverlay", "TaskResult", diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py new file mode 100644 index 000000000..ef747230e --- /dev/null +++ b/tests/test_reporting_reconciliation.py @@ -0,0 +1,415 @@ +from __future__ import annotations + +from copy import deepcopy +from datetime import datetime + +import pytest + +from adcp.reporting import ( + ExpectedReportingPeriod, + ReportingInspectionContext, + ReportingObservation, + evaluate_reporting_ledger, + load_reporting_ledger, + reconcile_reporting, +) +from adcp.types.core import TaskResult, TaskStatus +from adcp.types.generated_poc.core.reporting_canonical_content_digest import ( + ReportingCanonicalContentDigest, +) +from adcp.types.generated_poc.core.reporting_control_total import ReportingControlTotal +from adcp.types.generated_poc.media_buy.get_reporting_status_request import ( + GetReportingStatusRequest, +) +from adcp.types.generated_poc.media_buy.get_reporting_status_response import ( + GetReportingStatusResponse, +) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_request import ( + SyncReportingReceiptsRequest, +) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_response import ( + SyncReportingReceiptsResponse, +) + +PERIOD = { + "start": "2026-08-01T00:00:00Z", + "end": "2026-09-01T00:00:00Z", + "source_timezone": "UTC", +} +TOTALS = [ + { + "name": "impressions", + "value": "4200", + "value_type": "integer", + "unit": "impressions", + }, + {"name": "spend", "value": "7000.00", "value_type": "decimal", "unit": "USD"}, +] +DIGEST = { + "algorithm": "sha256", + "value": "a" * 64, + "canonicalization_id": "rows-v1", + "canonicalization_sha256": "b" * 64, +} +REVISION = { + "reporting_revision_id": "revision-august-official", + "report_definition_id": "billing-v1", + "reporting_profile": "billing-v1", + "schema_version": "1", + "schema_uri": "https://schemas.example/billing-v1.json", + "schema_sha256": "c" * 64, + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "account_id": "account-1", + "media_buy_ids": ["buy-1", "buy-2"], + "period": PERIOD, + "finality": "official", + "observed_at": "2026-09-02T00:00:00Z", + "data_through": "2026-09-01T00:00:00Z", + "data_through_precision": "exact", + "row_count": 7, + "control_totals": TOTALS, + "canonical_content_digest": DIGEST, + "created_at": "2026-09-02T00:00:00Z", +} + + +def _obligation(identifier: str = "obligation-billing") -> dict[str, object]: + return { + "reporting_obligation_id": identifier, + "delivery_config_id": "billing-feed", + "delivery_config_version": 1, + "report_definition_id": "billing-v1", + "feed_purpose": "billing", + "reporting_profile": "billing-v1", + "account_id": "account-1", + "media_buy_ids": ["buy-1", "buy-2"], + "period": PERIOD, + "expected_at": "2026-09-02T00:00:00Z", + "schedule": { + "period_duration": "P1M", + "alignment": "billing_cycle", + "delivery_sla": "P1D", + }, + "destination_ref": f"destination-{identifier}", + "required_finality": "official", + "reconciliation_mode": "consumer_receipt", + "reconciliation_status": "pending", + "health": "waiting", + "production_status": "published", + "revision_count": 1, + "materialization_count": 1, + "successful_materialization_count": 1, + "receipt_count": 0, + "accepted_receipt_count": 0, + "issues": [], + "resource_retained_until": "2026-12-01T00:00:00Z", + } + + +def _materialization( + identifier: str = "materialization-billing", + obligation_id: str = "obligation-billing", +) -> dict[str, object]: + return { + "reporting_materialization_id": identifier, + "reporting_revision_id": REVISION["reporting_revision_id"], + "reporting_obligation_id": obligation_id, + "delivery_config_id": "billing-feed", + "delivery_config_version": 1, + "destination_ref": f"destination-{obligation_id}", + "feed_purpose": "billing", + "method": "dataset_share", + "transport": "delta_sharing", + "attempt": 1, + "status": "available", + "ready_at": "2026-09-02T00:00:05Z", + "resource": { + "resource_ref": f"resource-{identifier}", + "kind": "dataset", + "location": "share.billing", + "native_version_ref": "version-42", + "immutability": "native_version", + "expires_at": "2026-12-01T00:00:00Z", + }, + "verification": { + "verified_at": "2026-09-02T00:00:05Z", + "verification_path": "representative_consumer", + "verification_profile": "canonical_digest", + "row_count": 7, + "control_totals": TOTALS, + "canonical_content_digest": DIGEST, + }, + "created_at": "2026-09-02T00:00:01Z", + } + + +def _response(receipts: list[dict[str, object]] | None = None) -> dict[str, object]: + receipts = receipts or [] + item = _obligation() + if receipts: + item.update( + reconciliation_status="accepted", + health="complete", + receipt_count=1, + accepted_receipt_count=1, + ) + return { + "status": "completed", + "view": "periods", + "ledger_snapshot_id": ("snapshot-after-receipt" if receipts else "snapshot-before-receipt"), + "ledger_as_of": ("2026-09-02T00:01:01Z" if receipts else "2026-09-02T00:00:06Z"), + "account_id": "account-1", + "scope": { + "period_start": PERIOD["start"], + "period_end": PERIOD["end"], + "scope_closed": True, + "media_buy_ids": ["buy-1", "buy-2"], + "all_accessible_media_buys": False, + "delivery_config_generations": [ + { + "delivery_config_id": "billing-feed", + "delivery_config_version": 1, + "feed_purpose": "billing", + } + ], + "feed_purposes": ["billing"], + "finality": ["official"], + "ledger_retained_from": "2026-07-01T00:00:00Z", + "coverage_complete": True, + }, + "periods": [item], + "revisions": [REVISION], + "materializations": [_materialization()], + "receipts": receipts, + "pagination": {"has_more": False, "total_count": 3 + len(receipts)}, + } + + +class _Client: + def __init__(self) -> None: + self.recorded_receipt: dict[str, object] | None = None + + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + response = _response([self.recorded_receipt] if self.recorded_receipt else []) + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(response), + ) + + async def sync_reporting_receipts( + self, request: SyncReportingReceiptsRequest + ) -> TaskResult[SyncReportingReceiptsResponse]: + self.recorded_receipt = request.receipts[0].model_dump(mode="json", exclude_none=True) + self.recorded_receipt["received_at"] = "2026-09-02T00:01:00Z" + return TaskResult( + status=TaskStatus.COMPLETED, + data=SyncReportingReceiptsResponse.model_validate( + {"results": [{"result": "recorded", "receipt": self.recorded_receipt}]} + ), + ) + + +@pytest.mark.asyncio +async def test_reconciles_billing_and_records_matching_receipt() -> None: + client = _Client() + inspections = 0 + + async def inspect(_: ReportingInspectionContext) -> ReportingObservation: + nonlocal inspections + inspections += 1 + if inspections == 1: + raise OSError("transient warehouse read") + return ReportingObservation( + row_count=7, + control_totals=[ReportingControlTotal.model_validate(item) for item in TOTALS], + canonical_content_digest=ReportingCanonicalContentDigest.model_validate(DIGEST), + consumer_commit_ref="buyer-ledger-42", + ) + + result = await reconcile_reporting( + client, + GetReportingStatusRequest.model_validate( + { + "account": {"account_id": "account-1"}, + "view": "periods", + "period": {"start": PERIOD["start"], "end": PERIOD["end"]}, + } + ), + inspect, + expected_periods=[ + ExpectedReportingPeriod("billing-feed", 1, str(PERIOD["start"]), str(PERIOD["end"])) + ], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + + assert result.definitive + assert inspections == 2 + assert len(result.submitted_receipts) == 1 + assert result.submitted_receipts[0].status.value == "accepted" + assert len(result.totals_by_revision) == 1 + assert result.totals_by_revision[0][0] == REVISION["reporting_revision_id"] + + +@pytest.mark.asyncio +async def test_missing_expected_period_prevents_definitive_result() -> None: + ledger = await load_reporting_ledger( + _Client(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[ + ExpectedReportingPeriod( + "billing-feed", + 1, + "2026-07-01T00:00:00Z", + "2026-08-01T00:00:00Z", + ) + ], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert len(result.missing_expected_periods) == 1 + + +@pytest.mark.asyncio +async def test_missing_denominator_prevents_definitive_result() -> None: + ledger = await load_reporting_ledger( + _Client(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert not result.missing_expected_periods + + +@pytest.mark.asyncio +async def test_incomplete_associated_history_prevents_definitive_result() -> None: + raw = _response() + periods = raw["periods"] + assert isinstance(periods, list) + assert isinstance(periods[0], dict) + periods[0]["revision_count"] = 2 + + class IncompleteClient(_Client): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(deepcopy(raw)), + ) + + ledger = await load_reporting_ledger( + IncompleteClient(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert "ASSOCIATED_HISTORY_INCOMPLETE" in result.obligations[0].reasons + + +@pytest.mark.asyncio +async def test_one_revision_fans_out_without_double_counting_totals() -> None: + raw = _response() + first = _obligation("obligation-a") + second = _obligation("obligation-b") + for item in (first, second): + item.update( + reconciliation_mode="delivery_only", + reconciliation_status="not_required", + health="complete", + ) + raw["periods"] = [first, second] + raw["materializations"] = [ + _materialization("materialization-a", "obligation-a"), + _materialization("materialization-b", "obligation-b"), + ] + raw["pagination"] = {"has_more": False, "total_count": 5} + + class FanoutClient(_Client): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(deepcopy(raw)), + ) + + ledger = await load_reporting_ledger( + FanoutClient(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert result.definitive + assert len(result.totals_by_revision) == 1 + + +@pytest.mark.asyncio +async def test_mismatched_native_producer_evidence_is_not_definitive() -> None: + raw = _response() + obligation = raw["periods"][0] + assert isinstance(obligation, dict) + obligation.update( + reconciliation_mode="delivery_only", + reconciliation_status="not_required", + health="complete", + ) + attempt = raw["materializations"][0] + assert isinstance(attempt, dict) + verification = attempt["verification"] + assert isinstance(verification, dict) + verification.update( + verification_profile="native_commit", + verification_path="representative_consumer", + native_commit_evidence={ + "native_version_ref": "version-incorrect", + "observed_through": "representative_consumer", + }, + ) + verification.pop("canonical_content_digest") + + class NativeMismatchClient(_Client): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(deepcopy(raw)), + ) + + ledger = await load_reporting_ledger( + NativeMismatchClient(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert "PRODUCER_NATIVE_EVIDENCE_MISMATCH" in result.obligations[0].reasons From 1c77fd9551434ab24aaabdebd78bb8759c952a65 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Fri, 28 Aug 2026 10:00:37 +0100 Subject: [PATCH 02/12] fix(reporting): reconcile exact campaign obligations --- src/adcp/reporting.py | 17 ++++++++++ tests/test_reporting_reconciliation.py | 43 +++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/adcp/reporting.py b/src/adcp/reporting.py index 1100b3970..eb83b24ea 100644 --- a/src/adcp/reporting.py +++ b/src/adcp/reporting.py @@ -58,6 +58,10 @@ def __init__(self, code: str, message: str) -> None: class ExpectedReportingPeriod: delivery_config_id: str delivery_config_version: int + report_definition_id: str + feed_purpose: str + reporting_profile: str + media_buy_ids: tuple[str, ...] period_start: str period_end: str @@ -504,6 +508,15 @@ def evaluate_reporting_ledger( ( item.delivery_config_id, item.delivery_config_version, + item.report_definition_id, + _enum(item.feed_purpose), + item.reporting_profile, + tuple( + sorted( + str(getattr(media_buy_id, "root", media_buy_id)) + for media_buy_id in (item.media_buy_ids or []) + ) + ), item.period.start.isoformat(), item.period.end.isoformat(), ) @@ -515,6 +528,10 @@ def evaluate_reporting_ledger( if ( item.delivery_config_id, item.delivery_config_version, + item.report_definition_id, + item.feed_purpose, + item.reporting_profile, + tuple(sorted(item.media_buy_ids)), _iso(item.period_start), _iso(item.period_end), ) diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py index ef747230e..44777e264 100644 --- a/tests/test_reporting_reconciliation.py +++ b/tests/test_reporting_reconciliation.py @@ -240,7 +240,16 @@ async def inspect(_: ReportingInspectionContext) -> ReportingObservation: ), inspect, expected_periods=[ - ExpectedReportingPeriod("billing-feed", 1, str(PERIOD["start"]), str(PERIOD["end"])) + ExpectedReportingPeriod( + "billing-feed", + 1, + "billing-v1", + "billing", + "billing-v1", + ("buy-1", "buy-2"), + str(PERIOD["start"]), + str(PERIOD["end"]), + ) ], now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), ) @@ -267,6 +276,10 @@ async def test_missing_expected_period_prevents_definitive_result() -> None: ExpectedReportingPeriod( "billing-feed", 1, + "billing-v1", + "billing", + "billing-v1", + ("buy-1", "buy-2"), "2026-07-01T00:00:00Z", "2026-08-01T00:00:00Z", ) @@ -277,6 +290,34 @@ async def test_missing_expected_period_prevents_definitive_result() -> None: assert len(result.missing_expected_periods) == 1 +@pytest.mark.asyncio +async def test_same_feed_period_cannot_hide_a_missing_campaign() -> None: + ledger = await load_reporting_ledger( + _Client(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[ + ExpectedReportingPeriod( + "billing-feed", + 1, + "billing-v1", + "billing", + "billing-v1", + ("buy-1", "buy-3"), + str(PERIOD["start"]), + str(PERIOD["end"]), + ) + ], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert len(result.missing_expected_periods) == 1 + + @pytest.mark.asyncio async def test_missing_denominator_prevents_definitive_result() -> None: ledger = await load_reporting_ledger( From 819fd4c4436aac9c7036b4c03744f0ba957921d4 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Fri, 28 Aug 2026 10:03:26 +0100 Subject: [PATCH 03/12] fix(reporting): bind revisions to campaign scope --- src/adcp/reporting.py | 14 ++++----- tests/test_reporting_reconciliation.py | 39 ++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/adcp/reporting.py b/src/adcp/reporting.py index eb83b24ea..eaa2bffab 100644 --- a/src/adcp/reporting.py +++ b/src/adcp/reporting.py @@ -9,7 +9,7 @@ from __future__ import annotations import json -from collections.abc import Awaitable, Callable +from collections.abc import Awaitable, Callable, Iterable from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Protocol, TypeVar @@ -126,6 +126,10 @@ def _enum(value: object) -> str: return str(getattr(value, "value", value)) +def _identifiers(values: Iterable[object] | None) -> tuple[str, ...]: + return tuple(sorted(str(getattr(value, "root", value)) for value in values or [])) + + def _iso(value: str) -> str: return datetime.fromisoformat(value.replace("Z", "+00:00")).isoformat() @@ -313,6 +317,7 @@ def _select_current( revision.account_id != obligation.account_id or revision.report_definition_id != obligation.report_definition_id or revision.reporting_profile != obligation.reporting_profile + or _identifiers(revision.media_buy_ids) != _identifiers(obligation.media_buy_ids) or _json(revision.period) != _json(obligation.period) ): reasons.append("REVISION_SCOPE_MISMATCH") @@ -511,12 +516,7 @@ def evaluate_reporting_ledger( item.report_definition_id, _enum(item.feed_purpose), item.reporting_profile, - tuple( - sorted( - str(getattr(media_buy_id, "root", media_buy_id)) - for media_buy_id in (item.media_buy_ids or []) - ) - ), + _identifiers(item.media_buy_ids), item.period.start.isoformat(), item.period.end.isoformat(), ) diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py index 44777e264..3f678984d 100644 --- a/tests/test_reporting_reconciliation.py +++ b/tests/test_reporting_reconciliation.py @@ -179,7 +179,7 @@ def _response(receipts: list[dict[str, object]] | None = None) -> dict[str, obje "coverage_complete": True, }, "periods": [item], - "revisions": [REVISION], + "revisions": [deepcopy(REVISION)], "materializations": [_materialization()], "receipts": receipts, "pagination": {"has_more": False, "total_count": 3 + len(receipts)}, @@ -254,7 +254,7 @@ async def inspect(_: ReportingInspectionContext) -> ReportingObservation: now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), ) - assert result.definitive + assert result.definitive, result.obligations assert inspections == 2 assert len(result.submitted_receipts) == 1 assert result.submitted_receipts[0].status.value == "accepted" @@ -318,6 +318,39 @@ async def test_same_feed_period_cannot_hide_a_missing_campaign() -> None: assert len(result.missing_expected_periods) == 1 +@pytest.mark.asyncio +async def test_revision_campaign_scope_must_match_obligation() -> None: + raw = _response() + raw["revisions"][0]["media_buy_ids"] = ["buy-1"] + raw["periods"][0].update( + reconciliation_mode="delivery_only", + reconciliation_status="not_required", + ) + + class ScopeMismatchClient(_Client): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(deepcopy(raw)), + ) + + ledger = await load_reporting_ledger( + ScopeMismatchClient(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + assert not result.definitive + assert "REVISION_SCOPE_MISMATCH" in result.obligations[0].reasons + + @pytest.mark.asyncio async def test_missing_denominator_prevents_definitive_result() -> None: ledger = await load_reporting_ledger( @@ -404,7 +437,7 @@ async def get_reporting_status( expected_periods=[], now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), ) - assert result.definitive + assert result.definitive, result.obligations assert len(result.totals_by_revision) == 1 From f48047a0a16aa08879a42b56ce03c4e1e4e993fc Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Fri, 28 Aug 2026 10:07:46 +0100 Subject: [PATCH 04/12] test(reporting): reject consumer evidence mismatches --- tests/test_reporting_reconciliation.py | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py index 3f678984d..990d63216 100644 --- a/tests/test_reporting_reconciliation.py +++ b/tests/test_reporting_reconciliation.py @@ -9,6 +9,7 @@ ExpectedReportingPeriod, ReportingInspectionContext, ReportingObservation, + build_reporting_receipt, evaluate_reporting_ledger, load_reporting_ledger, reconcile_reporting, @@ -262,6 +263,44 @@ async def inspect(_: ReportingInspectionContext) -> ReportingObservation: assert result.totals_by_revision[0][0] == REVISION["reporting_revision_id"] +def test_consumer_billing_mismatch_creates_rejected_receipt() -> None: + response = GetReportingStatusResponse.model_validate(_response()) + receipt = build_reporting_receipt( + ReportingInspectionContext( + response.periods[0], + response.revisions[0], + response.materializations[0], + ), + ReportingObservation( + row_count=8, + control_totals=[ + ReportingControlTotal.model_validate( + { + "name": "impressions", + "value": "4199", + "value_type": "integer", + "unit": "impressions", + } + ), + ReportingControlTotal.model_validate(TOTALS[1]), + ], + canonical_content_digest=ReportingCanonicalContentDigest.model_validate( + {**DIGEST, "value": "d" * 64} + ), + consumer_commit_ref="buyer-ledger-disputed-42", + ), + reporting_receipt_id="reporting-receipt:billing-dispute", + observed_at=datetime.fromisoformat("2026-09-02T00:01:00+00:00"), + ) + + assert receipt.status.value == "rejected" + assert [code.root for code in receipt.rejection_codes or []] == [ + "ROW_COUNT_MISMATCH", + "CONTROL_TOTAL_MISMATCH", + "CANONICAL_DIGEST_MISMATCH", + ] + + @pytest.mark.asyncio async def test_missing_expected_period_prevents_definitive_result() -> None: ledger = await load_reporting_ledger( From 1b3616b25074889bddd56f2e01219e160277f7ee Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Fri, 28 Aug 2026 21:54:16 +0200 Subject: [PATCH 05/12] test(reporting): align generated contract expectations --- scripts/collision_allowlist.json | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/collision_allowlist.json b/scripts/collision_allowlist.json index 61f5aa0b0..6f7325a1e 100644 --- a/scripts/collision_allowlist.json +++ b/scripts/collision_allowlist.json @@ -45,7 +45,6 @@ "CacheScope", "CalibrationExemplars", "Cancellation", - "CanonicalContentDigest", "CanonicalPayload", "Catalog", "CatalogId", From 1c31fcaff0635b43354f9119783e2b1a39d12e7c Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 05:34:06 +0200 Subject: [PATCH 06/12] feat(server): expose durable reporting tools --- src/adcp/decisioning/handler.py | 54 +++++++++++++++++++ src/adcp/decisioning/specialisms/sales.py | 20 +++++++ src/adcp/server/base.py | 18 +++++++ src/adcp/server/builder.py | 4 +- src/adcp/server/mcp_tools.py | 20 +++++++ ...t_decisioning_advertised_per_specialism.py | 31 ++++++++++- tests/test_decisioning_handler_shims.py | 48 +++++++++++++++-- 7 files changed, 189 insertions(+), 6 deletions(-) diff --git a/src/adcp/decisioning/handler.py b/src/adcp/decisioning/handler.py index 81d12c60f..e23972dfa 100644 --- a/src/adcp/decisioning/handler.py +++ b/src/adcp/decisioning/handler.py @@ -174,6 +174,8 @@ GetProductsResponse, GetPropertyListRequest, GetPropertyListResponse, + GetReportingStatusRequest, + GetReportingStatusResponse, GetRightsRequest, GetRightsSuccessResponse, GetSignalsRequest, @@ -208,6 +210,8 @@ SyncCreativesSuccessResponse, SyncPlansRequest, SyncPlansResponse, + SyncReportingReceiptsRequest, + SyncReportingReceiptsResponse, UpdateCollectionListRequest, UpdateCollectionListResponse, UpdateContentStandardsRequest, @@ -310,6 +314,8 @@ def _is_adcp_32_or_newer(version: str | None) -> bool: "sync_creatives", "get_media_buy_delivery", "get_media_buys", + "get_reporting_status", + "sync_reporting_receipts", "provide_performance_feedback", "list_creative_formats", "list_creatives", @@ -1301,6 +1307,12 @@ def advertised_tools_for_instance(self) -> frozenset[str]: for wire_name, adopter_name in _OPTIONAL_LEGACY_WIRE_TO_ADOPTER.items(): if wire_name in serving and not callable(getattr(self._platform, adopter_name, None)): serving.discard(wire_name) + reporting_delivery = getattr(media_buy_caps, "reporting_delivery", None) + for tool_name in ("get_reporting_status", "sync_reporting_receipts"): + if tool_name in serving and ( + reporting_delivery is None or not callable(getattr(self._platform, tool_name, None)) + ): + serving.discard(tool_name) return frozenset(serving) def _log_account_tool_dropped(self, tool_name: str, method_name: str) -> None: @@ -2677,6 +2689,48 @@ async def get_media_buy_delivery( # type: ignore[override] ), ) + async def get_reporting_status( # type: ignore[override] + self, + params: GetReportingStatusRequest, + context: ToolContext | None = None, + ) -> GetReportingStatusResponse: + self._require_platform_method("get_reporting_status") + tool_ctx = context or ToolContext() + account = await self._resolve_account(params.account, tool_ctx) + ctx = self._build_ctx(tool_ctx, account) + return cast( + "GetReportingStatusResponse", + await _invoke_platform_method( + self._platform, + "get_reporting_status", + params, + ctx, + executor=self._executor, + registry=self._registry, + ), + ) + + async def sync_reporting_receipts( # type: ignore[override] + self, + params: SyncReportingReceiptsRequest, + context: ToolContext | None = None, + ) -> SyncReportingReceiptsResponse: + self._require_platform_method("sync_reporting_receipts") + tool_ctx = context or ToolContext() + account = await self._resolve_account(params.account, tool_ctx) + ctx = self._build_ctx(tool_ctx, account) + return cast( + "SyncReportingReceiptsResponse", + await _invoke_platform_method( + self._platform, + "sync_reporting_receipts", + params, + ctx, + executor=self._executor, + registry=self._registry, + ), + ) + # ----- Optional sales tools (gated by capabilities + override) ----- async def get_media_buys( # type: ignore[override] diff --git a/src/adcp/decisioning/specialisms/sales.py b/src/adcp/decisioning/specialisms/sales.py index 6bd0d5bdc..a42087311 100644 --- a/src/adcp/decisioning/specialisms/sales.py +++ b/src/adcp/decisioning/specialisms/sales.py @@ -70,6 +70,8 @@ GetMediaBuysResponse, GetProductsRequest, GetProductsResponse, + GetReportingStatusRequest, + GetReportingStatusResponse, ListCreativesRequest, ListCreativesResponse, ListProductsRequest, @@ -84,6 +86,8 @@ SyncCatalogsSuccessResponse, SyncCreativesRequest, SyncCreativesSuccessResponse, + SyncReportingReceiptsRequest, + SyncReportingReceiptsResponse, UpdateMediaBuyRequest, UpdateMediaBuySuccessResponse, ) @@ -306,6 +310,22 @@ def get_media_buy_delivery( """Sync delivery read — pacing, spend, impressions per package.""" ... + def get_reporting_status( + self, + req: GetReportingStatusRequest, + ctx: RequestContext[TMeta], + ) -> MaybeAsync[GetReportingStatusResponse]: + """Reconcile the caller's durable reporting ledger.""" + ... + + def sync_reporting_receipts( + self, + req: SyncReportingReceiptsRequest, + ctx: RequestContext[TMeta], + ) -> MaybeAsync[SyncReportingReceiptsResponse]: + """Record caller verification receipts for materialized reports.""" + ... + # ---- Optional (gated by specialism — present-or-absent) ---- def get_media_buys( diff --git a/src/adcp/server/base.py b/src/adcp/server/base.py index 03be633ec..a5fb8e4d9 100644 --- a/src/adcp/server/base.py +++ b/src/adcp/server/base.py @@ -59,6 +59,7 @@ GetPlanAuditLogsRequest, GetProductsRequest, GetPropertyListRequest, + GetReportingStatusRequest, GetRightsRequest, GetSignalsRequest, GetTaskStatusRequest, @@ -91,6 +92,7 @@ SyncEventSourcesRequest, SyncGovernanceRequest, SyncPlansRequest, + SyncReportingReceiptsRequest, UpdateCollectionListRequest, UpdateContentStandardsRequest, UpdateMediaBuyRequest, @@ -487,6 +489,22 @@ async def get_media_buy_delivery( """ return self._not_supported("get_media_buy_delivery") + async def get_reporting_status( + self, + params: GetReportingStatusRequest | dict[str, Any], + context: TContext | None = None, + ) -> Any: + """Get the caller-scoped durable reporting ledger status.""" + return self._not_supported("get_reporting_status") + + async def sync_reporting_receipts( + self, + params: SyncReportingReceiptsRequest | dict[str, Any], + context: TContext | None = None, + ) -> Any: + """Record caller verification receipts for reporting materializations.""" + return self._not_supported("sync_reporting_receipts") + async def get_media_buys( self, params: GetMediaBuysRequest | dict[str, Any], context: TContext | None = None ) -> Any: diff --git a/src/adcp/server/builder.py b/src/adcp/server/builder.py index 0d3d49a42..d08ca1fd7 100644 --- a/src/adcp/server/builder.py +++ b/src/adcp/server/builder.py @@ -42,6 +42,8 @@ async def capabilities(params, context=None): "update_media_buy": "media_buy", "get_media_buys": "media_buy", "get_media_buy_delivery": "media_buy", + "get_reporting_status": "media_buy", + "sync_reporting_receipts": "media_buy", "provide_performance_feedback": "media_buy", "list_creative_formats": "media_buy", "sync_creatives": "media_buy", @@ -179,7 +181,7 @@ def decorator(fn: Callable[..., Any]) -> Callable[..., Any]: ) wire_name = LEGACY_ADOPTER_TO_WIRE.get(task_name, task_name) if wire_name not in HANDLER_TO_DOMAIN and wire_name != "get_adcp_capabilities": - raise ValueError(f"'{task_name}' is not a known ADCP task. " f"Check for typos.") + raise ValueError(f"'{task_name}' is not a known ADCP task. Check for typos.") self._handlers[task_name] = fn return fn diff --git a/src/adcp/server/mcp_tools.py b/src/adcp/server/mcp_tools.py index 1827a35cb..57770ea4e 100644 --- a/src/adcp/server/mcp_tools.py +++ b/src/adcp/server/mcp_tools.py @@ -389,6 +389,18 @@ def _widen_media_buy_output_schema_for_legacy_statuses( "required": ["media_buy_id"], }, }, + { + "name": "get_reporting_status", + "description": "Reconcile caller-scoped reporting obligations, revisions, materializations, and receipts.", + "annotations": _RO, + "inputSchema": {"type": "object", "properties": {}}, + }, + { + "name": "sync_reporting_receipts", + "description": "Record accepted or rejected verification receipts for reporting materializations.", + "annotations": _MUT, + "inputSchema": {"type": "object", "properties": {}}, + }, { "name": "get_media_buys", "description": "List media buys with status, packages, and optional delivery snapshots. Filter by media_buy_ids.", @@ -1615,6 +1627,7 @@ def _generate_pydantic_schemas( GetPlanAuditLogsRequest, GetProductsRequest, GetPropertyListRequest, + GetReportingStatusRequest, GetRightsRequest, GetSignalsRequest, GetTaskStatusRequest, @@ -1647,6 +1660,7 @@ def _generate_pydantic_schemas( SyncEventSourcesRequest, SyncGovernanceRequest, SyncPlansRequest, + SyncReportingReceiptsRequest, UpdateCollectionListRequest, UpdateContentStandardsRequest, UpdateMediaBuyRequest, @@ -1692,6 +1706,8 @@ def _generate_pydantic_schemas( "update_media_buy": UpdateMediaBuyRequest, "get_media_buy_delivery": GetMediaBuyDeliveryRequest, "get_media_buys": GetMediaBuysRequest, + "get_reporting_status": GetReportingStatusRequest, + "sync_reporting_receipts": SyncReportingReceiptsRequest, # Signals "get_signals": GetSignalsRequest, "activate_signal": ActivateSignalRequest, @@ -1831,6 +1847,7 @@ def _generate_pydantic_output_schemas( GetPlanAuditLogsResponse, GetProductsResponse, GetPropertyListResponse, + GetReportingStatusResponse, GetRightsResponse, GetSignalsResponse, GetTaskStatusResponse, @@ -1863,6 +1880,7 @@ def _generate_pydantic_output_schemas( SyncEventSourcesResponse, SyncGovernanceResponse, SyncPlansResponse, + SyncReportingReceiptsResponse, UpdateCollectionListResponse, UpdateContentStandardsResponse, UpdateMediaBuyResponse, @@ -1909,6 +1927,8 @@ def _generate_pydantic_output_schemas( "update_media_buy": UpdateMediaBuyResponse, "get_media_buy_delivery": GetMediaBuyDeliveryResponse, "get_media_buys": GetMediaBuysResponse, + "get_reporting_status": GetReportingStatusResponse, + "sync_reporting_receipts": SyncReportingReceiptsResponse, # Signals "get_signals": GetSignalsResponse, "activate_signal": ActivateSignalResponse, diff --git a/tests/test_decisioning_advertised_per_specialism.py b/tests/test_decisioning_advertised_per_specialism.py index 4bb39f8ff..2cab47b93 100644 --- a/tests/test_decisioning_advertised_per_specialism.py +++ b/tests/test_decisioning_advertised_per_specialism.py @@ -24,6 +24,7 @@ InMemoryTaskRegistry, SingletonAccounts, ) +from adcp.decisioning.capabilities import MediaBuy from adcp.decisioning.handler import ( SPECIALISM_TO_ADVERTISED_TOOLS, PlatformHandler, @@ -90,6 +91,19 @@ def get_media_buy_delivery(self, req, ctx): return {"media_buy_deliveries": []} +class _ReportingPlatform(_SalesOnlyPlatform): + capabilities = DecisioningCapabilities( + specialisms=["sales-non-guaranteed"], + media_buy=MediaBuy.model_construct(reporting_delivery=object()), + ) + + def get_reporting_status(self, req, ctx): + return {"view": "summary"} + + def sync_reporting_receipts(self, req, ctx): + return {"results": []} + + class _SignalsOnlyPlatform(DecisioningPlatform): capabilities = DecisioningCapabilities(specialisms=["signal-marketplace"]) accounts = SingletonAccounts(account_id="signals-only") @@ -171,9 +185,22 @@ def test_sales_only_does_not_advertise_creative_or_signals_tools(executor) -> No "create_collection_list", } leaked = forbidden & tools - assert not leaked, ( - f"sales-only adopter leaked non-sales tools to tools/list: " f"{sorted(leaked)}" + assert not leaked, f"sales-only adopter leaked non-sales tools to tools/list: {sorted(leaked)}" + + +def test_reporting_tools_require_capability_and_platform_methods(executor) -> None: + baseline = PlatformHandler( + _SalesOnlyPlatform(), executor=executor, registry=InMemoryTaskRegistry() + ) + baseline_tools = {tool["name"] for tool in get_tools_for_handler(baseline)} + assert "get_reporting_status" not in baseline_tools + assert "sync_reporting_receipts" not in baseline_tools + + reporting = PlatformHandler( + _ReportingPlatform(), executor=executor, registry=InMemoryTaskRegistry() ) + reporting_tools = {tool["name"] for tool in get_tools_for_handler(reporting)} + assert {"get_reporting_status", "sync_reporting_receipts"} <= reporting_tools def test_signals_only_does_not_advertise_sales_tools(executor) -> None: diff --git a/tests/test_decisioning_handler_shims.py b/tests/test_decisioning_handler_shims.py index 2d558ee19..35613256e 100644 --- a/tests/test_decisioning_handler_shims.py +++ b/tests/test_decisioning_handler_shims.py @@ -69,6 +69,8 @@ def test_advertised_tools_covers_every_specialism_wire_tool() -> None: "sync_creatives", "get_media_buy_delivery", "get_media_buys", + "get_reporting_status", + "sync_reporting_receipts", "provide_performance_feedback", "list_creative_formats", "list_creatives", @@ -177,9 +179,9 @@ def test_handler_shim_method_exists(tool_name: str) -> None: """Every advertised non-sales tool has a corresponding shim method on PlatformHandler. Without this, ``tools/list`` advertises tools the handler can't actually dispatch — buyer-facing 404.""" - assert hasattr( - PlatformHandler, tool_name - ), f"PlatformHandler is missing the {tool_name!r} shim — advertised but undispatchable." + assert hasattr(PlatformHandler, tool_name), ( + f"PlatformHandler is missing the {tool_name!r} shim — advertised but undispatchable." + ) # ---- Shim dispatch via stub platforms ---- @@ -522,6 +524,46 @@ def sync_catalogs(self, req, ctx): assert received_req[0] is req +@pytest.mark.asyncio +async def test_reporting_shims_resolve_account_and_pass_full_requests(executor) -> None: + from adcp.decisioning.capabilities import MediaBuy + from adcp.types import GetReportingStatusRequest, SyncReportingReceiptsRequest + + calls = [] + + class _ReportingAgent(DecisioningPlatform): + capabilities = DecisioningCapabilities( + specialisms=["sales-non-guaranteed"], + media_buy=MediaBuy.model_construct(reporting_delivery=object()), + ) + accounts = SingletonAccounts(account_id="hello") + + def get_reporting_status(self, req, ctx): + calls.append(("status", req, ctx.account.id)) + return {"view": "summary"} + + def sync_reporting_receipts(self, req, ctx): + calls.append(("receipts", req, ctx.account.id)) + return {"results": []} + + handler = PlatformHandler(_ReportingAgent(), executor=executor, registry=InMemoryTaskRegistry()) + status_request = GetReportingStatusRequest(account={"account_id": "hello"}, view="summary") + receipt_request = SyncReportingReceiptsRequest.model_construct( + account=status_request.account, + idempotency_key="receipt-batch-0001", + receipts=[], + ) + + tool_context = ToolContext(caller_identity="buyer-agent") + await handler.get_reporting_status(status_request, tool_context) + await handler.sync_reporting_receipts(receipt_request, tool_context) + + assert calls == [ + ("status", status_request, "hello:anonymous"), + ("receipts", receipt_request, "hello:anonymous"), + ] + + @pytest.mark.asyncio async def test_sync_catalogs_discovery_mode_passes_none_catalogs(executor) -> None: """Discovery mode (``req.catalogs is None``) passes the request From 189d20bb64cbece4fc9435e20b1beb9df8c3f023 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 06:43:22 +0200 Subject: [PATCH 07/12] feat(reporting): sync final reconciliation contracts --- .../account/sync-accounts-request.json | 42 +- .../account/sync-accounts-response.json | 45 +- schemas/cache/3.2.0-beta.6/core/account.json | 35 +- .../core/notification-config.json | 9 +- .../reporting-canonical-content-digest.json | 40 + .../reporting-canonicalization-contract.json | 88 + .../core/reporting-control-total.json | 39 + .../reporting-dataset-share-destination.json | 107 + .../core/reporting-delivery-capabilities.json | 77 + .../core/reporting-delivery-config-state.json | 191 + .../core/reporting-delivery-config.json | 156 + .../core/reporting-delivery-method.json | 129 + .../core/reporting-delivery-offering.json | 371 + .../reporting-delivery-ready-webhook.json | 113 + .../core/reporting-file-compression.json | 13 + .../core/reporting-file-entry.json | 42 + .../core/reporting-file-manifest.json | 121 + .../core/reporting-materialization.json | 300 + .../core/reporting-obligation.json | 354 + .../3.2.0-beta.6/core/reporting-receipt.json | 196 + .../core/reporting-reconciliation-mode.json | 11 + .../core/reporting-report-definition.json | 297 + .../3.2.0-beta.6/core/reporting-resource.json | 119 + .../3.2.0-beta.6/core/reporting-revision.json | 277 + .../core/reporting-schedule-offering.json | 127 + .../3.2.0-beta.6/core/reporting-schedule.json | 84 + .../core/reporting-status-issue.json | 109 + .../core/reporting-verification-profile.json | 12 + .../core/reporting-verification.json | 164 + .../core/reporting-write-destination.json | 76 + .../3.2.0-beta.6/core/x-entity-types.json | 28 + .../3.2.0-beta.6/enums/notification-type.json | 8 +- .../enums/reporting-finality.json | 14 + .../3.2.0-beta.6/enums/reporting-health.json | 20 + .../cache/3.2.0-beta.6/enums/task-type.json | 6 +- schemas/cache/3.2.0-beta.6/index.json | 1254 +-- .../get-reporting-status-request.json | 230 + .../get-reporting-status-response.json | 758 ++ .../sync-reporting-receipts-request.json | 66 + .../sync-reporting-receipts-response.json | 127 + .../get-adcp-capabilities-response.json | 65 + scripts/consolidate_exports.py | 16 + scripts/generate_types.py | 27 +- src/adcp/types/__init__.py | 40 + src/adcp/types/_eager.py | 40 + src/adcp/types/capabilities.py | 19 +- .../reporting_canonical_content_digest.py | 11 +- .../reporting_canonicalization_contract.py | 56 + .../reporting_dataset_share_destination.py | 6 +- .../core/reporting_delivery_config.py | 11 +- .../core/reporting_delivery_config_state.py | 6 +- .../core/reporting_delivery_offering.py | 37 +- .../core/reporting_materialization.py | 6 +- .../core/reporting_obligation.py | 17 +- .../core/reporting_report_definition.py | 160 + .../generated_poc/core/reporting_revision.py | 38 +- .../generated_poc/core/reporting_schedule.py | 18 +- .../core/reporting_schedule_offering.py | 50 + .../core/reporting_write_destination.py | 6 +- .../sync_reporting_receipts_request.py | 10 +- .../sync_reporting_receipts_response.py | 14 +- src/adcp/types/v32.pyi | 6767 ++++++++++++----- tests/test_reporting_reconciliation.py | 60 + 63 files changed, 11226 insertions(+), 2509 deletions(-) create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-control-total.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-materialization.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-obligation.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-receipt.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-resource.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-revision.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-schedule.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-verification.json create mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json create mode 100644 schemas/cache/3.2.0-beta.6/enums/reporting-finality.json create mode 100644 schemas/cache/3.2.0-beta.6/enums/reporting-health.json create mode 100644 schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json create mode 100644 schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json create mode 100644 schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json create mode 100644 schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json create mode 100644 src/adcp/types/generated_poc/core/reporting_canonicalization_contract.py create mode 100644 src/adcp/types/generated_poc/core/reporting_report_definition.py create mode 100644 src/adcp/types/generated_poc/core/reporting_schedule_offering.py diff --git a/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json b/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json index 28682a18a..d3499253c 100644 --- a/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json +++ b/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json @@ -6,7 +6,7 @@ "type": "object", "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/version-envelope.json" + "$ref": "../core/version-envelope.json" } ], "x-mutates-state": true, @@ -26,7 +26,7 @@ "description": "An advertiser account entry \u2014 either provisions/upserts a new account (natural key) or updates an existing one (AccountRef key).", "properties": { "account": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-ref.json", + "$ref": "../core/account-ref.json", "description": "Settings-update key. When present, this entry targets an existing account by `account_id` (seller-owned account namespace) or natural key (buyer-declared account settings-update against a previously-provisioned account). Mutually exclusive with the flat `brand` + `operator` + `billing` provisioning trio. When `account` is present, the seller MUST NOT create a new account \u2014 entries that would otherwise trigger provisioning are rejected with `UNSUPPORTED_PROVISIONING`." }, "revision": { @@ -35,15 +35,15 @@ "description": "Expected current account revision for optimistic concurrency in settings-update mode. Required whenever operator_identity is present; optional for existing non-identity settings updates. The seller MUST compare it atomically with the write, reject a mismatch with CONFLICT, and leave the account unchanged. Obtain it from list_accounts or the most recent sync_accounts result. Reads, dry runs, validation failures, and exact idempotency replays do not increment revision; every persisted settings or identity-change state transition does. MUST be absent in provisioning mode." }, "operator_identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-identity.json", + "$ref": "../core/operator-identity.json", "description": "Complete desired operator identity for settings-update mode. Omit this field to leave operator identity unchanged. When present, omission of operator_unit within the object removes the existing unit. Changing only operator_unit.name updates display metadata; changing operator_unit.id or adding/removing a unit rekeys the same account within the current operator. Changing operator requests an inter-entity handoff and MUST enter pending_approval until the seller verifies the current account authority, verified brand authorization, destination-operator acceptance, and any operator-scoped billing and grant transition. The seller MUST preserve account_id and account-scoped historical resources, MUST reject collisions without merging, and MUST apply no identity change if continuity cannot be preserved. MUST be accompanied by revision and MUST be absent in provisioning mode." }, "destination_billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", + "$ref": "../core/business-entity.json", "description": "Complete staged billing identity for the requested destination operator during an operator-domain handoff on an account whose billing party is operator. This value is write-only while approval is pending and MUST NOT replace or be echoed as the account's canonical billing_entity until the handoff applies atomically. Required by the protocol when an operator-billed account changes operator; otherwise MUST be absent. Requires operator_identity and revision and MUST be absent in provisioning mode." }, "brand": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", + "$ref": "../core/brand-ref.json", "description": "Brand reference identifying the advertiser. Required for **provisioning mode**; MUST be absent in settings-update mode. Only the BrandKey projection \u2014 `domain`, `brand_id`, and the canonicalized `countries[]` set \u2014 participates in account identity. Mutable or per-call BrandRef fields such as `industries`, `data_subject_contestation`, and `brand_kit_override` MUST NOT affect lookup, idempotency, or account creation. New 3.2 producers SHOULD send only the BrandKey fields; the broader BrandRef remains accepted on this existing 3.x task for compatibility." }, "operator": { @@ -52,7 +52,7 @@ "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", + "$ref": "../core/operator-unit.json", "description": "Optional operator-owned business unit, agency seat, or platform account for provisioning mode. operator_unit.id participates in the natural key; name is mapping/display metadata. MUST be absent in settings-update mode." }, "currency": { @@ -66,15 +66,15 @@ "description": "Immutable operational timezone selected for an account_fixed advertiser object. Required in provisioning mode when get_adcp_capabilities.account.timezone declares account_selection: buyer_selected, and the value MUST be one of supported_timezones. Omit for seller_fixed or seller_assigned modes. When supplied, it participates in the natural key. MUST be absent in settings-update mode." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", + "$ref": "../enums/billing-party.json", "description": "Who the seller invoices for this buyer\u2013storefront account relationship. Required for **provisioning mode**; MUST be absent in settings-update mode (the invoiced party is fixed at provisioning time and cannot be changed via settings-update). This field does not select a payment rail, clearing intermediary, or per-media-buy settlement route." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", + "$ref": "../core/business-entity.json", "description": "Business entity details for the party responsible for payment. The agent provides this so the seller has the legal name, tax IDs, address, and bank details needed for formal B2B invoicing. Permitted in both modes \u2014 sellers MAY accept refinements in settings-update mode (e.g., updated bank details)." }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", + "$ref": "../enums/payment-terms.json", "description": "Payment terms for this account. The seller must either accept these terms or reject the account \u2014 terms are never silently remapped. When omitted, the seller applies its default terms. Permitted in both modes." }, "sandbox": { @@ -82,16 +82,30 @@ "description": "When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to buyer-declared accounts (require_operator_auth: false) in provisioning mode. For account-id namespaces, sandbox accounts are pre-existing test accounts discovered via list_accounts or supplied out-of-band." }, "preferred_reporting_protocol": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/cloud-storage-protocol.json", + "$ref": "../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'." }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. Each generation binds the exact report_definition_id advertised by its offering. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller-scoped immutable destination-generation reference, including one registered through sync_agent_configuration. The account configuration independently authorizes disclosure for this feed and scope, so possession of a reusable reference is never account authority. Unknown, unauthorized, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + "items": { + "$ref": "../core/reporting-delivery-config.json" + }, + "maxItems": 16, + "x-adcp-validation": { + "unique_config_generation": "Reject the account entry when two items share delivery_config_id and delivery_config_version.", + "immutable_generation": "A previously observed tuple must retain identical feed/profile/scope/finality/schedule/method/destination content. Only active and revocation_effective_at are mutable lifecycle intent.", + "authorization": "Verify authenticated-caller authority for the account, requested reporting scope, recipient, and destination before applying." + } + }, "notification_configs": { "type": "array", "description": "Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, optional `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, wholesale feed change payloads, and future account-anchored resource events after those event types are added to `notification-config.json`). Indicator and assignment registrations are prospective: activation does not replay current conditions, so buyers establish a complete baseline through `get_media_buys` by enumerating known IDs or requesting every status and exhausting pagination, without an indicator filter. Durable account lifecycle transitions such as later `payment_required`, `suspended`, `closed`, or recovery to `active` use `account.status_changed` on this surface; the one-shot `sync_accounts.push_notification_config` channel remains scoped to the async result of the original provisioning task. Declarative replace semantics: when this field is present, the buyer sends the full desired array and the seller replaces the account's current set with that array, keyed by account-scoped `subscriber_id`. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Re-sending an existing `subscriber_id` for the account replaces that subscriber's config rather than creating a duplicate; persisted entries whose `subscriber_id` does not appear in the sent array are removed, so the seller MUST NOT merge the new array with persisted state. Paused entries (`active: false`) use the same replacement semantics; a buyer that wants to preserve a paused subscriber MUST re-include it with `active: false`. Duplicate `subscriber_id` values within one submitted array are rejected. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth \u2014 see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) or at the agent (today: `capabilities.changed`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry \u2014 those events do not belong on this surface. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; canonical product subscribers repair through `list_products(if_feed_version)`, legacy product subscribers through `get_products(if_wholesale_feed_version)`, and signal subscribers through `get_signals(if_wholesale_feed_version)`. Account status change registrations carry the invalidation payload in `/schemas/core/account-status-changed-webhook.json`; receivers use `list_accounts` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.\n\nActivation proof: before activating a new or changed active subscriber, the seller MUST validate the URL, complete the account-level webhook proof-of-control challenge, and only then persist or expose the subscriber as `active: true`. For `account.status_changed`, sellers MUST assign `account_id` before completing proof so subsequent status transitions can identify the account and be repaired through `list_accounts`, even when external approval remains pending. A valid existing proof for the same `(account_id, subscriber_id, normalized url, authentication mode/credential binding, normalized event_types)` tuple MAY be reused; changing any element of that tuple requires fresh proof. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key and MUST include seller_agent_url, delivery_auth, and event_types so the receiver can verify the pending registration before echoing the challenge. New signers use `adcp_use: \"request-signing\"`; deprecated `webhook-signing` keys remain accepted during the compatibility window. Entries sent with `active: false` may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time, and those entries MUST NOT receive fires until reactivated. If proof fails or times out, the seller rejects the account entry with `action: \"failed\"`, leaves the prior notification_configs[] set unchanged, and reports `VALIDATION_ERROR` (or `INVALID_REQUEST` for malformed URLs) at the failing `notification_configs[j].url` field.\n\n**Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.", "items": { "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" + "$ref": "../core/notification-config.json" }, { "if": { @@ -230,14 +244,14 @@ "description": "When true, preview what would change without applying. Returns what would be created/updated/deactivated." }, "push_notification_config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/push-notification-config.json", + "$ref": "../core/push-notification-config.json", "description": "Webhook for async notifications when account status changes (e.g., pending_approval transitions to active)." }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" + "$ref": "../core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" + "$ref": "../core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json b/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json index 8e66a593e..d0a9f565b 100644 --- a/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json +++ b/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json @@ -5,10 +5,10 @@ "type": "object", "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/version-envelope.json" + "$ref": "../core/version-envelope.json" }, { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/protocol-envelope.json" + "$ref": "../core/protocol-envelope.json" } ], "oneOf": [ @@ -33,7 +33,7 @@ "x-entity": "account" }, "brand": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", + "$ref": "../core/brand-ref.json", "description": "Current canonical brand reference for the account." }, "operator": { @@ -41,7 +41,7 @@ "description": "Current canonical operator domain. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", + "$ref": "../core/operator-unit.json", "description": "Current canonical operator-owned business unit, agency seat, or platform account. The stable id participates in the natural key; name is mutable display metadata. This is distinct from the seller/storefront account_id. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "revision": { @@ -50,11 +50,11 @@ "description": "Current account revision after this operation. Incremented by each persisted settings change, identity-change request, or identity-change disposition; not incremented by dry runs, validation failures, or exact idempotency replays. Pass this value in the next settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", + "$ref": "../core/account-identity-change.json", "description": "Pending or rejected desired operator identity. The top-level operator and operator_unit remain canonical until an approved change is applied." }, "identity_change_preview": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change-preview.json", + "$ref": "../core/account-identity-change-preview.json", "description": "Dry-run-only preview of whether the requested identity would apply, require approval, or be blocked, plus evaluated resource impacts. This value is not persisted; canonical fields and revision remain current." }, "currency": { @@ -94,11 +94,11 @@ "description": "Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). rejected: seller declined the account request. payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: was active, now terminated." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", + "$ref": "../enums/billing-party.json", "description": "Who is invoiced on this account. Matches the requested billing model." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", + "$ref": "../core/business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Sellers MAY add verified fields, but MUST NOT return data from a different entity. During an operator-domain handoff this remains the current entity until approval applies atomically; destination_billing_entity is staged and write-only. Bank details are omitted (write-only)." }, "destination_billing_entity": { @@ -106,7 +106,7 @@ "not": {} }, "account_scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/account-scope.json" + "$ref": "../enums/account-scope.json" }, "setup": { "type": "object", @@ -137,7 +137,7 @@ "description": "Rate card applied to this account" }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", + "$ref": "../enums/payment-terms.json", "description": "Payment terms agreed for this account. When the account is active, these are the binding terms for all invoices on this account." }, "credit_limit": { @@ -161,7 +161,7 @@ "type": "array", "description": "Per-account errors (only present when action is 'failed')", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json" + "$ref": "../core/error.json" } }, "warnings": { @@ -179,12 +179,21 @@ "type": "array", "description": "Applied notification subscribers for this account after declarative replacement and activation-proof checks. Present on `created`, `updated`, and `unchanged` results when the buyer included `notification_configs` in the request or any persisted entries exist on the account. Entries are keyed by account-scoped `subscriber_id`; re-sending an existing `subscriber_id` replaces that subscriber's config rather than creating a duplicate. Only configs that the seller has persisted are echoed. `authentication.credentials` is omitted on every entry (write-only).", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" + "$ref": "../core/notification-config.json" + }, + "maxItems": 16 + }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Resolved caller-owned durable reporting delivery configurations after declarative replacement. Each item echoes desired state and reports validation/setup state plus the seller-issued destination_ref when resolved. A setup action may direct an authenticated user to complete a provider grant or Open Sharing activation, but MUST NOT carry credentials or a bearer URL.", + "items": { + "$ref": "../core/reporting-delivery-config-state.json" }, "maxItems": 16 }, "authorization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-authorization.json", + "$ref": "../core/account-authorization.json", "description": "Optional. The caller's scope grant against this account after the sync operation. Vendor agents of any type (media-buy, signals, governance, creative, brand) that support scope introspection SHOULD populate this so callers can preempt RBAC errors rather than discovering scope by trial and error. Media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Present on `created`, `updated`, and `unchanged` results; omitted on `failed` results (where the account did not reach a usable state). Absence means the vendor agent does not advertise introspectable scope \u2014 callers MUST NOT infer access from absence." } }, @@ -211,10 +220,10 @@ } }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" + "$ref": "../core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" + "$ref": "../core/ext.json" } }, "required": [ @@ -276,15 +285,15 @@ "type": "array", "description": "Operation-level errors (e.g., authentication failure, service unavailable)", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json" + "$ref": "../core/error.json" }, "minItems": 1 }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" + "$ref": "../core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" + "$ref": "../core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/account.json b/schemas/cache/3.2.0-beta.6/core/account.json index 6c4521dea..50c841733 100644 --- a/schemas/cache/3.2.0-beta.6/core/account.json +++ b/schemas/cache/3.2.0-beta.6/core/account.json @@ -22,11 +22,11 @@ "description": "Optional intermediary who receives invoices on behalf of the advertiser (e.g., agency)" }, "status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/account-status.json", + "$ref": "../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": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", + "$ref": "brand-ref.json", "description": "Brand reference identifying the advertiser" }, "operator": { @@ -36,7 +36,7 @@ "x-entity": "operator" }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", + "$ref": "operator-unit.json", "description": "Operator-owned business unit, agency seat, or platform account associated with this advertiser account. The id round-trips from the natural key; name is mutable display metadata. This is distinct from account_id, which belongs to the seller/storefront namespace." }, "revision": { @@ -45,7 +45,7 @@ "description": "Monotonically increasing optimistic-concurrency token for this account. Incremented on every persisted settings change, identity-change request, and identity-change disposition; reads, dry runs, validation failures, and exact idempotency replays do not increment it. Pass the latest observed value in a sync_accounts settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", + "$ref": "account-identity-change.json", "description": "Pending or rejected operator-identity transition. While present, the top-level operator and operator_unit remain the current canonical identity. Re-read list_accounts until the request is applied (canonical fields change and this object disappears) or rejected." }, "currency": { @@ -59,11 +59,11 @@ "description": "Immutable operational timezone for this account, expressed as UTC or an IANA timezone identifier. AdCP 3.2 sellers return it on every account. It is the default calendar-day boundary for account-scoped behavior unless a feature explicitly declares another timezone basis. For buyer-selected account_fixed provisioning it participates in the natural account key." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", + "$ref": "../enums/billing-party.json", "description": "Who is invoiced on this account. See billing_entity for the invoiced party's business details." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", + "$ref": "business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Contains the legal name, tax IDs, and address 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 and the request-only destination_billing_entity MUST NOT be exposed." }, "destination_billing_entity": { @@ -75,7 +75,7 @@ "description": "Identifier for the rate card applied to this account" }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", + "$ref": "../enums/payment-terms.json", "description": "Payment terms agreed for this account. Binding for all invoices when the account is active." }, "credit_limit": { @@ -121,7 +121,7 @@ "additionalProperties": true }, "account_scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/account-scope.json" + "$ref": "../enums/account-scope.json" }, "governance_agents": { "type": "array", @@ -149,7 +149,7 @@ "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).", "properties": { "protocol": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/cloud-storage-protocol.json", + "$ref": "../enums/cloud-storage-protocol.json", "description": "Cloud storage protocol" }, "bucket": { @@ -230,9 +230,18 @@ }, "notification_configs": { "type": "array", - "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, and wholesale feed changes. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. Indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", + "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, wholesale feed changes, and reporting.delivery_ready. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. reporting.delivery_ready is repaired through get_reporting_status; indicator and assignment payloads are repaired through get_media_buys. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" + "$ref": "notification-config.json" + }, + "maxItems": 16 + }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Resolved durable reporting delivery configurations owned by the authenticated caller for this account. list_accounts MUST expose only the calling principal's set. State and seller-issued destination_ref are returned; credentials and bearer profiles MUST NOT appear. Any setup URL is a secret-free authenticated entry point, not a bearer credential.", + "items": { + "$ref": "reporting-delivery-config-state.json" }, "maxItems": 16 }, @@ -240,12 +249,12 @@ "type": "array", "description": "Recent webhook delivery attempts scoped to this account when the caller requested webhook activity on list_accounts and the seller surfaces the log. Includes account-anchored notifications such as account.status_changed and MAY include other account-level fires relevant to this account. Three-state presence follows the shared webhook_activity[] contract: omitted means unsupported or not requested, [] means supported but no retained fires, non-empty lists recent attempts most-recent-first.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-activity-record.json" + "$ref": "webhook-activity-record.json" }, "maxItems": 200 }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" + "$ref": "ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/notification-config.json b/schemas/cache/3.2.0-beta.6/core/notification-config.json index dbdda2dc0..104d9f166 100644 --- a/schemas/cache/3.2.0-beta.6/core/notification-config.json +++ b/schemas/cache/3.2.0-beta.6/core/notification-config.json @@ -18,7 +18,7 @@ }, "event_types": { "type": "array", - "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, and wholesale feed events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", + "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, wholesale feed, and reporting.delivery_ready events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", "items": { "type": "string", "enum": [ @@ -35,7 +35,8 @@ "signal.updated", "signal.priced", "signal.removed", - "wholesale_feed.bulk_change" + "wholesale_feed.bulk_change", + "reporting.delivery_ready" ] }, "minItems": 1, @@ -58,7 +59,7 @@ "schemes": { "type": "array", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/auth-scheme.json" + "$ref": "../enums/auth-scheme.json" }, "minItems": 1, "maxItems": 1 @@ -80,7 +81,7 @@ "description": "When false, the seller persists the configuration but suppresses fires. Use to pause a noisy subscriber without losing the registration. Sellers MUST NOT skip persisting the entry when `active: false` \u2014 the buyer's next `sync_accounts` MUST observe the same array, otherwise the buyer cannot distinguish pause from drop. Paused configs may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time. Reactivation requires full SSRF validation with connect pinning plus proof-of-control for any tuple without current valid proof." }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" + "$ref": "ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json b/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json new file mode 100644 index 000000000..472183927 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Canonical Content Digest", + "x-status": "experimental", + "description": "Cryptographic digest of logical reporting rows under an immutable canonicalization contract.", + "type": "object", + "properties": { + "algorithm": { + "type": "string", + "const": "sha256" + }, + "value": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + }, + "canonicalization_id": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "canonicalization_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", + "description": "Location of the exact immutable canonicalization contract. Consumers verify canonicalization_sha256 before applying it." + }, + "canonicalization_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + } + }, + "required": [ + "algorithm", + "value", + "canonicalization_id", + "canonicalization_uri", + "canonicalization_sha256" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json b/schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json new file mode 100644 index 000000000..0ab27fc34 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Canonicalization Contract", + "x-status": "experimental", + "description": "Executable, immutable contract for producing the canonical logical-report bytes hashed by reporting-canonical-content-digest.json. The fetched document uses application/vnd.adcp.reporting-canonicalization+json and is verified by SHA-256 before parsing.", + "type": "object", + "properties": { + "contract_version": { + "type": "string", + "const": "1.0" + }, + "media_type": { + "type": "string", + "const": "application/vnd.adcp.reporting-canonicalization+json" + }, + "algorithm": { + "type": "string", + "const": "adcp_jcs_rows_v1" + }, + "schema_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "Digest of the exact row schema to which this contract applies." + }, + "primary_keys": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "minItems": 1, + "uniqueItems": true, + "description": "Ordered scalar fields used to sort rows and reject duplicate logical rows. This MUST equal the offering's primary_keys." + }, + "golden_vectors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$" + }, + "input_rows": { + "type": "array", + "items": { + "type": "object" + } + }, + "canonical_utf8_base64": { + "type": "string", + "minLength": 1, + "description": "Base64 of the exact expected canonical UTF-8 bytes." + }, + "sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + } + }, + "required": [ + "name", + "input_rows", + "canonical_utf8_base64", + "sha256" + ], + "additionalProperties": false + }, + "minItems": 2, + "description": "Cross-language conformance vectors. They MUST include an empty report and an ordering/encoding case." + } + }, + "required": [ + "contract_version", + "media_type", + "algorithm", + "schema_sha256", + "primary_keys", + "golden_vectors" + ], + "x-adcp-validation": { + "algorithm": "adcp_jcs_rows_v1 rejects duplicate JSON object keys, non-finite numbers, lone Unicode surrogates, missing/non-scalar primary keys, and duplicate primary-key tuples. Validate every row against the pinned row schema; do not normalize Unicode. RFC 8785-encode each primary-key value array and sort rows by unsigned lexicographic comparison of those UTF-8 bytes. RFC 8785-encode each complete row, then emit the UTF-8 bytes for '[' + the encoded rows joined by ',' + ']'. SHA-256 is computed over exactly those bytes.", + "binding": "schema_sha256 and primary_keys MUST exactly equal the selected offering. SDKs MUST reproduce every golden vector's canonical_utf8_base64 and sha256 before using the contract." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-control-total.json b/schemas/cache/3.2.0-beta.6/core/reporting-control-total.json new file mode 100644 index 000000000..a5bdec01a --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-control-total.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Control Total", + "x-status": "experimental", + "description": "One profile-defined aggregate used to reconcile a reporting revision without rereading every row. Names and units are defined by the immutable report definition. Values use canonical strings so currency and large integer comparisons are exact across SDKs.", + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z][A-Za-z0-9_.:-]{0,127}$" + }, + "value": { + "type": "string", + "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$", + "description": "Canonical base-10 value with no exponent, grouping separator, or insignificant leading zeroes." + }, + "value_type": { + "type": "string", + "enum": [ + "integer", + "decimal" + ] + }, + "unit": { + "type": "string", + "minLength": 1, + "maxLength": 32, + "description": "Profile-defined unit such as impressions or an ISO 4217 currency code." + } + }, + "required": [ + "name", + "value", + "value_type" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json b/schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json new file mode 100644 index 000000000..a9c95f45e --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json @@ -0,0 +1,107 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Dataset Share Destination", + "x-status": "experimental", + "description": "Recipient configuration for a producer-hosted reporting share. The caller either references an existing seller-issued immutable recipient/destination generation or asks the seller to provision one for the named recipient. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes disclosure of its feed and scope. Changing proof-bound recipient coordinates or the accepted delivery contract produces a new destination_ref. No bearer profile, token, private key, password, or other credential may appear here.", + "type": "object", + "oneOf": [ + { + "title": "Existing binding", + "properties": { + "mode": { + "type": "string", + "const": "existing" + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-entity": "reporting_destination", + "description": "Seller-issued immutable recipient/destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." + } + }, + "required": [ + "mode", + "destination_ref" + ], + "additionalProperties": false + }, + { + "title": "Provision recipient", + "properties": { + "mode": { + "type": "string", + "const": "provision" + }, + "provider": { + "type": "object", + "description": "Data-sharing platform, such as databricks.com or snowflake.com.", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + } + }, + "required": [ + "domain" + ], + "additionalProperties": false + }, + "access_mode": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Provider access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing." + }, + "recipient": { + "type": "object", + "description": "Intended buyer principal. The identity is interpreted by the provider and access mode; for example, a Databricks sharing identifier, Snowflake organization/account pair, or Open Sharing recipient email. It is an identifier, never a credential.", + "properties": { + "identity": { + "type": "string", + "minLength": 1, + "maxLength": 512 + }, + "cloud": { + "type": "string", + "enum": [ + "aws", + "azure", + "gcp" + ] + }, + "region": { + "type": "string", + "minLength": 1, + "maxLength": 128 + } + }, + "required": [ + "identity" + ], + "dependencies": { + "cloud": [ + "region" + ], + "region": [ + "cloud" + ] + }, + "additionalProperties": false + } + }, + "required": [ + "mode", + "provider", + "access_mode", + "recipient" + ], + "additionalProperties": false + } + ], + "x-adcp-validation": { + "authorization": "Bind every destination_ref to the stable authenticated caller. Reuse across that caller's accounts is permitted only after each account configuration independently verifies disclosure authority for its feed and media-buy scope. Reject unknown, unauthorized, and cross-caller refs indistinguishably.", + "recipient_proof": "Before ready, prove recipient control and caller authority to disclose every selected account, feed, and media-buy scope. A proof-bound recipient or delivery-contract change creates a new destination_ref; old references remain stable for retained configurations and history. Voluntary configuration deactivation stops new publication but may preserve still-authorized historical access through seller_managed_access_ends_at. Caller authorization loss, account closure, or recipient revocation overrides that window and revokes the grant within authorization_revocation_seconds." + } +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json new file mode 100644 index 000000000..b5c98a48c --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json @@ -0,0 +1,77 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Capabilities", + "x-status": "experimental", + "description": "Managed reporting status and durable delivery support. Each offerings entry is an atomic supported combination; buyers MUST NOT construct an unsupported cross-product. Presence requires media_buy.reporting_delivery in experimental_features and an RFC 9421 webhook-signing capability. Polling get_media_buy_delivery remains the compatibility baseline when this block is absent.", + "type": "object", + "properties": { + "supported": { + "type": "boolean", + "const": true + }, + "configuration_task": { + "type": "string", + "const": "sync_accounts" + }, + "status_task": { + "type": "string", + "const": "get_reporting_status" + }, + "receipt_task": { + "type": "string", + "const": "sync_reporting_receipts" + }, + "readiness_notification": { + "type": "string", + "const": "reporting.delivery_ready" + }, + "offerings": { + "type": "array", + "items": { + "$ref": "reporting-delivery-offering.json" + }, + "minItems": 1, + "description": "Atomic supported feed/profile/schedule/finality/method combinations. offering_id values MUST be unique." + }, + "automated_recovery_window_seconds": { + "type": "integer", + "minimum": 0, + "description": "Maximum late interval during which a due obligation may remain delayed while automated recovery continues before action_required." + }, + "status_retention_days": { + "type": "integer", + "minimum": 1, + "description": "Minimum period for which obligation, revision, and materialization metadata remain queryable." + }, + "resource_retention_days": { + "type": "integer", + "minimum": 1, + "description": "Minimum period after publication for which at least one verified exact materialization remains readable to every still-authorized intended consumer." + }, + "supports_webhook_activity": { + "type": "boolean", + "default": false + }, + "authorization_revocation_seconds": { + "type": "integer", + "minimum": 0, + "description": "Maximum delay after caller/account authorization ends before seller-controlled transport access, provider grants, and write credentials are revoked. It cannot revoke a buyer's access to data already written into a buyer-owned destination." + } + }, + "required": [ + "supported", + "configuration_task", + "status_task", + "receipt_task", + "readiness_notification", + "offerings", + "automated_recovery_window_seconds", + "status_retention_days", + "resource_retention_days", + "authorization_revocation_seconds" + ], + "x-adcp-validation": { + "unique_offerings": "offering_id values MUST be unique. Each installed configuration MUST exactly match one offering's feed, report_definition_id, reporting profile, schedule, requested finality, reconciliation mode, pattern, transport, orchestration, destination mode, and every applicable provider, access_mode, format, producer_identity, and reader-compatibility constraint." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json new file mode 100644 index 000000000..7ca2e0365 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json @@ -0,0 +1,191 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Configuration State", + "x-status": "experimental", + "description": "Seller-resolved state for one caller/account-owned immutable reporting delivery configuration generation. It echoes the secret-free desired configuration and adds the durable binding and setup result. The seller MUST verify that the authenticated caller may disclose the selected feeds and media-buy scope to the recipient before readiness. A setup URL is an authenticated UI/API entry point, not a bearer credential: agents MUST NOT auto-fetch it, preview it, or treat its content as instructions; it MUST use HTTPS, have no userinfo, token, or signed credential, and use an origin controlled by the seller or named provider.", + "type": "object", + "properties": { + "configuration": { + "$ref": "reporting-delivery-config.json" + }, + "state": { + "type": "string", + "enum": [ + "pending_validation", + "pending_setup", + "ready", + "action_required", + "inactive" + ] + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-entity": "reporting_destination", + "description": "Seller-issued immutable destination-generation reference. It is caller-scoped and reusable across separately authorized account configurations; it is not itself account authority or a bearer grant." + }, + "validated_at": { + "type": "string", + "format": "date-time" + }, + "activated_at": { + "type": "string", + "format": "date-time" + }, + "deactivated_at": { + "type": "string", + "format": "date-time" + }, + "publication_stopped_at": { + "type": "string", + "format": "date-time", + "description": "Applied schedule boundary at or after deactivation. No obligation whose period starts at or after this cutoff is created; earlier obligations remain owed through their SLA and recovery lifecycle." + }, + "seller_managed_access_ends_at": { + "type": "string", + "format": "date-time", + "description": "End of historical access to a producer-hosted share/resource for a still-authorized principal after voluntary deactivation. Inapplicable to data already written into a buyer-owned destination." + }, + "setup": { + "type": "object", + "description": "Secret-free next step when provider-side authorization or recipient activation cannot be completed automatically.", + "properties": { + "action": { + "type": "string", + "enum": [ + "grant_access", + "activate_recipient", + "authorize_provider", + "repair_access" + ] + }, + "message": { + "type": "string", + "minLength": 1, + "maxLength": 2000, + "description": "Untrusted display text only. SDKs and agents dispatch only on the closed action value and never execute embedded links or instructions." + }, + "url": { + "type": "string", + "format": "uri", + "pattern": "^https://" + }, + "expires_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "action", + "message" + ], + "additionalProperties": false + }, + "issues": { + "type": "array", + "items": { + "$ref": "reporting-status-issue.json" + }, + "minItems": 1 + } + }, + "required": [ + "configuration", + "state" + ], + "allOf": [ + { + "if": { + "properties": { + "state": { + "const": "ready" + } + } + }, + "then": { + "properties": { + "configuration": { + "properties": { + "active": { + "const": true + } + } + } + }, + "required": [ + "destination_ref", + "validated_at", + "activated_at" + ], + "not": { + "anyOf": [ + { + "required": [ + "setup" + ] + }, + { + "required": [ + "issues" + ] + }, + { + "required": [ + "deactivated_at" + ] + } + ] + } + } + }, + { + "if": { + "properties": { + "state": { + "enum": [ + "pending_setup", + "action_required" + ] + } + } + }, + "then": { + "anyOf": [ + { + "required": [ + "setup" + ] + }, + { + "required": [ + "issues" + ] + } + ] + } + }, + { + "if": { + "properties": { + "state": { + "const": "inactive" + } + } + }, + "then": { + "required": [ + "deactivated_at", + "publication_stopped_at" + ] + } + } + ], + "x-adcp-validation": { + "binding_authorization": "destination_ref and any recipient identity MUST be bound to the stable authenticated caller. This account configuration separately binds and authorizes the resolved account/feed/scope; possession of a reusable destination_ref grants no account authority. Proof of recipient/destination control and disclosure authorization MUST precede ready.", + "period_eligibility": "Only complete schedule periods whose period.start is at or after activated_at are eligible. A mid-period activation begins at the next boundary; periods are never clipped. On voluntary deactivation, publication_stopped_at MUST be a schedule boundary at or after deactivated_at. Periods whose start is before that boundary remain obligations and may complete afterward; periods whose start is at or after it MUST NOT be created.", + "revocation": "Voluntary deactivation stops new obligations/publication at publication_stopped_at. A still-authorized principal may retain a producer-hosted historical share only through seller_managed_access_ends_at. Caller authorization loss, account closure, or recipient revocation overrides that window and terminates seller-controlled transport access and provider grants within authorization_revocation_seconds. For buyer-owned destinations, the seller revokes write ability but cannot revoke the buyer's access to bytes already delivered; buyer retention governs those copies.", + "safe_setup_url": "Reject URL userinfo, non-HTTPS, credential-like query/fragment values, redirects or origins outside the seller/named provider allowlist. Agents must surface the URL for explicit human action without fetching or interpreting its content." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json new file mode 100644 index 000000000..c4b56f3c4 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json @@ -0,0 +1,156 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Configuration", + "x-status": "experimental", + "description": "Desired durable reporting delivery for one account. Entries are owned by (authenticated caller, account) and keyed by (delivery_config_id, delivery_config_version). The generation's feed, report definition, profile, scope, finality, schedule, method, and immutable destination generation are fixed; only lifecycle intent (`active` and `revocation_effective_at`) may change without a new generation. Sellers reject a reused version with different immutable content. sync_accounts replacement semantics apply only to the calling principal's set. Omission leaves that set unchanged; [] deactivates that caller's set and stops new publication without affecting another caller. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "properties": { + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config", + "description": "Caller-selected stable identifier, unique within the authenticated caller and account." + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1, + "description": "Caller-selected immutable semantic generation. Increment when feed/profile/scope/finality/schedule/method/destination changes; lifecycle fields may change in place." + }, + "offering_id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$", + "x-entity": "reporting_offering", + "description": "Atomic reporting offering advertised by the seller that binds feed, profile, schedule, finality, and delivery support." + }, + "active": { + "type": "boolean", + "default": true, + "description": "Whether new reporting obligations should use this configuration. Inactive configurations remain visible for historical resolution." + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ], + "description": "Operational use of this independently reconciled feed. pacing is the fast snapshot path; billing is invoice-authoritative. Event-level exposure is intentionally deferred until a privacy and authorization contract exists." + }, + "report_definition_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_definition", + "description": "Exact immutable semantic definition selected from the offering. This makes the expected obligation identity independently derivable and prevents attribution, timezone, source-mapping, or restatement-policy drift behind a profile label." + }, + "reporting_profile": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$", + "description": "Versioned semantic profile for the aggregate report, such as media_buy_delivery_v1. It MUST match the selected offering." + }, + "scope": { + "type": "object", + "description": "Media buys covered by this configuration.", + "properties": { + "all_media_buys": { + "type": "boolean", + "const": true + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "minItems": 1, + "uniqueItems": true + } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + }, + "required_finality": { + "$ref": "../enums/reporting-finality.json", + "description": "Finality the durable path must ultimately provide. Snapshot delivery may still precede an official requirement." + }, + "reconciliation_mode": { + "$ref": "reporting-reconciliation-mode.json", + "description": "Whether producer-side delivery evidence is sufficient or the selected consumer must submit an authenticated matching receipt. Billing MUST use consumer_receipt." + }, + "schedule": { + "$ref": "reporting-schedule.json" + }, + "method": { + "$ref": "reporting-delivery-method.json" + }, + "revocation_effective_at": { + "type": "string", + "format": "date-time", + "description": "Optional requested cutoff for deactivation. No new publication may begin after the applied cutoff; historical access is limited to the contracted recovery window." + } + }, + "required": [ + "delivery_config_id", + "delivery_config_version", + "offering_id", + "active", + "feed_purpose", + "report_definition_id", + "reporting_profile", + "scope", + "required_finality", + "reconciliation_mode", + "schedule", + "method" + ], + "allOf": [ + { + "if": { + "properties": { + "feed_purpose": { + "const": "billing" + } + }, + "required": [ + "feed_purpose" + ] + }, + "then": { + "properties": { + "reconciliation_mode": { + "const": "consumer_receipt" + } + } + } + }, + { + "if": { + "properties": { + "feed_purpose": { + "const": "billing" + } + }, + "required": [ + "feed_purpose" + ] + }, + "then": { + "properties": { + "required_finality": { + "const": "official" + } + } + } + } + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json new file mode 100644 index 000000000..4e0bd666f --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json @@ -0,0 +1,129 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Method", + "x-status": "experimental", + "description": "Provider-neutral durable reporting delivery method. The caller may request protocol-managed provisioning or reuse an existing seller-issued binding. Transport names are open so new platforms do not require an AdCP enum change. Credentials, bearer profiles, and private keys MUST NOT appear. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "oneOf": [ + { + "title": "File transfer", + "type": "object", + "properties": { + "pattern": { + "type": "string", + "const": "file_transfer", + "description": "Immutable file/object publication with a manifest-last commit boundary." + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Storage transport such as s3, gcs, azure_blob, or sftp." + }, + "orchestration": { + "type": "string", + "enum": [ + "producer_managed", + "consumer_managed" + ], + "description": "Party responsible for starting and monitoring the transfer. Independent of destination ownership and the service that copies bytes." + }, + "destination": { + "$ref": "reporting-write-destination.json" + }, + "format": { + "type": "string", + "enum": [ + "jsonl", + "csv", + "parquet", + "avro", + "orc" + ], + "description": "Physical file format." + } + }, + "required": [ + "pattern", + "transport", + "orchestration", + "destination", + "format" + ], + "additionalProperties": false + }, + { + "title": "Dataset share", + "type": "object", + "properties": { + "pattern": { + "type": "string", + "const": "dataset_share", + "description": "Producer-hosted relation or share read through the intended recipient's access path." + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Sharing transport such as delta_sharing, snowflake_secure_sharing, or bigquery_authorized_view." + }, + "orchestration": { + "type": "string", + "enum": [ + "producer_managed", + "consumer_managed" + ], + "description": "Party responsible for configuring and monitoring the share." + }, + "destination": { + "$ref": "reporting-dataset-share-destination.json" + } + }, + "required": [ + "pattern", + "transport", + "orchestration", + "destination" + ], + "additionalProperties": false + }, + { + "title": "Warehouse materialization", + "type": "object", + "properties": { + "pattern": { + "type": "string", + "const": "warehouse_materialization", + "description": "Exact-revision publication into a warehouse relation or partition." + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Warehouse or transfer transport such as bigquery, snowflake, databricks_sql, or gam_bigquery_transfer." + }, + "orchestration": { + "type": "string", + "enum": [ + "producer_managed", + "consumer_managed" + ], + "description": "Party responsible for starting and monitoring materialization. consumer_managed covers platform transfer services that physically write consumer-owned tables." + }, + "destination": { + "$ref": "reporting-write-destination.json" + } + }, + "required": [ + "pattern", + "transport", + "orchestration", + "destination" + ], + "additionalProperties": false + } + ] +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json new file mode 100644 index 000000000..04cb619e0 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json @@ -0,0 +1,371 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Offering", + "x-status": "experimental", + "description": "One atomic combination a seller can honor. Buyers MUST NOT form a cross-product from separate capability arrays; each installed configuration selects one offering_id and values within that offering.", + "type": "object", + "properties": { + "offering_id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$", + "x-entity": "reporting_offering" + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "report_definition_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_definition", + "description": "Immutable semantic definition for metric, grain, attribution, action-report-time, timezone/calendar, source/API mapping, and restatement/finality policy. Configurations and revisions MUST echo this exact value." + }, + "report_definition_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", + "description": "Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin." + }, + "report_definition_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "Digest of the exact report-definition bytes. SDKs verify this before parsing and cache by digest." + }, + "reporting_profile": { + "type": "object", + "description": "Machine-readable semantic and validation contract for delivered rows.", + "properties": { + "id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$" + }, + "version": { + "type": "string", + "minLength": 1, + "maxLength": 64 + }, + "schema_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", + "description": "Authenticated seller/provider or AdCP-registry HTTPS origin only; never an IP literal, userinfo URL, redirect target, or mutable validation authority." + }, + "schema_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "Digest of the exact schema bytes. SDKs verify this before parsing and cache by digest." + }, + "schema_dialect": { + "type": "string", + "const": "https://json-schema.org/draft/2020-12/schema", + "description": "Closed SDK-bundled dialect. The SDK never resolves a metaschema over the network, and the fetched document's $schema MUST equal this value." + }, + "schema_ref_policy": { + "type": "string", + "const": "local_fragment_only", + "description": "The fetched schema is a self-contained bundle. Every $ref is a local # fragment; remote and relative-document dependencies are forbidden." + }, + "grain": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "description": "Stable description of what one logical row represents." + }, + "primary_keys": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "minItems": 1, + "uniqueItems": true + }, + "canonicalization_id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "description": "Rules for stable logical row ordering, value encoding, nulls, and schema used by canonical_content_digest." + }, + "canonicalization_contract_version": { + "type": "string", + "const": "1.0" + }, + "canonicalization_media_type": { + "type": "string", + "const": "application/vnd.adcp.reporting-canonicalization+json" + }, + "canonicalization_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", + "description": "Retrievable exact canonicalization contract on the authenticated seller/provider or AdCP-registry origin. SDKs apply the same bounded, redirect-free SSRF controls as schema_uri and verify canonicalization_sha256 before use." + }, + "canonicalization_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "Digest of the exact canonicalization contract identified by canonicalization_id." + } + }, + "required": [ + "id", + "version", + "schema_uri", + "schema_sha256", + "schema_dialect", + "schema_ref_policy", + "grain", + "primary_keys", + "canonicalization_id", + "canonicalization_contract_version", + "canonicalization_media_type", + "canonicalization_uri", + "canonicalization_sha256" + ], + "additionalProperties": false + }, + "schedule": { + "$ref": "reporting-schedule-offering.json" + }, + "supported_finality": { + "type": "array", + "items": { + "$ref": "../enums/reporting-finality.json" + }, + "minItems": 1, + "uniqueItems": true + }, + "reconciliation_mode": { + "$ref": "reporting-reconciliation-mode.json", + "description": "Receipt contract included in this atomic offering. Billing offerings MUST require consumer_receipt." + }, + "method": { + "type": "object", + "properties": { + "pattern": { + "type": "string", + "enum": [ + "file_transfer", + "dataset_share", + "warehouse_materialization" + ] + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$" + }, + "orchestration": { + "type": "string", + "enum": [ + "producer_managed", + "consumer_managed" + ] + }, + "destination_modes": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "provision", + "existing" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "provider": { + "type": "object", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + } + }, + "required": [ + "domain" + ], + "additionalProperties": false + }, + "format": { + "type": "string", + "enum": [ + "jsonl", + "csv", + "parquet", + "avro", + "orc" + ] + }, + "access_mode": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$" + }, + "producer_identity": { + "type": "object", + "description": "Seller principal a buyer grants access to for this exact buyer-hosted destination offering.", + "properties": { + "provider": { + "type": "object", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + } + }, + "required": [ + "domain" + ], + "additionalProperties": false + }, + "identity": { + "type": "string", + "minLength": 1, + "maxLength": 512 + }, + "cloud": { + "type": "string", + "enum": [ + "aws", + "azure", + "gcp" + ] + }, + "region": { + "type": "string", + "minLength": 1, + "maxLength": 128 + } + }, + "required": [ + "provider", + "identity" + ], + "dependencies": { + "cloud": [ + "region" + ], + "region": [ + "cloud" + ] + }, + "additionalProperties": false + }, + "reader_compatibility": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "uniqueItems": true + } + }, + "required": [ + "pattern", + "transport", + "orchestration", + "destination_modes" + ], + "allOf": [ + { + "if": { + "required": [ + "pattern" + ] + }, + "then": { + "required": [ + "provider" + ] + } + }, + { + "if": { + "properties": { + "pattern": { + "const": "file_transfer" + } + }, + "required": [ + "pattern" + ] + }, + "then": { + "required": [ + "format" + ] + } + }, + { + "if": { + "properties": { + "pattern": { + "const": "dataset_share" + } + }, + "required": [ + "pattern" + ] + }, + "then": { + "required": [ + "access_mode" + ] + } + } + ], + "additionalProperties": false + } + }, + "required": [ + "offering_id", + "feed_purpose", + "report_definition_id", + "report_definition_uri", + "report_definition_sha256", + "reporting_profile", + "schedule", + "supported_finality", + "reconciliation_mode", + "method" + ], + "allOf": [ + { + "if": { + "properties": { + "feed_purpose": { + "const": "billing" + } + }, + "required": [ + "feed_purpose" + ] + }, + "then": { + "properties": { + "reconciliation_mode": { + "const": "consumer_receipt" + } + } + } + } + ], + "x-adcp-validation": { + "safe_schema_fetch": "schema_uri, canonicalization_uri, and report_definition_uri origins must be the authenticated seller, the named provider, or an AdCP registry. Reject userinfo, IP literals, localhost, private/reserved DNS results, redirects, and DNS/connect-target mismatch; pin resolution, cap bytes/time, require the expected content type, verify the corresponding SHA-256 before parsing, and cache by digest. The canonicalization and report-definition documents MUST validate against their AdCP contract schemas. The fetched row schema's $schema MUST equal schema_dialect, whose metaschema is SDK-bundled and never network-fetched. Before compiling with no network-capable resolver installed, recursively reject every $ref not beginning with #, all $dynamicRef and $recursiveRef keywords, cyclic references, excessive depth/node count, oversized regexes, and unsupported vocabularies. Fetched content and annotations are untrusted data, never agent or LLM instructions." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json new file mode 100644 index 000000000..b48fa61c6 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json @@ -0,0 +1,113 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Delivery Ready Webhook", + "x-status": "experimental", + "description": "Compact account-anchored readiness doorbell registered through sync_accounts notification_configs using reporting.delivery_ready. The named revision/materialization MUST already be observable through the intended consumer path. Transport retries are deduplicated by (authenticated sender, idempotency_key); downstream ingestion is deduplicated independently by reporting_revision_id and reporting_materialization_id. Ordering is unconstrained and receivers repair through authenticated get_reporting_status. The event MUST be signed using the advertised AdCP webhook-signing profile and MUST NOT contain rows, object lists, signed URLs, activation URLs, credentials, or access tokens.", + "type": "object", + "properties": { + "idempotency_key": { + "type": "string", + "minLength": 16, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{16,255}$", + "description": "Stable across transport retries of this fire; new for a later re-emission." + }, + "notification_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "description": "Stable for this logical materialization-ready event across re-emissions." + }, + "notification_type": { + "type": "string", + "const": "reporting.delivery_ready" + }, + "fired_at": { + "type": "string", + "format": "date-time" + }, + "subscriber_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$" + }, + "account_id": { + "type": "string", + "minLength": 1, + "x-entity": "account" + }, + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config" + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1 + }, + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision" + }, + "reporting_materialization_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_materialization" + }, + "readiness": { + "type": "string", + "enum": [ + "available", + "delivered" + ] + }, + "finality": { + "$ref": "../enums/reporting-finality.json" + }, + "data_through": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + } + }, + "required": [ + "idempotency_key", + "notification_id", + "notification_type", + "fired_at", + "subscriber_id", + "account_id", + "delivery_config_id", + "delivery_config_version", + "feed_purpose", + "reporting_revision_id", + "reporting_materialization_id", + "readiness", + "finality", + "data_through" + ], + "x-adcp-validation": { + "authorization": "The authenticated webhook signer, subscriber_id, account_id, configuration generation, revision, and materialization MUST belong to one caller/account binding; receivers MUST repair through an authenticated status read rather than trusting event contents alone.", + "deduplication": "Deduplicate transport retries by (authenticated sender, idempotency_key), then deduplicate ingestion independently by reporting_revision_id and reporting_materialization_id." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json b/schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json new file mode 100644 index 000000000..03fa71674 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting File Compression", + "x-status": "experimental", + "description": "Physical compression applied to each data object listed by a reporting file manifest.", + "type": "string", + "enum": [ + "none", + "gzip", + "zstd", + "snappy" + ] +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json b/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json new file mode 100644 index 000000000..12132731b --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting File Entry", + "x-status": "experimental", + "description": "One immutable data object committed by a reporting file manifest.", + "type": "object", + "properties": { + "object_ref": { + "type": "string", + "minLength": 1, + "maxLength": 1024, + "description": "Credential-free object identifier resolved through the configured destination." + }, + "size_bytes": { + "type": "integer", + "minimum": 0 + }, + "sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + }, + "row_count": { + "type": "integer", + "minimum": 0 + }, + "partition": { + "type": "object", + "additionalProperties": { + "type": "string", + "maxLength": 512 + }, + "maxProperties": 32 + } + }, + "required": [ + "object_ref", + "size_bytes", + "sha256", + "row_count" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json b/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json new file mode 100644 index 000000000..1ca708b2c --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json @@ -0,0 +1,121 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting File Manifest", + "x-status": "experimental", + "description": "Normative manifest for one completed file-transfer materialization. Producers write every data object first and publish this manifest last. Its appearance is the commit point: consumers MUST ignore unlisted objects and MUST NOT process the materialization before a digest-valid complete manifest is visible.", + "type": "object", + "properties": { + "manifest_version": { + "type": "string", + "const": "1.0" + }, + "complete": { + "type": "boolean", + "const": true + }, + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision" + }, + "reporting_obligation_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_obligation" + }, + "reporting_materialization_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_materialization" + }, + "period": { + "type": "object", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + }, + "source_timezone": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "start", + "end", + "source_timezone" + ], + "additionalProperties": false + }, + "format": { + "type": "string", + "enum": [ + "jsonl", + "csv", + "parquet", + "avro", + "orc" + ] + }, + "compression": { + "$ref": "reporting-file-compression.json" + }, + "files": { + "type": "array", + "items": { + "$ref": "reporting-file-entry.json" + }, + "minItems": 1 + }, + "total_size_bytes": { + "type": "integer", + "minimum": 0 + }, + "row_count": { + "type": "integer", + "minimum": 0 + }, + "control_totals": { + "type": "array", + "items": { + "$ref": "reporting-control-total.json" + }, + "uniqueItems": true + }, + "created_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "manifest_version", + "complete", + "reporting_revision_id", + "reporting_obligation_id", + "reporting_materialization_id", + "period", + "format", + "compression", + "files", + "total_size_bytes", + "row_count", + "control_totals", + "created_at" + ], + "x-adcp-validation": { + "manifest_digest": "reporting_resource.manifest_sha256 MUST equal SHA-256 over the exact manifest bytes before parsing.", + "object_set": "object_ref values MUST be unique. total_size_bytes and row_count MUST equal the sums across files. Every file checksum MUST be verified before downstream commit.", + "identity_match": "The revision, obligation, materialization, period, format, row count, and control totals MUST equal the referenced ledger records and verification evidence." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json b/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json new file mode 100644 index 000000000..a6a9c92dd --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json @@ -0,0 +1,300 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Materialization", + "x-status": "experimental", + "description": "One attempt to expose an immutable reporting revision through a configured durable delivery method. Automated retry creates a new materialization and attempt number while preserving reporting_revision_id. available is a verified producer-hosted pull/share claim; delivered is a verified recipient/destination claim. Existing per-buy inline reporting remains on its existing data API and is outside this v1 managed ledger.", + "type": "object", + "properties": { + "reporting_materialization_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_materialization" + }, + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision" + }, + "reporting_obligation_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_obligation", + "description": "Destination-specific obligation this materialization attempts to satisfy." + }, + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config", + "description": "Durable configuration that requested this materialization." + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1 + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-entity": "reporting_destination", + "description": "Immutable caller-owned destination generation selected by the account-authorized obligation. It may be reused by the same caller across other independently authorized accounts." + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "method": { + "type": "string", + "enum": [ + "file_transfer", + "dataset_share", + "warehouse_materialization" + ] + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$" + }, + "attempt": { + "type": "integer", + "minimum": 1 + }, + "status": { + "type": "string", + "enum": [ + "pending", + "available", + "delivered", + "failed" + ], + "description": "Lifecycle of this attempt. pending may transition once to available, delivered, or failed; terminal evidence is immutable. Staleness is evaluated in get_reporting_status health, not stored as a materialization state." + }, + "ready_at": { + "type": "string", + "format": "date-time", + "description": "When consumer-path or destination verification completed." + }, + "failed_at": { + "type": "string", + "format": "date-time" + }, + "failure_code": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Z][A-Z0-9_]*$", + "description": "Stable safe failure classification. MUST NOT include credentials or provider response bodies." + }, + "resource": { + "$ref": "reporting-resource.json" + }, + "verification": { + "$ref": "reporting-verification.json" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "reporting_materialization_id", + "reporting_revision_id", + "reporting_obligation_id", + "delivery_config_id", + "delivery_config_version", + "destination_ref", + "feed_purpose", + "method", + "attempt", + "status", + "created_at" + ], + "allOf": [ + { + "if": { + "properties": { + "status": { + "enum": [ + "available", + "delivered" + ] + } + }, + "required": [ + "status" + ] + }, + "then": { + "required": [ + "ready_at", + "resource", + "verification" + ] + } + }, + { + "if": { + "properties": { + "status": { + "const": "failed" + } + }, + "required": [ + "status" + ] + }, + "then": { + "required": [ + "failed_at", + "failure_code" + ] + } + }, + { + "if": { + "properties": { + "method": { + "const": "file_transfer" + } + }, + "required": [ + "method" + ] + }, + "then": { + "properties": { + "resource": { + "properties": { + "kind": { + "const": "manifest" + } + } + }, + "verification": { + "properties": { + "physical_checksums": { + "minItems": 1 + } + }, + "required": [ + "physical_checksums" + ] + } + } + } + }, + { + "if": { + "properties": { + "method": { + "const": "dataset_share" + } + }, + "required": [ + "method" + ] + }, + "then": { + "properties": { + "resource": { + "properties": { + "kind": { + "const": "dataset" + } + } + }, + "verification": { + "properties": { + "verification_path": { + "const": "representative_consumer" + } + } + } + } + } + }, + { + "if": { + "properties": { + "method": { + "const": "warehouse_materialization" + } + }, + "required": [ + "method" + ] + }, + "then": { + "properties": { + "resource": { + "properties": { + "kind": { + "const": "warehouse_relation" + } + } + }, + "verification": { + "properties": { + "verification_path": { + "const": "destination" + } + } + } + } + } + }, + { + "if": { + "properties": { + "feed_purpose": { + "const": "billing" + }, + "status": { + "enum": [ + "available", + "delivered" + ] + } + }, + "required": [ + "feed_purpose", + "status" + ] + }, + "then": { + "properties": { + "verification": { + "properties": { + "verification_profile": { + "const": "canonical_digest" + } + }, + "required": [ + "canonical_content_digest", + "verification_profile" + ] + } + } + } + } + ], + "x-adcp-validation": { + "revision_match": "reporting_revision_id names destination-independent content. verification.row_count and control_totals MUST equal that revision; canonical_content_digest MUST also equal it when present.", + "obligation_match": "reporting_obligation_id, delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method MUST match one caller/account-bound obligation. This join is what permits one revision to fan out to many destinations and principals.", + "authorization": "The caller MUST be authorized for the referenced account and destination binding. Cross-caller and cross-account identifiers MUST be rejected without revealing whether they exist." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json b/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json new file mode 100644 index 000000000..cccc7ee81 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json @@ -0,0 +1,354 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Obligation", + "x-status": "experimental", + "description": "Period-level status joining what reporting was expected to any produced immutable revisions and delivery materializations. An obligation exists before its first revision or webhook, making missing-first-report detection possible. All nested revisions and materializations MUST match this obligation's authenticated caller/account, configuration generation, report definition, feed, period, and scope.", + "type": "object", + "properties": { + "reporting_obligation_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_obligation" + }, + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config" + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1 + }, + "report_definition_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_definition" + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "reporting_profile": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "account_id": { + "type": "string", + "minLength": 1, + "x-entity": "account" + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "uniqueItems": true, + "description": "Exact frozen media-buy denominator resolved for this period, including buys with zero rows. An empty array is the definitive zero-buy set; omission is never used to mean all, empty, or unknown." + }, + "scope_resolved_at": { + "type": "string", + "format": "date-time", + "description": "Instant at which the configured scope was resolved and frozen for this obligation. For all_media_buys, include every caller-authorized account media buy whose effective flight overlaps the half-open period and was known by this cutoff. Later-created or backdated buys do not rewrite this obligation." + }, + "period": { + "type": "object", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + }, + "source_timezone": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "start", + "end", + "source_timezone" + ], + "additionalProperties": false + }, + "expected_at": { + "type": "string", + "format": "date-time" + }, + "schedule": { + "$ref": "reporting-schedule.json", + "description": "Resolved immutable schedule generation that created this obligation." + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-entity": "reporting_destination", + "description": "Immutable caller-owned destination generation selected by this account-authorized obligation. The account/configuration join\u2014not possession of this reusable reference\u2014authorizes disclosure." + }, + "required_finality": { + "$ref": "../enums/reporting-finality.json" + }, + "reconciliation_mode": { + "$ref": "reporting-reconciliation-mode.json" + }, + "reconciliation_status": { + "type": "string", + "enum": [ + "not_required", + "pending", + "accepted", + "rejected" + ], + "description": "Consumer agreement state for the current required revision. A later superseding revision returns a receipt-required obligation to pending until that revision is accepted." + }, + "health": { + "$ref": "../enums/reporting-health.json" + }, + "production_status": { + "type": "string", + "enum": [ + "not_due", + "pending", + "published", + "failed" + ], + "description": "Whether any revision has been produced for this obligation. published includes zero-row revisions." + }, + "revision_count": { + "type": "integer", + "minimum": 0, + "description": "Number of revision records for this obligation in the consistent ledger snapshot." + }, + "materialization_count": { + "type": "integer", + "minimum": 0, + "description": "Number of materialization records for this obligation's revisions in the consistent ledger snapshot." + }, + "successful_materialization_count": { + "type": "integer", + "minimum": 0, + "description": "Number of available/delivered verified materializations in the consistent ledger snapshot." + }, + "receipt_count": { + "type": "integer", + "minimum": 0, + "description": "Complete number of authenticated receipts associated with this obligation in the ledger snapshot." + }, + "accepted_receipt_count": { + "type": "integer", + "minimum": 0, + "description": "Number of accepted receipts. At most one current accepted receipt per consumer and revision contributes to reconciliation_status." + }, + "issues": { + "type": "array", + "items": { + "$ref": "reporting-status-issue.json" + } + }, + "resource_retained_until": { + "type": "string", + "format": "date-time", + "description": "Minimum time through which at least one verified materialization for a completed obligation remains readable." + } + }, + "required": [ + "reporting_obligation_id", + "delivery_config_id", + "delivery_config_version", + "report_definition_id", + "feed_purpose", + "reporting_profile", + "account_id", + "media_buy_ids", + "scope_resolved_at", + "period", + "expected_at", + "schedule", + "destination_ref", + "required_finality", + "reconciliation_mode", + "reconciliation_status", + "health", + "production_status", + "revision_count", + "materialization_count", + "successful_materialization_count", + "receipt_count", + "accepted_receipt_count", + "issues" + ], + "allOf": [ + { + "if": { + "properties": { + "health": { + "enum": [ + "healthy", + "complete" + ] + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "production_status": { + "const": "published" + }, + "revision_count": { + "minimum": 1 + }, + "materialization_count": { + "minimum": 1 + }, + "successful_materialization_count": { + "minimum": 1 + }, + "issues": { + "maxItems": 0 + } + }, + "required": [ + "resource_retained_until" + ] + } + }, + { + "if": { + "properties": { + "production_status": { + "const": "published" + } + }, + "required": [ + "production_status" + ] + }, + "then": { + "properties": { + "revision_count": { + "minimum": 1 + } + } + } + }, + { + "if": { + "properties": { + "reconciliation_mode": { + "const": "delivery_only" + } + }, + "required": [ + "reconciliation_mode" + ] + }, + "then": { + "properties": { + "reconciliation_status": { + "const": "not_required" + } + } + } + }, + { + "if": { + "properties": { + "reconciliation_mode": { + "const": "consumer_receipt" + }, + "health": { + "enum": [ + "healthy", + "complete" + ] + } + }, + "required": [ + "reconciliation_mode", + "health" + ] + }, + "then": { + "properties": { + "reconciliation_status": { + "const": "accepted" + }, + "receipt_count": { + "minimum": 1 + }, + "accepted_receipt_count": { + "minimum": 1 + } + } + } + }, + { + "if": { + "properties": { + "health": { + "enum": [ + "delayed", + "action_required" + ] + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "issues": { + "minItems": 1 + } + } + } + }, + { + "if": { + "properties": { + "production_status": { + "const": "failed" + } + }, + "required": [ + "production_status" + ] + }, + "then": { + "properties": { + "issues": { + "minItems": 1 + } + } + } + } + ], + "x-adcp-validation": { + "scope_resolution": "scope_resolved_at MUST equal period.end. all_media_buys membership is frozen from the caller-authorized AdCP media buys known at that instant whose effective flights overlap [period.start, period.end); explicit configured media_buy_ids are echoed even when they produce zero rows. Provider object deletion does not remove a buy. Later-created or backdated buys do not alter the obligation.", + "nested_identity": "Every materialization associated with this obligation MUST equal its delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method; its destination-independent revision MUST equal account_id, report_definition_id, reporting_profile, period, and applicable media_buy_ids.", + "complete_finality": "complete requires a published revision at required_finality and at least one verified readable materialization for that revision through resource_retained_until. consumer_receipt additionally requires an accepted matching receipt for the current revision. A snapshot-required pacing obligation may therefore become complete from a snapshot revision.", + "revision_chain": "Supersession MUST be acyclic, remain within this logical slice, and every supersedes_reporting_revision_id MUST name the immediately prior retained revision.", + "record_counts": "revision_count is the number of distinct revisions referenced by this obligation's materializations. revision_count, materialization_count, successful_materialization_count, receipt_count, and accepted_receipt_count MUST equal the complete associated record totals in ledger_snapshot_id, even when records appear on different pages." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json b/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json new file mode 100644 index 000000000..92fe86091 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json @@ -0,0 +1,196 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Receipt", + "x-status": "experimental", + "description": "Authenticated consumer evidence for one materialization. A receipt closes the knowledge gap between producer availability and consumer reconciliation. Buyer and governance consumers submit independently; neither consumer's receipt implies acceptance by another principal.", + "type": "object", + "properties": { + "reporting_receipt_id": { + "type": "string", + "minLength": 16, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{16,255}$", + "x-entity": "reporting_receipt" + }, + "reporting_obligation_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_obligation" + }, + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision" + }, + "reporting_materialization_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_materialization" + }, + "status": { + "type": "string", + "enum": [ + "accepted", + "rejected" + ] + }, + "verification_profile": { + "$ref": "reporting-verification-profile.json" + }, + "observed_row_count": { + "type": "integer", + "minimum": 0 + }, + "observed_control_totals": { + "type": "array", + "items": { + "$ref": "reporting-control-total.json" + }, + "uniqueItems": true + }, + "observed_canonical_content_digest": { + "$ref": "reporting-canonical-content-digest.json" + }, + "observed_manifest_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + }, + "observed_native_version_ref": { + "type": "string", + "minLength": 1, + "maxLength": 512, + "description": "Immutable provider-native version observed by the consumer for native_commit verification." + }, + "consumer_commit_ref": { + "type": "string", + "minLength": 1, + "maxLength": 512, + "description": "Optional non-secret consumer checkpoint, transaction, or load identifier. It is evidence for operations, not authorization or a credential." + }, + "rejection_codes": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Z][A-Z0-9_]*$" + }, + "minItems": 1, + "uniqueItems": true + }, + "observed_at": { + "type": "string", + "format": "date-time" + }, + "received_at": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "reporting_receipt_id", + "reporting_obligation_id", + "reporting_revision_id", + "reporting_materialization_id", + "status", + "verification_profile", + "observed_row_count", + "observed_control_totals", + "observed_at" + ], + "allOf": [ + { + "if": { + "properties": { + "status": { + "const": "rejected" + } + }, + "required": [ + "status" + ] + }, + "then": { + "required": [ + "rejection_codes" + ] + } + }, + { + "if": { + "properties": { + "verification_profile": { + "const": "canonical_digest" + }, + "status": { + "const": "accepted" + } + }, + "required": [ + "verification_profile", + "status" + ] + }, + "then": { + "required": [ + "observed_canonical_content_digest" + ] + } + }, + { + "if": { + "properties": { + "verification_profile": { + "const": "manifest_checksums" + }, + "status": { + "const": "accepted" + } + }, + "required": [ + "verification_profile", + "status" + ] + }, + "then": { + "required": [ + "observed_manifest_sha256" + ] + } + }, + { + "if": { + "properties": { + "verification_profile": { + "const": "native_commit" + }, + "status": { + "const": "accepted" + } + }, + "required": [ + "verification_profile", + "status" + ] + }, + "then": { + "required": [ + "observed_native_version_ref" + ] + } + } + ], + "x-adcp-validation": { + "authorization": "The seller derives the consumer principal from authenticated transport and accepts receipts only for that principal's account-bound obligation and materialization. Unknown, unauthorized, cross-account, and cross-caller identifiers are indistinguishable.", + "acceptance_match": "accepted requires exact equality with the selected materialization verification evidence: row count and control totals always; canonical digest or manifest digest when selected. A mismatch MUST be submitted or recorded as rejected.", + "immutability": "A reporting_receipt_id is immutable. Exact retries are idempotent; reuse with different content is a conflict." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json b/schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json new file mode 100644 index 000000000..ee6bdf231 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json @@ -0,0 +1,11 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Reconciliation Mode", + "x-status": "experimental", + "description": "Whether producer delivery evidence is sufficient or an authenticated consumer receipt is required.", + "type": "string", + "enum": [ + "delivery_only", + "consumer_receipt" + ] +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json b/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json new file mode 100644 index 000000000..4c23b3e07 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json @@ -0,0 +1,297 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Report Definition", + "x-status": "experimental", + "description": "Immutable, inspectable semantic contract for how a reporting feed is produced and finalized. Its exact bytes are pinned by report_definition_sha256.", + "type": "object", + "properties": { + "contract_version": { + "type": "string", + "const": "1.0" + }, + "media_type": { + "type": "string", + "const": "application/vnd.adcp.reporting-definition+json" + }, + "report_definition_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$" + }, + "reporting_profile": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "grain": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "source": { + "type": "object", + "properties": { + "provider": { + "type": "object", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + } + }, + "required": [ + "domain" + ], + "additionalProperties": false + }, + "system": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "api_version": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "query_semantics": { + "type": "object", + "description": "Canonical JSON object containing every source option that can change the numbers, including attribution settings, action-report-time, filters, and mapping version." + } + }, + "required": [ + "provider", + "system", + "api_version", + "query_semantics" + ], + "additionalProperties": false + }, + "calendar": { + "type": "object", + "properties": { + "timezone_basis": { + "type": "string", + "enum": [ + "utc", + "account_timezone", + "configured_timezone" + ] + }, + "timezone": { + "type": "string", + "minLength": 1, + "maxLength": 255 + } + }, + "required": [ + "timezone_basis" + ], + "allOf": [ + { + "if": { + "properties": { + "timezone_basis": { + "const": "configured_timezone" + } + }, + "required": [ + "timezone_basis" + ] + }, + "then": { + "required": [ + "timezone" + ] + }, + "else": { + "not": { + "required": [ + "timezone" + ] + } + } + } + ], + "additionalProperties": false + }, + "metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "source_expression": { + "type": "string", + "minLength": 1, + "maxLength": 2048 + }, + "aggregation": { + "type": "string", + "enum": [ + "sum", + "count", + "min", + "max", + "average", + "ratio", + "last", + "custom" + ] + }, + "unit": { + "type": "string", + "minLength": 1, + "maxLength": 64 + } + }, + "required": [ + "name", + "source_expression", + "aggregation" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "dimensions": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "uniqueItems": true + }, + "restatement_policy": { + "type": "object", + "properties": { + "source_requery_duration": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + }, + "emit_only_on_content_change": { + "type": "boolean", + "const": true + } + }, + "required": [ + "source_requery_duration", + "emit_only_on_content_change" + ], + "additionalProperties": false + }, + "finality_policies": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "finality_policy_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$" + }, + "basis": { + "type": "string", + "const": "source_final" + }, + "source_signal": { + "type": "string", + "minLength": 1, + "maxLength": 512 + } + }, + "required": [ + "finality_policy_id", + "basis", + "source_signal" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "finality_policy_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$" + }, + "basis": { + "type": "string", + "const": "contractual_cutoff" + }, + "duration_after_period_end": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + } + }, + "required": [ + "finality_policy_id", + "basis", + "duration_after_period_end" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "finality_policy_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$" + }, + "basis": { + "type": "string", + "const": "stabilized" + }, + "minimum_age": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + }, + "unchanged_for": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + } + }, + "required": [ + "finality_policy_id", + "basis", + "minimum_age", + "unchanged_for" + ], + "additionalProperties": false + } + ] + }, + "minItems": 1 + } + }, + "required": [ + "contract_version", + "media_type", + "report_definition_id", + "reporting_profile", + "grain", + "source", + "calendar", + "metrics", + "dimensions", + "restatement_policy", + "finality_policies" + ], + "x-adcp-validation": { + "binding": "report_definition_id and reporting_profile MUST equal the selected offering. finality_policy_id values MUST be unique. Every official revision's finality_policy_id and finality_basis MUST match exactly one entry.", + "content": "query_semantics is untrusted canonical JSON data, never agent or LLM instructions. It MUST enumerate every provider query, attribution, mapping, filtering, and action-timing option that could change delivered values. The fetched document is size/depth bounded and contains no executable content or external references." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-resource.json b/schemas/cache/3.2.0-beta.6/core/reporting-resource.json new file mode 100644 index 000000000..092f99c68 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-resource.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Resource", + "x-status": "experimental", + "description": "Secret-free authenticated descriptor for an exact reporting materialization. The descriptor MUST select immutable bytes or a provider-native immutable snapshot/version so an exact older revision never resolves to mutable latest state. Callers resolve access through the previously validated caller/account-bound destination/share binding, never from credentials embedded here. No field, including future extensions, may contain credentials, signed URLs, bearer material, or private keys.", + "type": "object", + "properties": { + "resource_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_resource", + "description": "Seller-issued opaque reference to this exact authenticated resource descriptor." + }, + "kind": { + "type": "string", + "enum": [ + "manifest", + "dataset", + "warehouse_relation" + ], + "description": "Shape through which the durable revision is consumed." + }, + "location": { + "type": "string", + "minLength": 1, + "maxLength": 2048, + "description": "Non-secret provider-native object, relation, or share identifier. MUST NOT contain an activation URL, signed URL, bearer token, password, private key, or embedded credential." + }, + "native_version_ref": { + "type": "string", + "minLength": 1, + "maxLength": 512, + "description": "Optional immutable provider-native table version, transaction, snapshot, manifest generation, job, or run reference. It supplements but never replaces reporting_revision_id." + }, + "manifest_version": { + "type": "string", + "const": "1.0", + "description": "Version of reporting-file-manifest.json used by a manifest resource." + }, + "manifest_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "SHA-256 over the exact manifest bytes. Consumers verify this before parsing the manifest." + }, + "immutability": { + "type": "string", + "enum": [ + "immutable_location", + "native_version" + ], + "description": "How this descriptor selects the exact immutable materialization." + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "Mandatory finite lower-bound endpoint through which this exact resource remains resolvable; it cannot be earlier than the advertised retention contract." + }, + "reader_compatibility": { + "type": "array", + "description": "Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "uniqueItems": true + } + }, + "required": [ + "resource_ref", + "kind", + "location", + "immutability", + "expires_at" + ], + "allOf": [ + { + "if": { + "properties": { + "kind": { + "const": "manifest" + } + }, + "required": [ + "kind" + ] + }, + "then": { + "required": [ + "manifest_version", + "manifest_sha256" + ] + } + }, + { + "if": { + "properties": { + "immutability": { + "const": "native_version" + } + }, + "required": [ + "immutability" + ] + }, + "then": { + "required": [ + "native_version_ref" + ] + } + } + ], + "x-adcp-validation": { + "retention": "expires_at MUST be no earlier than the owning obligation.resource_retained_until and publication plus advertised resource_retention_days. A completed obligation cannot rely on deterministic rematerialization in place of a readable exact resource." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-revision.json b/schemas/cache/3.2.0-beta.6/core/reporting-revision.json new file mode 100644 index 000000000..5e5e0595c --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-revision.json @@ -0,0 +1,277 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Revision", + "x-status": "experimental", + "description": "One immutable emitted version of logical reporting content. The revision is destination-independent: one canonical revision may fan out through many caller/account-bound obligations and materializations, including file, warehouse, and dataset-share destinations. The report_definition_id plus period and scope identify the logical slice; restatements create a new revision and preserve the superseded revision for the advertised retention window.", + "type": "object", + "properties": { + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision", + "description": "Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions." + }, + "report_definition_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_definition", + "description": "Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics." + }, + "report_definition_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)" + }, + "report_definition_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$" + }, + "reporting_profile": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "schema_version": { + "type": "string", + "minLength": 1, + "maxLength": 64 + }, + "schema_uri": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", + "description": "Machine-readable schema on the authenticated seller/provider or AdCP-registry origin." + }, + "schema_sha256": { + "type": "string", + "pattern": "^[A-Fa-f0-9]{64}$", + "description": "Digest of the exact schema bytes used to validate this immutable revision." + }, + "schema_dialect": { + "type": "string", + "const": "https://json-schema.org/draft/2020-12/schema", + "description": "Closed SDK-bundled dialect; the metaschema is never network-fetched." + }, + "schema_ref_policy": { + "type": "string", + "const": "local_fragment_only", + "description": "The fetched schema is self-contained and every $ref is a local # fragment." + }, + "account_id": { + "type": "string", + "minLength": 1, + "x-entity": "account" + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "uniqueItems": true, + "description": "Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator." + }, + "period": { + "type": "object", + "description": "Half-open reporting interval with its source calendar boundary.", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + }, + "source_timezone": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "start", + "end", + "source_timezone" + ], + "additionalProperties": false + }, + "finality": { + "$ref": "../enums/reporting-finality.json" + }, + "finality_basis": { + "type": "string", + "enum": [ + "source_final", + "contractual_cutoff", + "stabilized" + ], + "description": "Why an official revision is considered final: an authoritative source signal, a versioned contractual cutoff, or a versioned stabilization rule." + }, + "finality_policy_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "description": "Immutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id." + }, + "finalized_at": { + "type": "string", + "format": "date-time", + "description": "When the producer applied the declared finality basis to this official revision." + }, + "observed_at": { + "type": "string", + "format": "date-time", + "description": "When the seller obtained or committed this source observation." + }, + "data_through": { + "type": [ + "string", + "null" + ], + "format": "date-time", + "description": "Latest event time conservatively included, or null when precision is unknown." + }, + "data_through_precision": { + "type": "string", + "enum": [ + "exact", + "lower_bound", + "unknown" + ] + }, + "supersedes_reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision", + "description": "Immediately superseded revision of the same logical slice. Both snapshot and official revisions may be superseded." + }, + "row_count": { + "type": "integer", + "minimum": 0, + "description": "Logical row count, including zero for a successfully evaluated empty report." + }, + "control_totals": { + "type": "array", + "items": { + "$ref": "reporting-control-total.json" + }, + "uniqueItems": true, + "description": "Profile-defined totals computed from the canonical logical revision. Names MUST be unique." + }, + "canonical_content_digest": { + "$ref": "reporting-canonical-content-digest.json" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "reporting_revision_id", + "report_definition_id", + "report_definition_uri", + "report_definition_sha256", + "reporting_profile", + "schema_version", + "schema_uri", + "schema_sha256", + "schema_dialect", + "schema_ref_policy", + "account_id", + "media_buy_ids", + "period", + "finality", + "observed_at", + "data_through", + "data_through_precision", + "row_count", + "control_totals", + "created_at" + ], + "allOf": [ + { + "if": { + "properties": { + "data_through_precision": { + "const": "unknown" + } + }, + "required": [ + "data_through_precision" + ] + }, + "then": { + "properties": { + "data_through": { + "type": "null" + } + } + }, + "else": { + "properties": { + "data_through": { + "type": "string", + "format": "date-time" + } + } + } + }, + { + "if": { + "properties": { + "finality": { + "const": "official" + } + }, + "required": [ + "finality" + ] + }, + "then": { + "required": [ + "finality_basis", + "finality_policy_id", + "finalized_at" + ] + }, + "else": { + "not": { + "anyOf": [ + { + "required": [ + "finality_basis" + ] + }, + { + "required": [ + "finality_policy_id" + ] + }, + { + "required": [ + "finalized_at" + ] + } + ] + } + } + } + ], + "x-adcp-validation": { + "safe_schema_fetch": "schema_uri/schema_sha256 and report_definition_uri/report_definition_sha256 MUST match the selected offering. Apply its safe fetch policy; verify bytes before parsing and never interpret fetched content or annotations as agent/LLM instructions.", + "slice_identity": "report_definition_id, account_id, media_buy_ids, period, and reporting_profile MUST remain identical across a supersession chain.", + "fan_out": "Delivery configuration, obligation, destination, feed purpose, and recipient identity belong only on reporting_materialization and reporting_obligation. They MUST NOT affect reporting_revision_id for identical content.", + "finality_evidence": "An official revision's finality_policy_id and finality_basis MUST match the pinned report definition. finalized_at MUST be at or after period.end and no later than created_at.", + "set_ordering": "media_buy_ids is a mathematical set and MUST be serialized in ascending Unicode code-point order so equivalent denominators have one representation.", + "digest_requirement": "canonical_content_digest is optional for non-billing delivery profiles. It is mandatory when a referenced materialization selects canonical_digest and for every billing obligation." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json b/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json new file mode 100644 index 000000000..9dc9c5537 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json @@ -0,0 +1,127 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Schedule Offering", + "x-status": "experimental", + "description": "Schedule constraint advertised by a seller. Unlike an installed reporting-schedule, a billing-cycle offering may allow the account configuration to select its own anchor and IANA timezone.", + "type": "object", + "properties": { + "period_duration": { + "type": "string", + "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + }, + "alignment": { + "type": "string", + "enum": [ + "utc", + "account_timezone", + "billing_cycle" + ] + }, + "period_anchor_policy": { + "type": "string", + "enum": [ + "fixed", + "configurable" + ], + "description": "For billing_cycle only. fixed requires the advertised anchor and timezone; configurable lets each authorized account configuration select them." + }, + "period_anchor": { + "type": "string", + "format": "date-time" + }, + "period_timezone": { + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "delivery_sla": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" + } + }, + "required": [ + "period_duration", + "alignment", + "delivery_sla" + ], + "allOf": [ + { + "if": { + "properties": { + "alignment": { + "const": "billing_cycle" + } + }, + "required": [ + "alignment" + ] + }, + "then": { + "required": [ + "period_anchor_policy" + ], + "allOf": [ + { + "if": { + "properties": { + "period_anchor_policy": { + "const": "fixed" + } + }, + "required": [ + "period_anchor_policy" + ] + }, + "then": { + "required": [ + "period_anchor", + "period_timezone" + ] + }, + "else": { + "not": { + "anyOf": [ + { + "required": [ + "period_anchor" + ] + }, + { + "required": [ + "period_timezone" + ] + } + ] + } + } + } + ] + }, + "else": { + "not": { + "anyOf": [ + { + "required": [ + "period_anchor_policy" + ] + }, + { + "required": [ + "period_anchor" + ] + }, + { + "required": [ + "period_timezone" + ] + } + ] + } + } + } + ], + "x-adcp-validation": { + "installed_schedule_match": "period_duration, alignment, and delivery_sla MUST equal the installed configuration. For fixed billing_cycle offerings, period_anchor and period_timezone MUST also equal it. For configurable billing_cycle offerings, the installed configuration supplies both values. utc and account_timezone use the normative origins in reporting-schedule.json, so even multi-unit durations have one independently derivable phase." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json b/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json new file mode 100644 index 000000000..666bc260d --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json @@ -0,0 +1,84 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Schedule", + "x-status": "experimental", + "description": "The period and deadline contract from which reporting obligations are created. Every elapsed period produces an obligation even when it has zero rows or production fails, so a consumer can distinguish empty from missing.", + "type": "object", + "properties": { + "period_duration": { + "type": "string", + "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", + "description": "Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M." + }, + "alignment": { + "type": "string", + "enum": [ + "utc", + "account_timezone", + "billing_cycle" + ], + "description": "Calendar used to establish exact period boundaries. The obligation echoes resolved timestamps and source timezone." + }, + "period_anchor": { + "type": "string", + "format": "date-time", + "description": "Required for billing_cycle alignment. This immutable instant anchors the recurring half-open billing periods so producer and consumer derive the same month, quarter, or other contractual cycle." + }, + "period_timezone": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Required IANA timezone for billing_cycle calendar arithmetic. A numeric UTC offset is not sufficient because it does not define DST transitions." + }, + "delivery_sla": { + "type": "string", + "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", + "description": "Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration." + } + }, + "required": [ + "period_duration", + "alignment", + "delivery_sla" + ], + "allOf": [ + { + "if": { + "properties": { + "alignment": { + "const": "billing_cycle" + } + }, + "required": [ + "alignment" + ] + }, + "then": { + "required": [ + "period_anchor", + "period_timezone" + ] + }, + "else": { + "not": { + "anyOf": [ + { + "required": [ + "period_anchor" + ] + }, + { + "required": [ + "period_timezone" + ] + } + ] + } + } + } + ], + "x-adcp-validation": { + "period_generation": "Producer and consumer MUST derive the same ordered half-open intervals from period_duration, alignment, period_anchor, and period_timezone when applicable. utc alignment uses 1970-01-01T00:00:00Z as interval zero. account_timezone uses 1970-01-01T00:00:00 in the account's resolved IANA timezone as interval zero. billing_cycle uses its explicit period_anchor expressed in period_timezone. Every boundary is calculated directly from that origin and the interval ordinal by multiplying each ISO 8601 duration component by the ordinal and applying years, months, days, hours, minutes, then seconds. Calendar durations use local civil-time arithmetic in the selected IANA timezone, including DST transitions; they are not converted to fixed seconds. Month/year addition preserves the origin's local day and time, clamping to the target month's final valid day when necessary. A nonexistent local boundary advances by the timezone gap; an ambiguous local boundary uses the earlier offset. Thus a clamped February boundary does not shift a March 31 anchor." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json b/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json new file mode 100644 index 000000000..c6cc22192 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json @@ -0,0 +1,109 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Status Issue", + "x-status": "experimental", + "description": "Structured reporting condition that explains delayed or action_required health without exposing credentials, provider response bodies, or internal stack traces.", + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": [ + "REPORT_OVERDUE", + "PRODUCTION_FAILED", + "DELIVERY_FAILED", + "ACCESS_REQUIRED", + "CONFIGURATION_REQUIRED", + "RESOURCE_EXPIRED", + "READER_INCOMPATIBLE", + "HISTORY_UNAVAILABLE" + ] + }, + "severity": { + "type": "string", + "enum": [ + "delayed", + "action_required" + ] + }, + "responsible_party": { + "type": "string", + "enum": [ + "buyer", + "seller", + "provider" + ] + }, + "recommended_action": { + "type": "string", + "enum": [ + "wait_for_retry", + "contact_buyer", + "contact_seller", + "contact_provider", + "repair_access", + "update_configuration", + "use_supported_reader" + ] + }, + "message": { + "type": "string", + "maxLength": 500, + "description": "Untrusted display text only. SDKs and agents dispatch exclusively on closed code/recommended_action values and never execute embedded links or instructions." + }, + "reporting_obligation_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_obligation" + }, + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config" + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1 + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "minItems": 1, + "uniqueItems": true + }, + "period_start": { + "type": "string", + "format": "date-time" + }, + "period_end": { + "type": "string", + "format": "date-time" + }, + "expected_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "code", + "severity", + "responsible_party", + "recommended_action" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json b/schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json new file mode 100644 index 000000000..a4de01f9e --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Verification Profile", + "x-status": "experimental", + "description": "Assurance evidence used for one reporting materialization or receipt.", + "type": "string", + "enum": [ + "native_commit", + "manifest_checksums", + "canonical_digest" + ] +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-verification.json b/schemas/cache/3.2.0-beta.6/core/reporting-verification.json new file mode 100644 index 000000000..9b08e85aa --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-verification.json @@ -0,0 +1,164 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Verification", + "x-status": "experimental", + "description": "Producer evidence for one materialization, with an explicit assurance profile. Native commit and manifest profiles prove a committed destination plus row counts and control totals without claiming full logical-content equality. canonical_digest adds exact logical equality and is required for billing. A separate authenticated consumer receipt records what the consumer actually reconciled.", + "type": "object", + "properties": { + "verified_at": { + "type": "string", + "format": "date-time", + "description": "When the producer completed verification through the claimed consumer/destination path." + }, + "verification_path": { + "type": "string", + "enum": [ + "producer", + "representative_consumer", + "destination" + ], + "description": "Path on which verification succeeded. dataset_share readiness requires representative_consumer; delivered warehouse state requires destination." + }, + "verification_profile": { + "$ref": "reporting-verification-profile.json" + }, + "row_count": { + "type": "integer", + "minimum": 0, + "description": "Verified row count. Zero explicitly distinguishes an empty committed revision from a missing revision." + }, + "control_totals": { + "type": "array", + "items": { + "$ref": "reporting-control-total.json" + }, + "uniqueItems": true, + "description": "Profile-defined totals recomputed through verification_path. Names MUST be unique." + }, + "canonical_content_digest": { + "$ref": "reporting-canonical-content-digest.json" + }, + "physical_checksums": { + "type": "array", + "description": "Method-specific byte/object checksums. Different encodings of the same logical revision normally have different values.", + "items": { + "type": "object", + "properties": { + "object_ref": { + "type": "string", + "minLength": 1, + "maxLength": 1024 + }, + "algorithm": { + "type": "string", + "enum": [ + "sha256", + "sha512" + ] + }, + "value": { + "type": "string", + "pattern": "^(?:[A-Fa-f0-9]{64}|[A-Fa-f0-9]{128})$" + } + }, + "required": [ + "object_ref", + "algorithm", + "value" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "native_commit_evidence": { + "type": "object", + "description": "Provider-native immutable version evidence observed through the named consumer or destination path.", + "properties": { + "native_version_ref": { + "type": "string", + "minLength": 1, + "maxLength": 512 + }, + "observed_through": { + "type": "string", + "enum": [ + "representative_consumer", + "destination" + ] + } + }, + "required": [ + "native_version_ref", + "observed_through" + ], + "additionalProperties": false + } + }, + "required": [ + "verified_at", + "verification_path", + "verification_profile", + "row_count", + "control_totals" + ], + "allOf": [ + { + "if": { + "properties": { + "verification_profile": { + "const": "native_commit" + } + }, + "required": [ + "verification_profile" + ] + }, + "then": { + "required": [ + "native_commit_evidence" + ] + } + }, + { + "if": { + "properties": { + "verification_profile": { + "const": "manifest_checksums" + } + }, + "required": [ + "verification_profile" + ] + }, + "then": { + "required": [ + "physical_checksums" + ] + } + }, + { + "if": { + "properties": { + "verification_profile": { + "const": "canonical_digest" + } + }, + "required": [ + "verification_profile" + ] + }, + "then": { + "required": [ + "canonical_content_digest" + ] + } + } + ], + "x-adcp-validation": { + "revision_match": "row_count and control_totals MUST equal the referenced revision. canonical_digest additionally requires a digest equal to the revision digest.", + "assurance_boundary": "native_commit and manifest_checksums prove committed delivery evidence but MUST NOT be described as cryptographic logical-content equality. That claim requires canonical_digest.", + "native_version_match": "When native_commit_evidence is present, native_version_ref MUST equal resource.native_version_ref and observed_through MUST match the consumer/destination verification path.", + "checksum_binding": "Every physical_checksums.object_ref MUST be an object selected by this exact immutable resource/manifest; algorithm and value length MUST agree." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json b/schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json new file mode 100644 index 000000000..df0dfee17 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json @@ -0,0 +1,76 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Write Destination", + "x-status": "experimental", + "description": "Storage or warehouse destination for durable reporting. The caller either references an existing seller-issued immutable destination generation or asks the seller to validate and bind a provider-native location. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes its feed and scope. Changing proof-bound coordinates or the accepted delivery contract produces a new destination_ref. Access grants name advertised producer identities; credentials never transit AdCP.", + "type": "object", + "oneOf": [ + { + "title": "Existing binding", + "properties": { + "mode": { + "type": "string", + "const": "existing" + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "x-entity": "reporting_destination", + "description": "Seller-issued immutable destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." + } + }, + "required": [ + "mode", + "destination_ref" + ], + "additionalProperties": false + }, + { + "title": "Provision binding", + "properties": { + "mode": { + "type": "string", + "const": "provision" + }, + "provider": { + "type": "object", + "description": "Platform hosting the destination.", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" + } + }, + "required": [ + "domain" + ], + "additionalProperties": false + }, + "location": { + "type": "string", + "minLength": 1, + "maxLength": 2048, + "description": "Provider-native bucket, prefix, project/dataset, catalog/schema, or equivalent locator. It MUST NOT contain an embedded credential or signed URL." + }, + "access_mode": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Optional provider access family used for capability matching." + } + }, + "required": [ + "mode", + "provider", + "location" + ], + "additionalProperties": false + } + ], + "x-adcp-validation": { + "authorization": "Bind every destination_ref to the stable authenticated caller. Reuse across that caller's accounts is permitted only after each account configuration independently verifies disclosure authority for its feed and media-buy scope. Reject unknown, unauthorized, and cross-caller refs indistinguishably.", + "destination_proof": "Before ready, prove destination control and caller authority for every selected account, feed, and media-buy scope. A proof-bound coordinate or delivery-contract change creates a new destination_ref; old references remain stable for retained configurations and history. Revoke grants when the configuration, caller authorization, or account becomes inactive." + } +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/x-entity-types.json b/schemas/cache/3.2.0-beta.6/core/x-entity-types.json index aba7d29cc..25ef6fb9e 100644 --- a/schemas/cache/3.2.0-beta.6/core/x-entity-types.json +++ b/schemas/cache/3.2.0-beta.6/core/x-entity-types.json @@ -19,11 +19,16 @@ "product_pricing_option", "vendor_pricing_option", "creative", + "creative_revision", + "creative_representation", + "macro_declaration", + "tracker_execution_selector", "creative_locale_variant", "creative_format", "transformer", "evaluator", "build_variant", + "served_variant", "audience", "audience_evidence", "audience_evidence_snapshot", @@ -56,6 +61,15 @@ "si_session", "offering", "vendor_metric", + "reporting_destination", + "reporting_offering", + "reporting_delivery_config", + "reporting_definition", + "reporting_obligation", + "reporting_revision", + "reporting_materialization", + "reporting_receipt", + "reporting_resource", "identity_relying_party" ], "x-entity-definitions": { @@ -74,11 +88,16 @@ "product_pricing_option": "A pricing tier on a seller's inventory product (CPM / CPC / CPCV / etc). `pricing_option_id` inside `core/package.json` and `media-buy/package-request.json`. Scoped to the seller's product rate card \u2014 not interchangeable with `vendor_pricing_option`.", "vendor_pricing_option": "A pricing tier offered by a vendor agent (rights agent, signals agent, creative agent, governance agent) for its own services. `pricing_option_id` via `core/vendor-pricing-option.json`, also surfaced in `brand/acquire-rights-*`, `signals/activate-signal-request`, `media-buy/build-creative-response`, and `creative/get-creative-features-response`. Scoped to the issuing agent; not interchangeable with `product_pricing_option`.", "creative": "A creative asset (library entry, buyer-assigned). `creative_id` across creative/*, brand/creative-approval-*, and media-buy/package-request.", + "creative_revision": "A buyer-assigned immutable input-content state beneath one durable creative. Identity is the tuple `(creative_id, revision_id)`. `revision_id` round-trips through sync_creatives, list_creatives, creative status webhooks, and delivery readback. Seller transcoding, normalization, and alternate delivery representations do not create a new revision.", + "creative_representation": "One equivalent trafficking representation inside a complete creative representation set. `representation_id` is scoped to the parent creative revision and is echoed in selection and rejection results. Selecting, transcoding, or delivering one representation does not mint a new buyer revision or reuse a served variant identity.", + "macro_declaration": "One occurrence-level macro processing declaration within a creative asset. `declaration_id` in core/macro-declaration.json is echoed by core/macro-resolution-result.json so validation and sync results correlate to the exact declared occurrence. Scoped to the enclosing asset and not globally unique.", + "tracker_execution_selector": "One stable first-class tracker commitment inside an effective Product tracker execution contract. `selector_id` is scoped to the materialized contract, is retained unchanged in the immutable PackageFormatSnapshot, and is later used to attribute contract matching and execution evidence. It is not globally unique without the product or package snapshot identity.", "creative_locale_variant": "A buyer-assigned stable locale execution within one localized creative. `locale_variant_id` round-trips from core/creative-localization.json into sync_creatives and list_creatives readback, then attributes localized executions in get_creative_delivery. Scoped to the parent creative and deliberately distinct from build_variant (a build_creative output leaf) and variant_id (a provider execution observed in reporting).", "creative_format": "A format spec identified by the composite of `agent_url` + `id` (see core/format-id.json).", "transformer": "An account-scoped creative build capability offered by a creative agent (the creative analog of a product) \u2014 a voice, model, style, or director with typed config params and per-account pricing. `transformer_id` via `core/transformer.json`, discovered in `creative/list-transformers-response` and selected in `media-buy/build-creative-request`. Scoped to the issuing creative agent.", "evaluator": "An account-scoped house evaluator preset a buyer attaches to `build_creative` to rank best_of_n variants - the rank-side of the get_creative_features feature oracle. `evaluator_id` on `core/evaluator-spec.json`, selected in `media-buy/build-creative-request`. The evaluator_id itself is pre-provisioned/account-arranged; only the feature vocabulary it emits is discovered via get_adcp_capabilities governance.creative_features. Scoped to the issuing creative agent.", "build_variant": "A single produced creative variant leaf from build_creative \u2014 the leaf-level lineage anchor. `build_variant_id` on `media-buy/build-creative-response` BuildCreativeVariantSuccess `creatives[].variants[]`. Distinct from a served `variant_id` (delivery) and a `preview_id` (preview renders), and distinct from the call-level grouping `build_creative_id`. On the canonical promotion path, the kept build_variant_id becomes the durable creative_id; delivery joins then use creative_id.", + "served_variant": "An agent-assigned immutable creative execution observed in delivery reporting. `variant_id` is unique within the issuing agent and round-trips from get_creative_delivery into preview_creative variant replay when that capability is supported. A distinct source revision, locale, or rendered manifest receives a distinct AdCP variant_id even when the underlying ad platform reuses a native identifier. Distinct from build_variant, creative_revision, and creative_locale_variant.", "audience": "A buyer-managed audience (CRM, lookalike seed, suppression). `audience_id` in media-buy/sync-audiences-request.", "audience_evidence": "A provider-scoped logical series of population-level audience evidence. `evidence_id` in core/audience-evidence.json and core/audience-evidence-selection.json remains stable while immutable snapshots receive distinct snapshot ids and content digests.", "audience_evidence_snapshot": "An immutable seller-scoped audience-evidence snapshot. `snapshot_id` in core/audience-evidence.json and core/audience-evidence-selection.json MUST never be reused for different canonical evidence content.", @@ -111,6 +130,15 @@ "si_session": "A sponsored-intelligence conversation session. `session_id` in sponsored-intelligence/* schemas.", "offering": "A brand-published offering (campaign, promotion, product set, service) promoted via traditional creatives or SI conversations. `offering_id` in core/offering.json, sponsored-intelligence/si-get-offering-*, and sponsored-intelligence/si-initiate-session-request. Also appears as a catalog item-type id when `core/catalog.json::type` is `offering`.", "vendor_metric": "A vendor-defined metric within a measurement vendor's vocabulary. `metric_id` in core/vendor-metric-id.json \u2014 used by reporting-capabilities.vendor_metrics declarations, delivery-metrics.vendor_metric_values emissions, and required_vendor_metrics filters. Identity is the tuple `(vendor.domain, vendor.brand_id, metric_id)` \u2014 the identifier is namespaced by the vendor's BrandRef, not globally unique. Vendor catalog (category, methodology, standard alignment) lives at the vendor's brand.json `agents[type='measurement']`.", + "reporting_destination": "A seller-resolved durable reporting destination, recipient, share, or grant binding. It may be provisioned through sync_accounts or established bilaterally; destination_ref is opaque within one authenticated caller and seller/account relationship and never contains a credential.", + "reporting_offering": "One seller-advertised atomic reporting feed/profile/schema/schedule/finality/method combination, selected by offering_id during durable delivery configuration.", + "reporting_delivery_config": "One caller-owned durable reporting policy on an account. delivery_config_id is unique within (authenticated caller, account) and persists when inactive so historical materializations remain resolvable.", + "reporting_definition": "An immutable normalized reporting query/profile definition. report_definition_id binds metric, grain, attribution, breakdown, action-definition, schema, and calendar/timezone semantics so unlike logical slices cannot collide.", + "reporting_obligation": "One expected report slice and due time. reporting_obligation_id exists before a revision or webhook and is what makes a missing first report observable.", + "reporting_revision": "One immutable emitted version of a reporting obligation's logical content. reporting_revision_id remains stable across materializations; a restatement receives a new id and points to the immediately superseded revision.", + "reporting_materialization": "One attempt to expose an exact reporting revision through one delivery path. A retry receives a new reporting_materialization_id while preserving reporting_revision_id.", + "reporting_receipt": "One authenticated consumer reconciliation outcome for an exact reporting materialization.", + "reporting_resource": "One seller-issued secret-free descriptor for an exact reporting materialization, resolved by resource_ref through get_reporting_status. Native platform versions supplement but do not replace this identity.", "identity_relying_party": "A verified-identity relying party an entity operates for attestation provenance in TMP Identity Match. `relying_party_id` in brand.json identity_relying_parties[] and trusted-match/identity-match-request.json attestation. Namespaced by the issuer (a vendor BrandRef, `core/brand-ref.json`) \u2014 identity is the tuple `(issuer.domain, issuer.brand_id, relying_party_id)`, mirroring vendor_metric's `(vendor.domain, vendor.brand_id, metric_id)`; the same string under a different issuer is a different relying party. The publishing owner (whose brand.json lists it) asserts ownership, and the receiver matches a forwarded attestation's `(issuer, relying_party_id)` against the claimed owner's published list; the issuer's own relying-party registry (e.g. World ID on-chain) is the authoritative root. One entity may operate many relying parties (scope=entity vs scope=property) \u2014 not 1:1 with an entity." } } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/notification-type.json b/schemas/cache/3.2.0-beta.6/enums/notification-type.json index 9826cc5d6..ed471f6b4 100644 --- a/schemas/cache/3.2.0-beta.6/enums/notification-type.json +++ b/schemas/cache/3.2.0-beta.6/enums/notification-type.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Notification Type", - "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`) fire against an account's `notification_configs[]` entries whose `event_types` include the value \u2014 these outlive any single media buy and anchor at the account. `indicators.changed` and `creative.assignment_changed` are invalidations repaired completely through `get_media_buys`; `list_creatives` may provide a bounded reverse projection. Agent-anchored notifications (`capabilities.changed`) fire against the agent-level subscriber set managed by `sync_agent_notification_configs`; they are valid before a buyer has any account. Account status changes use `account.status_changed` as an invalidation signal; receivers repair by re-reading `list_accounts`. Wholesale feed notifications carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; product mirrors repair through `list_products` using `if_feed_version` and signal mirrors through `get_signals` using `if_wholesale_feed_version` (`get_products` remains the deprecated 3.x product fallback). Capability-change notifications carry only an invalidation payload in `/schemas/core/capabilities-changed-webhook.json`; receivers repair by re-reading `get_adcp_capabilities`. New notification types added to this enum MUST declare their anchor (media-buy, account, or agent), logical `notification_id` semantics, and repair key in the enumDescription. Sellers MUST reject `notification_configs[]` entries whose `event_types` include any media-buy-anchored or agent-anchored type, MUST reject `sync_agent_notification_configs` entries whose `event_types` include any media-buy-anchored or account-anchored type, and MUST reject `push_notification_config` registrations for persistent account-anchored or agent-anchored types.", + "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`, `reporting.delivery_ready`) fire against an account's `notification_configs[]` entries whose `event_types` include the value. reporting.delivery_ready is a compact doorbell repaired through get_reporting_status; indicator and assignment invalidations are repaired through get_media_buys. Agent-anchored notifications (`capabilities.changed`) fire against the agent-level subscriber set managed by `sync_agent_notification_configs`. New notification types MUST declare their anchor, logical notification_id semantics, and repair key in enumDescriptions. Sellers MUST reject account registrations for media-buy/agent types, agent registrations for media-buy/account types, and per-buy registrations for persistent account/agent types.", "type": "string", "enum": [ "scheduled", @@ -24,7 +24,8 @@ "signal.priced", "signal.removed", "wholesale_feed.bulk_change", - "capabilities.changed" + "capabilities.changed", + "reporting.delivery_ready" ], "enumDescriptions": { "scheduled": "Scheduled delivery report fire. Fired at the cadence the buyer registered on reporting_webhook (e.g., hourly, daily). Carries the window's delivery metrics. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", @@ -47,6 +48,7 @@ "signal.priced": "Sent when signal pricing changes in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.priced` event with the full post-change `pricing_options[]`, optional retired pricing ids, and optional `effective_at`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "signal.removed": "Sent when a signal is no longer available in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.removed` event with the signal id, optional removal reason, and cache scope. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "wholesale_feed.bulk_change": "Sent when one operation changes too many wholesale product-feed or wholesale signals-feed entities for useful per-entity pushes. Payload: `wholesale-feed-webhook.json` carrying a `wholesale_feed.bulk_change` event with one affected entity type, approximate count, and repair recommendation. Receivers repair products through `list_products` (or deprecated 3.x `get_products`) and signals through `get_signals`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", - "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each `sync_agent_notification_configs.notification_configs[]` entry whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id." + "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each `sync_agent_notification_configs.notification_configs[]` entry whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id.", + "reporting.delivery_ready": "Experimental account-anchored readiness doorbell. Fires after one immutable reporting materialization is observable through the intended consumer path. Payload: `reporting-delivery-ready-webhook.json`; it carries identities and readiness metadata, never report rows or credentials. Receivers repair missed, duplicate, or out-of-order fires through `get_reporting_status`. **notification_id**: stable per reporting_materialization_id reaching its ready state across re-emissions; a new retry/materialization receives a new id." } } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/reporting-finality.json b/schemas/cache/3.2.0-beta.6/enums/reporting-finality.json new file mode 100644 index 000000000..8683a4d2d --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/enums/reporting-finality.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Finality", + "description": "Finality of a reporting revision, aligned with the delivery-revision vocabulary proposed in #6122. Finality is independent of immutable revision identity: both snapshot and official revisions may be superseded by later revisions.", + "type": "string", + "enum": [ + "snapshot", + "official" + ], + "enumDescriptions": { + "snapshot": "Provisional seller/source reporting evidence; not sufficient by itself for billing.", + "official": "The seller considers the represented period finalized, subject to separate measurement, billing, and settlement terms." + } +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/reporting-health.json b/schemas/cache/3.2.0-beta.6/enums/reporting-health.json new file mode 100644 index 000000000..aead93da8 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/enums/reporting-health.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reporting Health", + "description": "Operational health for an explicitly echoed reporting scope. Aggregate precedence is action_required, delayed, then healthy. waiting applies only when no active obligation is due. complete applies only when the queried scope is closed, retained coverage is complete, and every obligation has its configured required finality plus a verified readable materialization.", + "type": "string", + "enum": [ + "healthy", + "waiting", + "delayed", + "action_required", + "complete" + ], + "enumDescriptions": { + "healthy": "Due obligations in the queried active scope are current and automated delivery is working.", + "waiting": "No obligation in the queried active scope is due yet.", + "delayed": "At least one obligation is late, but remains within the seller's declared automated recovery path.", + "action_required": "A delivery, SLA, or retry boundary was crossed and at least one structured human action is supplied.", + "complete": "The queried scope is closed, retained coverage is complete, and every obligation has its configured required finality plus a verified readable materialization." + } +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/task-type.json b/schemas/cache/3.2.0-beta.6/enums/task-type.json index 7b294045e..6cf3fbf98 100644 --- a/schemas/cache/3.2.0-beta.6/enums/task-type.json +++ b/schemas/cache/3.2.0-beta.6/enums/task-type.json @@ -36,7 +36,8 @@ "get_rights", "acquire_rights", "update_rights", - "sync_agent_notification_configs" + "sync_agent_notification_configs", + "sync_reporting_receipts" ], "enumDescriptions": { "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", @@ -71,7 +72,8 @@ "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials", "update_rights": "Brand domain: Update an existing rights grant, including its term, impression cap, pricing option, or pause state", - "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications" + "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications", + "sync_reporting_receipts": "Media-buy domain: Submit authenticated consumer reconciliation outcomes for reporting materializations" }, "x-task-result-schema-overrides": { "media_buy_delivery": "media-buy/media-buy-delivery-webhook-result.json" diff --git a/schemas/cache/3.2.0-beta.6/index.json b/schemas/cache/3.2.0-beta.6/index.json index 3aa95154b..3924644d4 100644 --- a/schemas/cache/3.2.0-beta.6/index.json +++ b/schemas/cache/3.2.0-beta.6/index.json @@ -3,14 +3,14 @@ "title": "AdCP Schema Registry", "version": "1.0.0", "description": "Registry of all AdCP JSON schemas for validation and discovery", - "adcp_version": "3.2.0-beta.6", + "adcp_version": "3.2.0-beta.8", "versioning": { - "note": "AdCP uses build-time versioning. This directory contains schemas for AdCP 3.2.0-beta.6. Full semantic versions are available at /schemas/{version}/ (e.g., /schemas/2.5.0/). Major version aliases point to the latest stable release in that major line; use /schemas/index.json or /schemas/latest.json for the canonical file-based pointer." + "note": "AdCP uses path-based versioning. The schema URL path (/schemas/) indicates the version. Individual request/response schemas do NOT include adcp_version fields. Compatibility follows semantic versioning rules." }, - "lastUpdated": "2026-08-23", - "baseUrl": "/schemas/3.2.0-beta.6", - "stability": "beta", - "prerelease": true, + "lastUpdated": "2026-06-05", + "baseUrl": "/schemas/latest", + "stability": "development", + "prerelease": false, "deprecated": false, "protocol_layers": [ { @@ -41,921 +41,997 @@ "description": "Core data models used throughout AdCP", "schemas": { "product": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product.json", + "$ref": "core/product.json", "description": "Represents available advertising inventory" }, "canonical-product": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-product.json", + "$ref": "core/canonical-product.json", "description": "Canonical-only product view for the AdCP 3.2 split product and proposal tools" }, "canonical-format-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-format-option.json", + "$ref": "core/canonical-format-option.json", "description": "Compact canonical format declaration without legacy named-format links" }, + "creative-operation-format-declaration": { + "$ref": "core/creative-operation-format-declaration.json", + "description": "Authority-free canonical declaration for creative-agent build, validation, and preview capabilities" + }, "canonical-placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-placement.json", + "$ref": "core/canonical-placement.json", "description": "Compact canonical product placement" }, "canonical-product-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-product-action.json", + "$ref": "core/canonical-product-action.json", "description": "Fine-grained action template for compact products" }, "canonical-proposal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-proposal.json", + "$ref": "core/canonical-proposal.json", "description": "Compact immutable proposal with a typed commercial envelope" }, "canonical-account-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-account-ref.json", + "$ref": "core/canonical-account-ref.json", "description": "Compact account identity without inline brand documents" }, "canonical-budget-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-budget-allocation.json", + "$ref": "core/canonical-budget-allocation.json", "description": "Compact budget allocation for canonical MediaBuy tools" }, "canonical-optimization-goal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-optimization-goal.json", + "$ref": "core/canonical-optimization-goal.json", "description": "Compact optimization goal without legacy targets or inline vendor brands" }, "canonical-metric-qualifier": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-metric-qualifier.json", + "$ref": "core/canonical-metric-qualifier.json", "description": "Compact reporting metric qualifier" }, "canonical-reporting-commitment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-reporting-commitment.json", + "$ref": "core/canonical-reporting-commitment.json", "description": "Compact standard or vendor reporting commitment" }, "canonical-media-buy-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-media-buy-action.json", + "$ref": "core/canonical-media-buy-action.json", "description": "Available MediaBuy action routed to its compact-lifecycle task" }, "keyword-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/keyword-target.json", + "$ref": "core/keyword-target.json", "description": "Compact keyword targeting mutation" }, "compact-task-submitted": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-submitted.json", + "$ref": "core/compact-task-submitted.json", "description": "Shared submitted envelope for compact lifecycle tools" }, "compact-task-working": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-working.json", + "$ref": "core/compact-task-working.json", "description": "Shared progress payload for compact lifecycle tools" }, "compact-task-input-required": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-input-required.json", + "$ref": "core/compact-task-input-required.json", "description": "Shared input-required payload for compact lifecycle tools" }, "media-buy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/media-buy.json", + "$ref": "core/media-buy.json", "description": "Represents a purchased advertising campaign" }, "package": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package.json", + "$ref": "core/package.json", "description": "A specific product within a media buy (line item)" }, + "package-format-snapshot": { + "$ref": "core/package-format-snapshot.json", + "description": "Immutable package-time selected product format, placement, execution-version, and tracker-contract binding" + }, "committed-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/committed-metric.json", + "$ref": "core/committed-metric.json", "description": "One metric in a package's binding reporting contract" }, "creative-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-asset.json", + "$ref": "core/creative-asset.json", "description": "Creative asset for upload to library - supports static assets, generative formats, and third-party ad serving (VAST, DAAST, HTML, JavaScript)" }, "locale-tag": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/locale-tag.json", + "$ref": "core/locale-tag.json", "description": "BCP 47 language-identity tag using the AdCP canonical wire profile \u2014 required shared primitive for new language-bearing fields" }, "creative-localization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-localization.json", + "$ref": "core/creative-localization.json", "description": "Explicit source and target locale variants requested on a creative" }, "localized-creative-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/localized-creative-asset.json", + "$ref": "core/localized-creative-asset.json", "description": "Creative variant asset with contextual language-tag conformance" }, "creative-localization-readback": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-localization-readback.json", + "$ref": "core/creative-localization-readback.json", "description": "Exact materialized locale assets, buyer-assigned identities, and matching policy" }, "account": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account.json", + "$ref": "core/account.json", "description": "Billing account representing who pays for advertising. Accounts have rate cards, payment terms, and platform mappings." }, "operator-identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-identity.json", + "$ref": "core/operator-identity.json", "description": "Complete buyer-desired operator domain and optional operator-owned unit for an advertiser account" }, "account-identity-change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", + "$ref": "core/account-identity-change.json", "description": "Pending or rejected operator-identity transition on an existing account" }, "account-identity-change-preview": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change-preview.json", + "$ref": "core/account-identity-change-preview.json", "description": "Non-persisted impact and disposition preview for a dry-run account identity transition" }, "account-with-authorization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-with-authorization.json", + "$ref": "core/account-with-authorization.json", "description": "List-accounts response item combining Account with caller-specific authorization metadata" }, "targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting.json", + "$ref": "core/targeting.json", "description": "Audience targeting criteria" }, "targeting-overlay-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-overlay-support.json", + "$ref": "core/targeting-overlay-support.json", "description": "Product-scoped targeting dimensions whose values may be supplied on packages later" }, "targeting-overlay-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-overlay-requirements.json", + "$ref": "core/targeting-overlay-requirements.json", "description": "Buyer requirements for product-scoped targeting dimensions that must remain selectable on packages" }, "geo-region-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-region-requirement.json", + "$ref": "core/geo-region-requirement.json", "description": "Buyer country/value requirements for ISO subdivision targeting selected later" }, "geo-region-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-region-support.json", + "$ref": "core/geo-region-support.json", "description": "Country- and value-aware selectable ISO subdivision targeting support" }, "product-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-targeting-resolution.json", + "$ref": "core/product-targeting-resolution.json", "description": "Discovery-time targeting modifications bound to a configured product" }, "package-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-targeting-resolution.json", + "$ref": "core/package-targeting-resolution.json", "description": "Execution details for targeting accepted on a booked package" }, "targeting-modification": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-modification.json", + "$ref": "core/targeting-modification.json", "description": "One buyer-reviewable targeting modification on a configured product" }, "placement-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-selection.json", + "$ref": "core/placement-selection.json", "description": "Purchased placement inventory selection within a product" }, "demographic-age-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-age-range.json", + "$ref": "core/demographic-age-range.json", "description": "Canonical inclusive age interval with explicit unknown-age membership" }, "demographic-predicate": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-predicate.json", + "$ref": "core/demographic-predicate.json", "description": "Portable demographic audience intent, beginning with age in AdCP 3.2" }, "demographic-targeting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-targeting-capability.json", + "$ref": "core/demographic-targeting-capability.json", "description": "Product-scoped demographic execution modes and exact interval capabilities" }, "demographic-reporting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-reporting-capability.json", + "$ref": "core/demographic-reporting-capability.json", "description": "Product-scoped demographic reporting ranges, systems, and suppression posture" }, "demographic-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-targeting-resolution.json", + "$ref": "core/demographic-targeting-resolution.json", "description": "Requested, applied, execution, and exact-equivalence demographic readback" }, "audience-characteristic": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-characteristic.json", + "$ref": "core/audience-characteristic.json", "description": "Machine-comparable audience dimension and value or range" }, "audience-evidence": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence.json", + "$ref": "core/audience-evidence.json", "description": "Immutable population-level audience composition, affinity, or reach evidence" }, "audience-evidence-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-requirements.json", + "$ref": "core/audience-evidence-requirements.json", "description": "Buyer-authored audience-evidence admissibility and ranking policy" }, "audience-evidence-pin": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-pin.json", + "$ref": "core/audience-evidence-pin.json", "description": "Buyer commitment pin for an exact immutable audience-evidence snapshot" }, "audience-evidence-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-selection.json", + "$ref": "core/audience-evidence-selection.json", "description": "Digest-pinned package readback for evidence used in a decision" }, "duration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/duration.json", + "$ref": "core/duration.json", "description": "A time duration with value and unit (hours or days)" }, "feature-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/feature-requirement.json", + "$ref": "core/feature-requirement.json", "description": "A feature-based requirement \u2014 reusable predicate over a feature value. Used by property list filters, designed for reuse across governance surfaces." }, "frequency-cap": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/frequency-cap.json", + "$ref": "core/frequency-cap.json", "description": "Frequency capping settings" }, "planned-delivery": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/planned-delivery.json", + "$ref": "core/planned-delivery.json", "description": "The seller's interpreted delivery parameters for a media buy" }, "geo-breakdown-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-breakdown-support.json", + "$ref": "core/geo-breakdown-support.json", "description": "Geographic breakdown capability declaration for reporting" }, "spot-reporting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/spot-reporting-capability.json", + "$ref": "core/spot-reporting-capability.json", "description": "Spot-level as-run reporting support and available spot-grain metrics" }, "format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/format.json", + "$ref": "core/format.json", "description": "Deprecated 3.x named-format compatibility definition; use ProductFormatDeclaration canonical contracts for new integrations.", "deprecated": true }, "overlay": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/overlay.json", + "$ref": "core/overlay.json", "description": "A publisher-controlled element that renders on top of buyer creative content within an ad placement" }, "outcome-measurement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/outcome-measurement.json", + "$ref": "core/outcome-measurement.json", "description": "Business outcome measurement capabilities included with a product" }, "delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-metrics.json", + "$ref": "core/delivery-metrics.json", "description": "Standard delivery metrics for reporting" }, "delivery-metric-aggregate": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-metric-aggregate.json", + "$ref": "core/delivery-metric-aggregate.json", "description": "Cross-buy delivery aggregate partitioned by metric scope and qualifier" }, + "placement-evidence": { + "$ref": "core/placement-evidence.json", + "description": "Seller-attested evidence artifact proving a physical placement ran (posting photo, tearsheet)" + }, "missing-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/missing-metric.json", + "$ref": "core/missing-metric.json", "description": "Metric from the binding reporting contract that is absent from a delivery report" }, "catalog-item-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog-item-delivery-metrics.json", + "$ref": "core/catalog-item-delivery-metrics.json", "description": "Delivery metrics row for one catalog item" }, "creative-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-delivery-metrics.json", + "$ref": "core/creative-delivery-metrics.json", "description": "Delivery metrics row for one creative" }, "keyword-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/keyword-delivery-metrics.json", + "$ref": "core/keyword-delivery-metrics.json", "description": "Delivery metrics row for one keyword and match type" }, "geo-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-delivery-metrics.json", + "$ref": "core/geo-delivery-metrics.json", "description": "Delivery metrics row for one geographic area" }, "creative-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-policy.json", + "$ref": "core/creative-policy.json", "description": "Creative requirements and restrictions for a product" }, "deadline-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/deadline-policy.json", + "$ref": "core/deadline-policy.json", "description": "Default deadline rules for installments based on lead times from scheduled_at" }, "installment-deadlines": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/installment-deadlines.json", + "$ref": "core/installment-deadlines.json", "description": "Booking, cancellation, and material submission deadlines for an installment" }, "material-deadline": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/material-deadline.json", + "$ref": "core/material-deadline.json", "description": "A deadline for creative material submission at a specific stage" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/response.json", + "$ref": "core/response.json", "description": "Standard response structure (MCP)" }, "error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json", + "$ref": "core/error.json", "description": "Standard error structure" }, "generation-credential": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/generation-credential.json", + "$ref": "core/generation-credential.json", "description": "Scoped credential for generating rights-cleared content via LLM providers" }, "attestation-issuer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-issuer.json", + "$ref": "core/attestation-issuer.json", "description": "Typed canonical identity of an attestation credential issuer" }, "attestation-subject": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-subject.json", + "$ref": "core/attestation-subject.json", "description": "Typed identity of the entity or object an attestation concerns" }, "attestation-reference": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-reference.json", + "$ref": "core/attestation-reference.json", "description": "Reference-first presentation of an independently issued claim" }, "attestation-capabilities": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-capabilities.json", + "$ref": "core/attestation-capabilities.json", "description": "Evaluator allowlist and supported attestation delivery and proof formats" }, "attestation-evaluation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-evaluation.json", + "$ref": "core/attestation-evaluation.json", "description": "Evaluator-of-record result bound to an exact attestation presentation" }, "rights-attestation-evaluation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/rights-attestation-evaluation.json", + "$ref": "core/rights-attestation-evaluation.json", "description": "Seller-produced rights-grant presentation and evaluation readback" }, "rights-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/rights-constraint.json", + "$ref": "core/rights-constraint.json", "description": "Digest-pinned rights metadata and portable issuer-attestation references attached to creatives" }, "pagination-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pagination-request.json", + "$ref": "core/pagination-request.json", "description": "Standard cursor-based pagination parameters for list request schemas" }, "pagination-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pagination-response.json", + "$ref": "core/pagination-response.json", "description": "Standard cursor-based pagination metadata for list response schemas" }, "date-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/date-range.json", + "$ref": "core/date-range.json", "description": "Date range with inclusive start and end calendar dates" }, "opportunity-context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/opportunity-context.json", + "$ref": "core/opportunity-context.json", "description": "Buyer planning-cycle context shared across proposal request, decline, and purchase" }, "datetime-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/datetime-range.json", + "$ref": "core/datetime-range.json", "description": "Datetime range with inclusive start and end timestamps" }, "creative-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-item.json", + "$ref": "core/creative-item.json", "description": "Item within a multi-asset creative format" }, "creative-assignment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-assignment.json", + "$ref": "core/creative-assignment.json", "description": "Assignment of a creative asset to a package" }, "creative-manifest": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-manifest.json", + "$ref": "core/creative-manifest.json", "description": "Complete specification of a creative with all assets needed for rendering" }, + "creative-representation-set": { + "$ref": "core/creative-representation-set.json", + "description": "Complete immutable creative revision containing equivalent pre-binding trafficking representations" + }, + "creative-representation": { + "$ref": "core/creative-representation.json", + "description": "One canonical pre-binding trafficking representation within a representation set" + }, + "representation-destination": { + "$ref": "core/representation-destination.json", + "description": "Seller-owned product and format context for deterministic representation resolution" + }, + "representation-selection": { + "$ref": "core/representation-selection.json", + "description": "Source-revision, selected-representation, strategy, and derived-output lineage" + }, + "representation-rejection": { + "$ref": "core/representation-rejection.json", + "description": "Structured incompatibility reason for one rejected representation" + }, + "macro-bearing-url": { + "$ref": "core/macro-bearing-url.json", + "description": "HTTP(S) URL or legacy URI template that may contain declared or opaque macro tokens" + }, + "macro-declaration": { + "$ref": "core/macro-declaration.json", + "description": "Occurrence-level source token, semantic, actor, context, and encoding contract" + }, + "macro-encoding": { + "$ref": "core/macro-encoding.json", + "description": "Exact macro value encoding kind and pass depth" + }, + "macro-resolution-capability": { + "$ref": "core/macro-resolution-capability.json", + "description": "Exact dialect-semantic macro processing capability tuple" + }, + "macro-resolution-result": { + "$ref": "core/macro-resolution-result.json", + "description": "Path-addressable macro compatibility result for one declaration" + }, + "macro-translation-target": { + "$ref": "core/macro-translation-target.json", + "description": "Native token contract emitted by a macro translation operation" + }, "performance-feedback": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/performance-feedback.json", + "$ref": "core/performance-feedback.json", "description": "Stored processing record for performance feedback" }, "performance-feedback-assertion": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/performance-feedback-assertion.json", + "$ref": "core/performance-feedback-assertion.json", "description": "One compact optimizer-ready assertion about a media buy, package, or creative" }, "creative-variant": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-variant.json", + "$ref": "core/creative-variant.json", "description": "A specific execution variant of a creative with performance metrics" }, + "creative-revision-id": { + "$ref": "core/creative-revision-id.json", + "description": "Buyer-assigned immutable input-content revision identity scoped to a creative" + }, "property": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property.json", + "$ref": "core/property.json", "description": "An advertising property that can be validated via adagents.json" }, "creative-brief": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-brief.json", + "$ref": "core/creative-brief.json", "description": "Campaign-level creative context for AI-powered creative generation" }, "creative-variable": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-variable.json", + "$ref": "core/creative-variable.json", "description": "A dynamic content variable (DCO slot) on a creative" }, "reference-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reference-asset.json", + "$ref": "core/reference-asset.json", "description": "A reference asset with semantic role for creative context" }, "registry-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/registry-event.json", + "$ref": "core/registry-event.json", "description": "A cursor-ordered registry change-feed event from /api/registry/feed" }, "registry-feed-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/registry-feed-response.json", + "$ref": "core/registry-feed-response.json", "description": "Response wrapper for GET /api/registry/feed" }, "proposal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/proposal.json", + "$ref": "core/proposal.json", "description": "A proposed media plan with budget allocations across products - actionable via create_media_buy" }, "budget-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/budget-allocation.json", + "$ref": "core/budget-allocation.json", "description": "Fixed or seller-optimized allocation of a media-buy total budget across packages" }, "bidding-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/bidding-policy.json", + "$ref": "core/bidding-policy.json", "description": "Buyer-authored bidding, average-cost, or return policy at media-buy or package scope" }, "insertion-order": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/insertion-order.json", + "$ref": "core/insertion-order.json", "description": "A formal insertion order attached to a committed proposal for agreement signing" }, "product-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-allocation.json", + "$ref": "core/product-allocation.json", "description": "A budget allocation for a specific product within a proposal" }, "delivery-forecast": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-forecast.json", + "$ref": "core/delivery-forecast.json", "description": "Forecasted delivery metrics for a proposal or product allocation" }, "signal-coverage-forecast": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-coverage-forecast.json", + "$ref": "core/signal-coverage-forecast.json", "description": "Forecast-shaped availability guidance for a signal, without requiring monetary currency" }, "forecast-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-range.json", + "$ref": "core/forecast-range.json", "description": "A forecast value with optional low/high bounds" }, "forecast-point": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-point.json", + "$ref": "core/forecast-point.json", "description": "A single point on a budget-to-outcome curve" }, "forecast-point-dimensions": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-point-dimensions.json", + "$ref": "core/forecast-point-dimensions.json", "description": "Dimensional slice represented by a forecast point" }, "forecast-dimension-geo": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-geo.json", + "$ref": "core/forecast-dimension-geo.json", "description": "Geographic forecast dimension variant" }, "forecast-dimension-placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-placement.json", + "$ref": "core/forecast-dimension-placement.json", "description": "Placement forecast dimension variant" }, "forecast-dimension-device-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-device-type.json", + "$ref": "core/forecast-dimension-device-type.json", "description": "Device form-factor forecast dimension variant" }, "forecast-dimension-device-platform": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-device-platform.json", + "$ref": "core/forecast-dimension-device-platform.json", "description": "Device platform forecast dimension variant" }, "forecast-dimension-audience": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-audience.json", + "$ref": "core/forecast-dimension-audience.json", "description": "Audience forecast dimension variant" }, "forecast-dimension-signal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-signal.json", + "$ref": "core/forecast-dimension-signal.json", "description": "Signal forecast dimension variant" }, "forecast-dimension-time": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-time.json", + "$ref": "core/forecast-dimension-time.json", "description": "Calendar-window forecast dimension variant for availability windows" }, "forecast-vendor-metric-value": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-vendor-metric-value.json", + "$ref": "core/forecast-vendor-metric-value.json", "description": "Forecasted vendor-defined measurement value with low/mid/high bounds" }, "catalog": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog.json", + "$ref": "core/catalog.json", "description": "A typed data feed \u2014 structural (offering, product, inventory, store, promotion) or vertical (hotel, flight, job, vehicle, real_estate, education, destination). Can be synced, inline, or fetched from a URL." }, "wholesale-feed-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/wholesale-feed-event.json", + "$ref": "core/wholesale-feed-event.json", "description": "A wholesale product feed or wholesale signals feed event carried by wholesale feed webhooks" }, "offering": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/offering.json", + "$ref": "core/offering.json", "description": "A promotable offering from a brand with structured asset groups and optional conversational SI experiences" }, "offering-asset-group": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/offering-asset-group.json", + "$ref": "core/offering-asset-group.json", "description": "A structured group of creative assets within an offering, identified by group ID and asset type" }, "postal-area": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-area.json", + "$ref": "core/postal-area.json", "description": "Reusable postal area value for targeting, product filtering, and catalog scope" }, "postal-country-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-country-system.json", + "$ref": "core/postal-country-system.json", "description": "Valid country and local postal system pairings" }, "postal-area-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-area-support.json", + "$ref": "core/postal-area-support.json", "description": "Reusable postal area support map for capabilities and reporting" }, "geo-place-area": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-area.json", + "$ref": "core/geo-place-area.json", "description": "Catalog-backed named place target using stable identifiers in a declared system" }, "geo-place-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-requirement.json", + "$ref": "core/geo-place-requirement.json", "description": "Collision-safe identifier systems, countries, place types, and catalog versions required for later package selection" }, "geo-place-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-support.json", + "$ref": "core/geo-place-support.json", "description": "Countries and place types supported for one place identifier system" }, "geo-place-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-system.json", + "$ref": "core/geo-place-system.json", "description": "Registered geographic place identifier namespaces with HTTPS URI extensions" }, "geo-place-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-type.json", + "$ref": "core/geo-place-type.json", "description": "Registered geographic place classifications with HTTPS URI extensions" }, "geo-place-resolver": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-resolver.json", + "$ref": "core/geo-place-resolver.json", "description": "Machine-readable endpoint declaration for resolving place names to seller-accepted IDs" }, "get-geo-place-resolution-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/get-geo-place-resolution-request.json", + "$ref": "core/get-geo-place-resolution-request.json", "description": "Standard query parameters for geographic place resolution" }, "get-geo-place-resolution-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/get-geo-place-resolution-response.json", + "$ref": "core/get-geo-place-resolution-response.json", "description": "Paginated geographic place resolver results" }, "geo-place-catalog-entry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-catalog-entry.json", + "$ref": "core/geo-place-catalog-entry.json", "description": "One place identifier with lifecycle and replacement metadata" }, "geo-place-catalog-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-catalog-capability.json", + "$ref": "core/geo-place-catalog-capability.json", "description": "Supported versions and resolver for one place identifier system" }, "asset-group-vocabulary": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/asset-group-vocabulary.json", + "$ref": "core/asset-group-vocabulary.json", "description": "Canonical registry of asset_group_id values with descriptions and v1 alias mapping (e.g., landing_page_url replaces 6 v1 alias names)" }, "product-format-declaration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-format-declaration.json", + "$ref": "core/product-format-declaration.json", "description": "v2 inline format declaration on products. Keyed by canonical format name; product narrows exactly one canonical with platform-specific parameters." }, + "tracker-execution-contract": { + "$ref": "core/tracker-execution-contract.json", + "description": "Seller production commitment for accepted first-class manifest tracker execution" + }, + "tracker-execution-selector": { + "$ref": "core/tracker-execution-selector.json", + "description": "Exact pixel, VAST, or DAAST tracker selector in a production execution contract" + }, + "vast-tracker-constraints": { + "$ref": "core/vast-tracker-constraints.json", + "description": "Shared version-aware VAST tracker event and target constraints" + }, + "daast-tracker-constraints": { + "$ref": "core/daast-tracker-constraints.json", + "description": "Shared DAAST tracker event and target constraints" + }, "downstream-connection-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/downstream-connection-requirement.json", + "$ref": "core/downstream-connection-requirement.json", "description": "Seller/platform-side connection or grant required by a product, format, or request, distinct from the AdCP caller credential." }, "canonical-projection-slot-override": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-projection-slot-override.json", + "$ref": "core/canonical-projection-slot-override.json", "description": "Slot override used when projecting a legacy named format to a canonical format declaration" }, "platform-extension-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/platform-extension-ref.json", + "$ref": "core/platform-extension-ref.json", "description": "Reference to a platform extension definition (URI + content digest)." }, "reference-renderer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reference-renderer.json", + "$ref": "core/reference-renderer.json", "description": "Pinned npm package export for a non-authoritative community reference presentation." }, "store-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/store-item.json", + "$ref": "core/store-item.json", "description": "A physical store or location with coordinates, address, and catchment areas for proximity targeting" }, "catchment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catchment.json", + "$ref": "core/catchment.json", "description": "A catchment area definition using travel time (isochrone), simple radius, or pre-computed GeoJSON geometry" }, "price": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/price.json", + "$ref": "core/price.json", "description": "A monetary amount with currency and optional billing period for catalog item pricing" }, "hotel-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/hotel-item.json", + "$ref": "core/hotel-item.json", "description": "A hotel or lodging property for hotel-type catalogs" }, "flight-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/flight-item.json", + "$ref": "core/flight-item.json", "description": "A flight route for flight-type catalogs" }, "job-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/job-item.json", + "$ref": "core/job-item.json", "description": "A job posting for job-type catalogs" }, "vehicle-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vehicle-item.json", + "$ref": "core/vehicle-item.json", "description": "A vehicle listing for vehicle-type catalogs" }, "real-estate-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/real-estate-item.json", + "$ref": "core/real-estate-item.json", "description": "A property listing for real-estate-type catalogs" }, "education-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/education-item.json", + "$ref": "core/education-item.json", "description": "An educational program or course for education-type catalogs" }, "destination-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/destination-item.json", + "$ref": "core/destination-item.json", "description": "A travel destination for destination-type catalogs" }, "start-timing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/start-timing.json", + "$ref": "core/start-timing.json", "description": "Campaign start timing: 'asap' or ISO 8601 date-time" }, "pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pricing-option.json", + "$ref": "core/pricing-option.json", "description": "A pricing model option offered by a publisher for a product" }, "protocol-envelope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/protocol-envelope.json", + "$ref": "core/protocol-envelope.json", "description": "Standard envelope structure added by protocol layer (MCP, A2A, REST) that wraps task response payloads with protocol-level fields like status, context_id, task_id, and message" }, "agent-signing-key": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-signing-key.json", + "$ref": "core/agent-signing-key.json", "description": "Publisher-attested public key material for an authorized agent" }, "response-payload-jws-envelope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/response-payload-jws-envelope.json", + "$ref": "core/response-payload-jws-envelope.json", "description": "Decoded-payload JWS envelope used by the closed designated-task response-signing profile" }, "placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement.json", + "$ref": "core/placement.json", "description": "Represents a specific ad placement within a product's inventory" }, "placement-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-ref.json", + "$ref": "core/placement-ref.json", "description": "Reference to a publisher-scoped placement" }, "format-option-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/format-option-ref.json", + "$ref": "core/format-option-ref.json", "description": "Reference to a publisher-scoped format option" }, "placement-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-definition.json", + "$ref": "core/placement-definition.json", "description": "Canonical placement definition published in a publisher's adagents.json" }, "presentation-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/presentation-ref.json", + "$ref": "core/presentation-ref.json", "description": "Immutable publisher-namespaced reference to placement presentation metadata." }, "placement-presentation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-presentation.json", + "$ref": "core/placement-presentation.json", "description": "Declarative, non-executable placement chrome and creative-slot composition contract." }, "preview-provider": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/preview-provider.json", + "$ref": "core/preview-provider.json", "description": "Publisher-scoped delegation to an AdCP creative preview provider." }, "preview-renderer-metadata": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/preview-renderer-metadata.json", + "$ref": "core/preview-renderer-metadata.json", "description": "Audit identity and safety metadata for a preview renderer implementation." }, "mcp-webhook-payload": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/mcp-webhook-payload.json", + "$ref": "core/mcp-webhook-payload.json", "description": "MCP-specific webhook payload structure for HTTP-based push notifications. Protocol-level fields at top-level (task_id, status, etc.) and AdCP data layer nested under 'result'. NOT used in A2A (uses native statusUpdate)." }, "agent-notification-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-notification-config.json", + "$ref": "core/agent-notification-config.json", "description": "Agent-level webhook subscriber configuration for notifications such as capabilities.changed" }, "agent-webhook-challenge": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-webhook-challenge.json", + "$ref": "core/agent-webhook-challenge.json", "description": "Proof-of-control challenge payload for agent-level notification endpoint activation" }, "capabilities-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/capabilities-changed-webhook.json", + "$ref": "core/capabilities-changed-webhook.json", "description": "Agent-level webhook payload that invalidates cached get_adcp_capabilities responses" }, "account-status-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-status-changed-webhook.json", + "$ref": "core/account-status-changed-webhook.json", "description": "Account-level webhook payload that invalidates a list_accounts account status snapshot" }, "indicator": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator.json", + "$ref": "core/indicator.json", "description": "Compact durable seller interpretation attached to an authoritative resource snapshot" }, "creative-approval-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-approval-scope.json", + "$ref": "core/creative-approval-scope.json", "description": "Publisher- or placement-scoped creative approval outcome within an assignment" }, "indicator-bearing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator-bearing.json", + "$ref": "core/indicator-bearing.json", "description": "Reusable indicator snapshot fields, exact evaluated-type coverage, freshness, and optional scope coverage" }, "indicator-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator-scope.json", + "$ref": "core/indicator-scope.json", "description": "Publisher and placement scope for an indicator assertion or evaluation" }, "indicators-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicators-changed-webhook.json", + "$ref": "core/indicators-changed-webhook.json", "description": "Account-level invalidation payload for a semantic indicator snapshot change" }, "warning": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/warning.json", + "$ref": "core/warning.json", "description": "Structured non-blocking receipt returned only on synchronous mutation success" }, "warning-resource": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/warning-resource.json", + "$ref": "core/warning-resource.json", "description": "Typed identity of the resource affected by an operation warning" }, "destination": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/destination.json", + "$ref": "core/destination.json", "description": "A destination platform where signals can be activated (DSP, sales agent, etc.)" }, "deployment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/deployment.json", + "$ref": "core/deployment.json", "description": "A signal deployment to a specific destination platform with activation status and key" }, "publisher-property-selector": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/publisher-property-selector.json", + "$ref": "core/publisher-property-selector.json", "description": "Selects properties from a publisher's adagents.json - supports three patterns: all properties, specific IDs, or by tags" }, "product-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-filters.json", + "$ref": "core/product-filters.json", "description": "Structured filters for product discovery" }, "budget-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/budget-range.json", + "$ref": "core/budget-range.json", "description": "Shared currency-denominated inclusive budget bounds" }, "product-change-map": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-change-map.json", + "$ref": "core/product-change-map.json", "description": "Contradiction-proof product membership actions keyed by product ID" }, "product-offer-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-offer-filters.json", + "$ref": "core/product-offer-filters.json", "description": "Offer-only product filters used by the compact product-discovery tools" }, "product-audience-evidence-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-audience-evidence-requirements.json", + "$ref": "core/product-audience-evidence-requirements.json", "description": "Reference-only audience evidence policy used by compact product discovery" }, "creative-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-filters.json", + "$ref": "core/creative-filters.json", "description": "Filter criteria for querying creative assets from the centralized library" }, "signal-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-filters.json", + "$ref": "core/signal-filters.json", "description": "Filters to refine signal discovery results" }, "signal-pricing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-pricing.json", + "$ref": "core/signal-pricing.json", "description": "Vendor pricing model \u2014 discriminated union of cpm (fixed CPM), percent_of_media (percentage of spend, with optional CPM cap), flat_fee (fixed charge per reporting period), or per_unit (fixed price per unit of work)" }, "signal-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-pricing-option.json", + "$ref": "core/signal-pricing-option.json", "deprecated": true, "description": "Deprecated \u2014 alias for vendor-pricing-option.json. Retained for backward compatibility. Prefer vendor-pricing-option.json for new implementations." }, "vendor-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-pricing-option.json", + "$ref": "core/vendor-pricing-option.json", "description": "A pricing option offered by a vendor agent (signals, creative, governance), combining a pricing_option_id with a pricing model. Returned in get_signals and list_creatives, referenced in build_creative responses and report_usage." }, "creative-consumption": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-consumption.json", + "$ref": "core/creative-consumption.json", "description": "Structured consumption details returned by build_creative when a paid creative agent computes cost. Well-known fields for tokens, images, renders, and processing time." }, "transformer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/transformer.json", + "$ref": "core/transformer.json", "description": "An agent-offered, account-scoped, selectable unit of creative build capability (the creative analog of a media-buy product). Maps input formats to output formats and exposes typed config params. Discovered via list_transformers, selected by transformer_id in build_creative." }, "transformer-param": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/transformer-param.json", + "$ref": "core/transformer-param.json", "description": "Descriptor for one configuration knob a transformer exposes (field, type, value_source inline|range|enumerable, allowed values/range/account-scoped options, default)." }, "evaluator-spec": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/evaluator-spec.json", + "$ref": "core/evaluator-spec.json", "description": "Advisory buyer-attached evaluator input for build_creative \u2014 the rank-side of the get_creative_features feature oracle, driving a gate-then-rank pipeline. Declares the SOURCE of feature evaluation via one of three forms (inline pass/fail exemplars calibrating a single predicted_performance feature, an account-scoped evaluator_id, or an external get_creative_features-capable agent_url), an optional hard feature_requirement[] GATE (drop fails \u2014 internal best_of_n pruning), an explicit rank_by ordering ({feature_id, direction}), an allowlisted feature_agent pointer (accepted_verifiers; off-list \u2192 EVALUATOR_AGENT_NOT_ACCEPTED), plus an optional soft eval_budget. Informs best_of_n recommended/rank; never blocks an already-produced billable leaf." }, "property-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-id.json", + "$ref": "core/property-id.json", "description": "Identifier for a publisher property - lowercase alphanumeric with underscores only" }, "property-tag": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-tag.json", + "$ref": "core/property-tag.json", "description": "Tag for categorizing publisher properties - lowercase alphanumeric with underscores only" }, "property-list-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-list-ref.json", + "$ref": "core/property-list-ref.json", "description": "Reference to an externally managed property list for passing large property sets" }, "collection-list-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/collection-list-ref.json", + "$ref": "core/collection-list-ref.json", "description": "Reference to an externally managed collection list for passing large collection exclusion/inclusion sets" }, "identifier": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/identifier.json", + "$ref": "core/identifier.json", "description": "A property identifier with type and value" }, "media-buy-features": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/media-buy-features.json", + "$ref": "core/media-buy-features.json", "description": "Optional media-buy protocol features for capability declarations and product filters" }, "brand-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-id.json", + "$ref": "core/brand-id.json", "description": "Identifier for a brand within a house portfolio - lowercase alphanumeric with underscores only" }, "brand-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", + "$ref": "core/brand-ref.json", "description": "Reference to a brand via house domain + brand_id (like publisher + property_id)" }, "brand-key": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-key.json", + "$ref": "core/brand-key.json", "description": "Identity-only brand key for resolving a canonical brand manifest" }, "catalog-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog-selection.json", + "$ref": "core/catalog-selection.json", "description": "Catalog reference and item selectors without ingestion configuration" }, "seller-agent-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/seller-agent-ref.json", + "$ref": "core/seller-agent-ref.json", "description": "Reference to a seller agent by its adagents.json-declared URL. Used on TMP AvailablePackage and echoed on Offer." }, "signal-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-id.json", + "$ref": "core/signal-id.json", "description": "Universal signal identifier - discriminated union by source: 'catalog' (data_provider_domain + id, verifiable) or 'agent' (agent_url + id for a signal-source-native signal)" }, "signal-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-ref.json", + "$ref": "core/signal-ref.json", "description": "Named signal reference for discovery, activation, and media-buy product targeting: scope 'product' for product-local signal options, scope 'data_provider' for published adagents.json signals[], or scope 'signal_source' for source-native signals" }, "signal-listing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-listing.json", + "$ref": "core/signal-listing.json", "description": "Shared signal_ref plus optional definition metadata used by get_signals and media products" }, "product-signal-targeting-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-signal-targeting-option.json", + "$ref": "core/product-signal-targeting-option.json", "description": "Product-scoped signal option available for package-level signal_targeting_groups" }, "signal-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-definition.json", + "$ref": "core/signal-definition.json", "description": "Signal definition published in a data provider's adagents.json signals[]" }, "signal-definition-enrichment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-definition-enrichment.json", + "$ref": "core/signal-definition-enrichment.json", "description": "Optional signal-definition enrichment fields projected inline on signal listings" }, "signal-modeling-disclosure": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-modeling-disclosure.json", + "$ref": "core/signal-modeling-disclosure.json", "description": "Signal-specific modeling and AI-use disclosure metadata for data signals" }, "data-provider-signal-selector": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/data-provider-signal-selector.json", + "$ref": "core/data-provider-signal-selector.json", "description": "Selects signals from a data provider's adagents.json - supports three patterns: all signals, specific IDs, or by tags" }, "daypart-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/daypart-target.json", + "$ref": "core/daypart-target.json", "description": "A time window for daypart targeting with days of week and hour range" }, "signal-targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting.json", + "$ref": "core/signal-targeting.json", "description": "Signals Protocol targeting constraint using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "signal-targeting-rules": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting-rules.json", + "$ref": "core/signal-targeting-rules.json", "description": "Product-scoped composition rules for package-level signal_targeting_groups" }, "signal-selection-group-rule": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-selection-group-rule.json", + "$ref": "core/signal-selection-group-rule.json", "description": "Override for one product signal selection group" }, "signal-targeting-expression": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting-expression.json", + "$ref": "core/signal-targeting-expression.json", "description": "Media-buy product targeting expression using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "package-signal-targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting.json", + "$ref": "core/package-signal-targeting.json", "description": "One selected signal inside a package signal targeting group" }, "package-signal-targeting-group": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting-group.json", + "$ref": "core/package-signal-targeting-group.json", "description": "One include or exclude child group inside package-level signal_targeting_groups" }, "package-signal-targeting-groups": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting-groups.json", + "$ref": "core/package-signal-targeting-groups.json", "description": "Portable package-level signal composition: top-level all with child any/none groups" }, "event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event.json", + "$ref": "core/event.json", "description": "A marketing event (conversion, engagement, or custom) for attribution" }, "user-match": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/user-match.json", + "$ref": "core/user-match.json", "description": "User identifiers for attribution matching (UIDs, hashed identifiers, click IDs)" }, "event-custom-data": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event-custom-data.json", + "$ref": "core/event-custom-data.json", "description": "Event-specific data for attribution and reporting" }, "event-surface": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event-surface.json", + "$ref": "core/event-surface.json", "description": "Structured context for the surface where an event source or logged event originated" }, "attribution-window": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attribution-window.json", + "$ref": "core/attribution-window.json", "description": "Attribution methodology and lookback windows for conversion measurement" }, "optimization-goal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/optimization-goal.json", + "$ref": "core/optimization-goal.json", "description": "Conversion optimization goal for a package - event source, event type, target ROAS/CPA, and attribution window" }, "vendor-metric-optimization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-metric-optimization.json", + "$ref": "core/vendor-metric-optimization.json", "description": "Product-level capability declaration for vendor-attested metric optimization (attention, brand lift, emissions, retail-media partner metrics)" }, "vendor-metric-optimization-supported-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-metric-optimization-supported-metric.json", + "$ref": "core/vendor-metric-optimization-supported-metric.json", "description": "One vendor metric a product can optimize toward" }, "audience-member": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-member.json", + "$ref": "core/audience-member.json", "description": "Hashed identifiers for a CRM audience member (hashed email, phone, or universal IDs)" }, "account-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-ref.json", + "$ref": "core/account-ref.json", "description": "Reference to an account by seller-assigned ID or natural key (brand, operator, optional sandbox)" }, "provenance": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/provenance.json", + "$ref": "core/provenance.json", "description": "AI provenance and disclosure metadata \u2014 declares how content was produced, C2PA references, regulatory disclosure requirements, and third-party verification results" }, "wholesale-feed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/wholesale-feed-webhook.json", + "$ref": "core/wholesale-feed-webhook.json", "description": "Webhook payload carrying a wholesale feed change event" }, "webhook-challenge": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-challenge.json", + "$ref": "core/webhook-challenge.json", "description": "Proof-of-control challenge payload for account-level notification endpoint activation" }, "webhook-challenge-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-challenge-response.json", + "$ref": "core/webhook-challenge-response.json", "description": "Receiver response body for account-level notification_configs[] endpoint proof-of-control challenges" } }, @@ -963,63 +1039,63 @@ "description": "Typed requirement schemas for creative assets in format definitions", "schemas": { "asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/asset-requirements.json", + "$ref": "core/requirements/asset-requirements.json", "description": "Combined schema that allows any typed asset requirements" }, "html-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/html-asset-requirements.json", + "$ref": "core/requirements/html-asset-requirements.json", "description": "Requirements for HTML creative assets - sandbox compatibility, external resources, allowed domains" }, "image-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/image-asset-requirements.json", + "$ref": "core/requirements/image-asset-requirements.json", "description": "Requirements for image creative assets - dimensions, formats, file size, animation" }, "video-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/video-asset-requirements.json", + "$ref": "core/requirements/video-asset-requirements.json", "description": "Requirements for video creative assets - dimensions, duration, codecs, bitrate" }, "audio-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/audio-asset-requirements.json", + "$ref": "core/requirements/audio-asset-requirements.json", "description": "Requirements for audio creative assets - duration, formats, sample rate, channels" }, "javascript-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/javascript-asset-requirements.json", + "$ref": "core/requirements/javascript-asset-requirements.json", "description": "Requirements for JavaScript creative assets - module type, external resources" }, "text-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/text-asset-requirements.json", + "$ref": "core/requirements/text-asset-requirements.json", "description": "Requirements for text creative assets - character limits, line counts" }, "url-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/url-asset-requirements.json", + "$ref": "core/requirements/url-asset-requirements.json", "description": "Requirements for URL assets - protocols, allowed domains, macro support" }, "markdown-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/markdown-asset-requirements.json", + "$ref": "core/requirements/markdown-asset-requirements.json", "description": "Requirements for markdown creative assets" }, "css-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/css-asset-requirements.json", + "$ref": "core/requirements/css-asset-requirements.json", "description": "Requirements for CSS creative assets" }, "vast-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/vast-asset-requirements.json", + "$ref": "core/requirements/vast-asset-requirements.json", "description": "Requirements for VAST creative assets - version requirements" }, "daast-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/daast-asset-requirements.json", + "$ref": "core/requirements/daast-asset-requirements.json", "description": "Requirements for DAAST creative assets" }, "catalog-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/catalog-requirements.json", + "$ref": "core/requirements/catalog-requirements.json", "description": "Format-level declaration of what catalog feeds a creative requires" }, "offering-asset-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/offering-asset-constraint.json", + "$ref": "core/requirements/offering-asset-constraint.json", "description": "Per-group creative requirements that each offering must satisfy within a catalog" }, "webhook-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/webhook-asset-requirements.json", + "$ref": "core/requirements/webhook-asset-requirements.json", "description": "Requirements for webhook creative assets" } } @@ -1029,424 +1105,440 @@ "description": "Enumerated types and constants", "schemas": { "pricing-model": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pricing-model.json", + "$ref": "enums/pricing-model.json", "description": "Supported pricing models for advertising products" }, "pricing-structure": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pricing-structure.json", + "$ref": "enums/pricing-structure.json", "description": "How a payable media price is determined: fixed, auction, or contingent" }, "delivery-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/delivery-type.json", + "$ref": "enums/delivery-type.json", "description": "Type of inventory delivery" }, "proposal-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-status.json", + "$ref": "enums/proposal-status.json", "description": "Lifecycle status of a proposal (draft or committed)" }, "proposal-decline-reason": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-decline-reason.json", + "$ref": "enums/proposal-decline-reason.json", "description": "Machine-readable terminal proposal feedback" }, "proposal-refinement-reason": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-refinement-reason.json", + "$ref": "enums/proposal-refinement-reason.json", "description": "Machine-readable partial or unable proposal-refinement outcome" }, "media-buy-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/media-buy-status.json", + "$ref": "enums/media-buy-status.json", "description": "Status of a media buy" }, "canonical-media-buy-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/canonical-media-buy-action.json", + "$ref": "enums/canonical-media-buy-action.json", "description": "Fine-grained action vocabulary for compact MediaBuy tools" }, "canonical-media-buy-action-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/canonical-media-buy-action-mode.json", + "$ref": "enums/canonical-media-buy-action-mode.json", "description": "Execution mode for routed compact-lifecycle actions" }, "creative-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-status.json", + "$ref": "enums/creative-status.json", "description": "Status of a creative asset" }, "creative-approval-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-approval-status.json", + "$ref": "enums/creative-approval-status.json", "description": "Approval state of a creative on a specific package" }, "audience-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audience-status.json", + "$ref": "enums/audience-status.json", "description": "Matching status of a synced audience on a seller platform" }, "creative-quality": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-quality.json", + "$ref": "enums/creative-quality.json", "description": "Quality tier for creative generation (draft, production)" }, "logo-slot": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/logo-slot.json", + "$ref": "enums/logo-slot.json", "description": "Renderer-facing logo slots for selecting brand.json logo variants" }, "pacing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pacing.json", + "$ref": "enums/pacing.json", "description": "Budget pacing strategy" }, "frequency-cap-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/frequency-cap-scope.json", + "$ref": "enums/frequency-cap-scope.json", "description": "Scope for frequency cap application" }, "identifier-types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/identifier-types.json", + "$ref": "enums/identifier-types.json", "description": "Valid identifier types for property identification across different media types" }, "publisher-identifier-types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/publisher-identifier-types.json", + "$ref": "enums/publisher-identifier-types.json", "description": "Valid identifier types for publisher/legal entity identification (TAG ID, DUNS, LEI, seller_id, GLN)" }, "channels": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/channels.json", + "$ref": "enums/channels.json", "description": "Advertising channels (display, video, dooh, ctv, audio, etc.)" }, "video-placement-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/video-placement-type.json", + "$ref": "enums/video-placement-type.json", "description": "Declared video placement classifications using IAB Tech Lab/OpenRTB 2.6 video.plcmt definitions" }, "audio-distribution-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audio-distribution-type.json", + "$ref": "enums/audio-distribution-type.json", "description": "Declared audio distribution classifications using IAB Tech Lab/OpenRTB 2.6 audio.feed definitions" }, "sponsored-placement-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sponsored-placement-type.json", + "$ref": "enums/sponsored-placement-type.json", "description": "Declared sponsored-placement classifications for catalog-driven retail-media inventory" }, "social-placement-surface": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/social-placement-surface.json", + "$ref": "enums/social-placement-surface.json", "description": "Declared social-placement surface classifications for social inventory" }, "task-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/task-status.json", + "$ref": "enums/task-status.json", "description": "Standardized task status values based on A2A TaskState enum" }, "task-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/task-type.json", + "$ref": "enums/task-type.json", "description": "Valid AdCP task types across all domains" }, "asset-content-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/asset-content-type.json", + "$ref": "enums/asset-content-type.json", "description": "Types of content that can be used as creative assets (image, video, html, etc.)" }, "disclosure-position": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/disclosure-position.json", + "$ref": "enums/disclosure-position.json", "description": "Where a required disclosure should appear within a creative" }, "disclosure-persistence": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/disclosure-persistence.json", + "$ref": "enums/disclosure-persistence.json", "description": "How long a disclosure must persist during content playback or display" }, "vast-version": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/vast-version.json", + "$ref": "enums/vast-version.json", "description": "Supported VAST specification versions (2.0, 3.0, 4.0, 4.1, 4.2, 4.3)" }, + "representation-selection-strategy": { + "$ref": "enums/representation-selection-strategy.json", + "description": "Deterministic strategy for selecting one compatible creative representation" + }, "vast-tracking-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/vast-tracking-event.json", + "$ref": "enums/vast-tracking-event.json", "description": "Standard VAST tracking events for video playback and interaction" }, + "pixel-tracking-event": { + "$ref": "enums/pixel-tracking-event.json", + "description": "Canonical first-class pixel tracker event vocabulary" + }, + "tracker-execution-actor": { + "$ref": "enums/tracker-execution-actor.json", + "description": "Actor responsible for initiating an accepted tracker" + }, + "tracker-firing-path": { + "$ref": "enums/tracker-firing-path.json", + "description": "Permitted client or server tracker initiation path" + }, "property-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/property-type.json", + "$ref": "enums/property-type.json", "description": "Types of addressable advertising properties with verifiable ownership" }, "dimension-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/dimension-unit.json", + "$ref": "enums/dimension-unit.json", "description": "Units of measurement for creative format dimensions (px, dp, inches, cm)" }, "co-branding-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/co-branding-requirement.json", + "$ref": "enums/co-branding-requirement.json", "description": "Co-branding policy for creatives (required, optional, none)" }, "landing-page-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/landing-page-requirement.json", + "$ref": "enums/landing-page-requirement.json", "description": "Landing page policy for creative destinations (any, retailer_site_only, must_include_retailer)" }, "daast-version": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/daast-version.json", + "$ref": "enums/daast-version.json", "description": "Supported DAAST specification versions (1.0, 1.1)" }, "daast-tracking-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/daast-tracking-event.json", + "$ref": "enums/daast-tracking-event.json", "description": "Standard DAAST tracking events for audio playback and interaction" }, "day-of-week": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/day-of-week.json", + "$ref": "enums/day-of-week.json", "description": "Days of the week for daypart targeting" }, "signal-catalog-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-catalog-type.json", + "$ref": "enums/signal-catalog-type.json", "description": "Commercial/provenance types for signals (marketplace, custom, owned)" }, "metric-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/metric-type.json", + "$ref": "enums/metric-type.json", "description": "Performance metric types for feedback and optimization" }, "feedback-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/feedback-source.json", + "$ref": "enums/feedback-source.json", "description": "Source of performance feedback data" }, "forecast-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecast-method.json", + "$ref": "enums/forecast-method.json", "description": "Method used to produce a delivery forecast (estimate, modeled, guaranteed)" }, "forecastable-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecastable-metric.json", + "$ref": "enums/forecastable-metric.json", "description": "Standard metric names for delivery forecasts (audience_size, reach, impressions, clicks, spend, etc.)" }, "forecast-range-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecast-range-unit.json", + "$ref": "enums/forecast-range-unit.json", "description": "How to interpret forecast points: spend curve, reach/frequency curve, temporal (weekly/daily), or outcome targets (clicks/conversions)" }, "availability-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/availability-status.json", + "$ref": "enums/availability-status.json", "description": "Bookability of the inventory a forecast row describes (available, unavailable)" }, "demographic-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/demographic-system.json", + "$ref": "enums/demographic-system.json", "description": "Audience measurement systems for demographic notation (nielsen, barb, agf, oztam, mediametrie, custom)" }, "reach-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/reach-unit.json", + "$ref": "enums/reach-unit.json", "description": "Unit of measurement for reach metrics (individuals, households, devices, accounts, cookies, custom)" }, "creative-agent-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-agent-capability.json", + "$ref": "enums/creative-agent-capability.json", "description": "Capabilities supported by creative agents (validation, assembly, generation, preview, delivery)" }, "adcp-protocol": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/adcp-protocol.json", + "$ref": "enums/adcp-protocol.json", "description": "AdCP protocol domains (media-buy, signals, governance, creative, brand)" }, "brand-agent-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/brand-agent-type.json", + "$ref": "enums/brand-agent-type.json", "description": "Agent types declarable in brand.json (brand, rights, measurement, governance, creative, sales, buying, signals)" }, "right-use": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/right-use.json", + "$ref": "enums/right-use.json", "description": "Types of rights usage (likeness, voice, endorsement, sync, etc.)" }, "right-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/right-type.json", + "$ref": "enums/right-type.json", "description": "Categories of licensable rights (talent, music, brand_ip, stock_media)" }, "http-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/http-method.json", + "$ref": "enums/http-method.json", "description": "HTTP methods for webhook requests (GET, POST)" }, "webhook-response-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/webhook-response-type.json", + "$ref": "enums/webhook-response-type.json", "description": "Expected response content types from webhooks" }, "webhook-security-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/webhook-security-method.json", + "$ref": "enums/webhook-security-method.json", "description": "Security methods for webhook authentication" }, "javascript-module-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/javascript-module-type.json", + "$ref": "enums/javascript-module-type.json", "description": "JavaScript module format types (esm, commonjs, script)" }, "markdown-flavor": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/markdown-flavor.json", + "$ref": "enums/markdown-flavor.json", "description": "Markdown specification flavors (commonmark, gfm)" }, "url-asset-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/url-asset-type.json", + "$ref": "enums/url-asset-type.json", "description": "Types of URL assets (clickthrough, tracker_pixel, tracker_script)" }, "validation-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/validation-mode.json", + "$ref": "enums/validation-mode.json", "description": "Creative validation strictness levels (strict, lenient)" }, "creative-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-action.json", + "$ref": "enums/creative-action.json", "description": "Actions taken on creatives during sync (created, updated, unchanged, failed, deleted)" }, "notification-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/notification-type.json", + "$ref": "enums/notification-type.json", "description": "Shared notification registry for delivery, impairment, lifecycle, wholesale-feed, and capability-change events" }, "indicator-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/indicator-type.json", + "$ref": "enums/indicator-type.json", "description": "Closed AdCP 3.2 vocabulary for durable media-buy and creative-assignment indicators" }, "warning-code": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/warning-code.json", + "$ref": "enums/warning-code.json", "description": "Closed AdCP 3.2 vocabulary for synchronous operation warnings" }, "reporting-frequency": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/reporting-frequency.json", + "$ref": "enums/reporting-frequency.json", "description": "Frequencies for delivery reports (hourly, daily, monthly)" }, "available-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/available-metric.json", + "$ref": "enums/available-metric.json", "description": "Standard delivery and performance metrics for reporting" }, "preview-output-format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/preview-output-format.json", + "$ref": "enums/preview-output-format.json", "description": "Output formats for creative previews (url, html)" }, "sort-direction": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sort-direction.json", + "$ref": "enums/sort-direction.json", "description": "Sort direction for list queries (asc, desc)" }, "sort-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sort-metric.json", + "$ref": "enums/sort-metric.json", "description": "Numeric delivery metrics available for sorting breakdown rows" }, "history-entry-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/history-entry-type.json", + "$ref": "enums/history-entry-type.json", "description": "Type of task history entry (request, response)" }, "feed-format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/feed-format.json", + "$ref": "enums/feed-format.json", "description": "Product catalog feed formats" }, "update-frequency": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/update-frequency.json", + "$ref": "enums/update-frequency.json", "description": "Frequency of product catalog updates" }, "content-id-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/content-id-type.json", + "$ref": "enums/content-id-type.json", "description": "Identifier type for matching conversion event content_ids to catalog items (sku, gtin, or vertical-specific IDs)" }, "auth-scheme": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/auth-scheme.json", + "$ref": "enums/auth-scheme.json", "description": "Authentication schemes for push notifications" }, "creative-sort-field": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-sort-field.json", + "$ref": "enums/creative-sort-field.json", "description": "Fields available for sorting creative listings" }, "geo-level": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/geo-level.json", + "$ref": "enums/geo-level.json", "description": "Geographic targeting granularity levels (country, region, metro, postal_area)" }, "metro-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/metro-system.json", + "$ref": "enums/metro-system.json", "description": "Metro area classification systems for geographic targeting (nielsen_dma, uk_itl1, uk_itl2, eurostat_nuts2)" }, "postal-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/postal-system.json", + "$ref": "enums/postal-system.json", "description": "Country-local postal code systems for geographic targeting (zip, zip_plus_four, outward, plz, postal_code, etc.)" }, "legacy-postal-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/legacy-postal-system.json", + "$ref": "enums/legacy-postal-system.json", "deprecated": true, "description": "Deprecated country-fused postal code systems for compatibility (us_zip, gb_outward, ca_fsa, etc.)" }, "age-verification-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/age-verification-method.json", + "$ref": "enums/age-verification-method.json", "description": "Methods for verifying user age for compliance (facial_age_estimation, id_document, digital_id, credit_card, world_id)" }, "age-determination-basis": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/age-determination-basis.json", + "$ref": "enums/age-determination-basis.json", "description": "User-level age determination bases permitted for targeting execution (verified, declared, or inferred)" }, "device-platform": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/device-platform.json", + "$ref": "enums/device-platform.json", "description": "Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV" }, "device-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/device-type.json", + "$ref": "enums/device-type.json", "description": "Device form factor categories for targeting and reporting (desktop, mobile, tablet, ctv, dooh, unknown)" }, "signal-value-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-value-type.json", + "$ref": "enums/signal-value-type.json", "description": "Signal value types for targeting (binary, categorical, numeric)" }, "signal-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-source.json", + "$ref": "enums/signal-source.json", "description": "Source type for signal identifiers: 'catalog' (verifiable via data provider) or 'agent' (signal source identified by agent_url)" }, "universal-macro": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/universal-macro.json", + "$ref": "enums/universal-macro.json", "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs" }, "event-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/event-type.json", + "$ref": "enums/event-type.json", "description": "Standard marketing event types for conversion tracking (purchase, lead, add_to_cart, etc.)" }, "uid-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/uid-type.json", + "$ref": "enums/uid-type.json", "description": "Universal ID types for user matching (rampid, id5, uid2, maid, etc.)" }, "attestation-claim": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/attestation-claim.json", + "$ref": "enums/attestation-claim.json", "description": "Claims a verified identity attestation can establish (unique_human, age_over_13/16/18/21)" }, "action-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/action-source.json", + "$ref": "enums/action-source.json", "description": "Where the conversion event originated (website, app, offline, etc.)" }, "attribution-model": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/attribution-model.json", + "$ref": "enums/attribution-model.json", "description": "Attribution model used for conversion measurement" }, "audience-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audience-source.json", + "$ref": "enums/audience-source.json", "description": "Origin of an audience segment in delivery reporting (synced, platform, third_party, lookalike, retargeting, unknown)" }, "wcag-level": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/wcag-level.json", + "$ref": "enums/wcag-level.json", "description": "Web Content Accessibility Guidelines conformance level (A, AA, AAA)" }, "catalog-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-type.json", + "$ref": "enums/catalog-type.json", "description": "Catalog feed types: offering, product, inventory, store, promotion, hotel, flight, job, vehicle, real_estate, education, destination" }, "catalog-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-action.json", + "$ref": "enums/catalog-action.json", "description": "Actions taken on catalogs during sync (created, updated, unchanged, failed, deleted)" }, "catalog-item-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-item-status.json", + "$ref": "enums/catalog-item-status.json", "description": "Approval status of individual catalog items (approved, pending, rejected, warning)" }, "transport-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/transport-mode.json", + "$ref": "enums/transport-mode.json", "description": "Transportation modes for isochrone-based catchment area calculations (walking, cycling, driving, public_transport)" }, "distance-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/distance-unit.json", + "$ref": "enums/distance-unit.json", "description": "Units of distance measurement for radius-based catchment areas (km, mi, m)" }, "error-code": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/error-code.json", + "$ref": "enums/error-code.json", "description": "Standard error code vocabulary for agent recovery classification" }, "consent-basis": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/consent-basis.json", + "$ref": "enums/consent-basis.json", "description": "GDPR Article 6(1) lawful basis for processing personal data" }, "digital-source-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/digital-source-type.json", + "$ref": "enums/digital-source-type.json", "description": "IPTC-aligned classification of AI involvement in content creation (digital_capture, trained_algorithmic_media, composite_with_trained_algorithmic_media, etc.)" }, "governance-phase": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-phase.json", + "$ref": "enums/governance-phase.json", "description": "Media buy lifecycle phase for governance checks (purchase, modification, delivery)" }, "governance-domain": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-domain.json", + "$ref": "enums/governance-domain.json", "description": "Governance sub-domains a registry policy applies to (campaign, property, creative, content_standards)" }, "genre-taxonomy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/genre-taxonomy.json", + "$ref": "enums/genre-taxonomy.json", "description": "Taxonomy systems for genre classification (iab_content_3.0, gracenote, eidr, etc.)" }, "governance-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-mode.json", + "$ref": "enums/governance-mode.json", "description": "Operating mode for a governance agent (audit, advisory, enforce)" }, "delegation-authority": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/delegation-authority.json", + "$ref": "enums/delegation-authority.json", "description": "Authority level for a delegated agent on a campaign plan (full, execute_only, propose_only)" }, "exclusivity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/exclusivity.json", + "$ref": "enums/exclusivity.json", "description": "Whether a product offers exclusive access to its inventory (none, category, exclusive)" } } @@ -1455,43 +1547,43 @@ "description": "Individual pricing model schemas discriminated by pricing_model. Unit-based models may be fixed or auction-based. Contingent models such as revenue_share calculate payable spend from a measured business outcome after delivery.", "schemas": { "cpm-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpm-option.json", + "$ref": "pricing-options/cpm-option.json", "description": "Cost Per Mille (CPM) pricing - supports fixed rate and auction modes" }, "vcpm-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/vcpm-option.json", + "$ref": "pricing-options/vcpm-option.json", "description": "Viewable Cost Per Mille (vCPM) pricing - supports fixed rate and auction modes" }, "cpc-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpc-option.json", + "$ref": "pricing-options/cpc-option.json", "description": "Cost Per Click (CPC) pricing - supports fixed rate and auction modes" }, "cpcv-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpcv-option.json", + "$ref": "pricing-options/cpcv-option.json", "description": "Cost Per Completed View (CPCV) pricing - supports fixed rate and auction modes" }, "cpv-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpv-option.json", + "$ref": "pricing-options/cpv-option.json", "description": "Cost Per View (CPV) pricing with threshold - supports fixed rate and auction modes" }, "cpp-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpp-option.json", + "$ref": "pricing-options/cpp-option.json", "description": "Cost Per Point (CPP) pricing for TV/audio with demographic measurement - supports fixed rate and auction modes" }, "cpa-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpa-option.json", + "$ref": "pricing-options/cpa-option.json", "description": "Cost Per Acquisition (CPA) pricing for performance campaigns - fixed price per conversion event" }, "revenue-share-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/revenue-share-option.json", + "$ref": "pricing-options/revenue-share-option.json", "description": "Revenue-share pricing - decimal commission rate applied to settled commissionable conversion value" }, "flat-rate-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/flat-rate-option.json", + "$ref": "pricing-options/flat-rate-option.json", "description": "Flat rate pricing for DOOH and sponsorships - supports fixed rate and auction modes" }, "time-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/time-option.json", + "$ref": "pricing-options/time-option.json", "description": "Time-based pricing - cost per time unit (hour, day, week, month) that scales with campaign duration" } } @@ -1501,51 +1593,51 @@ "tasks": { "list-accounts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/list-accounts-request.json", + "$ref": "account/list-accounts-request.json", "description": "Request parameters for listing accounts accessible to the authenticated agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/list-accounts-response.json", + "$ref": "account/list-accounts-response.json", "description": "Response payload for list_accounts task" } }, "sync-accounts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-accounts-request.json", + "$ref": "account/sync-accounts-request.json", "description": "Request parameters for syncing advertiser accounts with a seller" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-accounts-response.json", + "$ref": "account/sync-accounts-response.json", "description": "Response payload for sync_accounts task" } }, "sync-governance": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-governance-request.json", + "$ref": "account/sync-governance-request.json", "description": "Request parameters for registering governance agent endpoints on accounts" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-governance-response.json", + "$ref": "account/sync-governance-response.json", "description": "Response payload for sync_governance task" } }, "report-usage": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/report-usage-request.json", + "$ref": "account/report-usage-request.json", "description": "Request parameters for reporting vendor service consumption after delivery" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/report-usage-response.json", + "$ref": "account/report-usage-response.json", "description": "Response payload for report_usage task" } }, "get-account-financials": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/get-account-financials-request.json", + "$ref": "account/get-account-financials-request.json", "description": "Request parameters for querying financial status of an operator-billed account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/get-account-financials-response.json", + "$ref": "account/get-account-financials-response.json", "description": "Response payload for get_account_financials task" } } @@ -1555,244 +1647,264 @@ "description": "Media buy task request/response schemas", "supporting-schemas": { "product-discovery-criteria": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/product-discovery-criteria.json", + "$ref": "media-buy/product-discovery-criteria.json", "description": "Structured offer, catalog, and policy criteria shared by compact discovery tools" }, "outcome-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/outcome-target.json", + "$ref": "media-buy/outcome-target.json", "description": "Reverse-forecast planning input: a compact metric or event goal plus desired volume the seller solves budget for" }, "proposal-refinement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-refinement.json", + "$ref": "media-buy/proposal-refinement.json", "description": "One immutable proposal revision request" }, "proposal-budget-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-budget-constraint.json", + "$ref": "media-buy/proposal-budget-constraint.json", "description": "Strict inclusive budget bounds for proposal negotiation" }, "proposal-decline": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-decline.json", + "$ref": "media-buy/proposal-decline.json", "description": "One terminal decline of an immutable proposal" }, "product-purchase": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/product-purchase.json", + "$ref": "media-buy/product-purchase.json", "description": "Canonical direct product selection without creatives or negotiated term overrides" }, "compatibility-purchase-coordinator-input": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/legacy-purchase-continuation-input.json", + "$ref": "media-buy/legacy-purchase-continuation-input.json", "description": "SDK-local fail-closed input for redeeming a deprecated products-only compatibility continuation" }, "commercial-terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/commercial-terms.json", + "$ref": "media-buy/commercial-terms.json", "description": "Typed immutable commercial envelope shared by direct purchases and proposals" }, "package-control": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-control.json", + "$ref": "media-buy/package-control.json", "description": "Operational package controls bounded by accepted commercial terms" }, "media-buy-commitment-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/media-buy-commitment-response.json", + "$ref": "media-buy/media-buy-commitment-response.json", "description": "Compact shared result for direct purchase and proposal acceptance" }, "get-products-rejected": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-rejected.json", + "$ref": "media-buy/get-products-rejected.json", "description": "Terminal business rejection arm for a well-formed get_products brief or refinement" }, "package-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-request.json", + "$ref": "media-buy/package-request.json", "description": "Package configuration for media buy creation - used within create_media_buy request" }, "package-update": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-update.json", + "$ref": "media-buy/package-update.json", "description": "Package update configuration for update_media_buy - identifies package and specifies fields to modify" } }, "tasks": { "get-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-request.json", + "$ref": "media-buy/get-products-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use list_products, request_proposals, refine_proposals, or decline_proposals." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-response.json", + "$ref": "media-buy/get-products-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for get_products" } }, "list-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-products-request.json", + "$ref": "media-buy/list-products-request.json", "description": "Request parameters for synchronous product-offer reads" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-products-response.json", + "$ref": "media-buy/list-products-response.json", "description": "Response payload for list_products" } }, "request-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/request-proposals-request.json", + "$ref": "media-buy/request-proposals-request.json", "description": "Request parameters for creating actionable seller proposals" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/request-proposals-response.json", + "$ref": "media-buy/request-proposals-response.json", "description": "Response payload for request_proposals" } }, "refine-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/refine-proposals-request.json", + "$ref": "media-buy/refine-proposals-request.json", "description": "Request parameters for creating one or more proposal revisions" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/refine-proposals-response.json", + "$ref": "media-buy/refine-proposals-response.json", "description": "Response payload for refine_proposals" } }, "decline-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/decline-proposals-request.json", + "$ref": "media-buy/decline-proposals-request.json", "description": "Request parameters for terminally declining one or more proposals" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/decline-proposals-response.json", + "$ref": "media-buy/decline-proposals-response.json", "description": "Ordered decline results for decline_proposals" } }, "buy-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/buy-products-request.json", + "$ref": "media-buy/buy-products-request.json", "description": "Create a MediaBuy directly from canonical published product offers" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/buy-products-response.json", + "$ref": "media-buy/buy-products-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "accept-proposal": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/accept-proposal-request.json", + "$ref": "media-buy/accept-proposal-request.json", "description": "Accept a committed new-buy, amendment, or cancellation proposal" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/accept-proposal-response.json", + "$ref": "media-buy/accept-proposal-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "control-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/control-media-buy-request.json", + "$ref": "media-buy/control-media-buy-request.json", "description": "Apply operational controls inside accepted commercial terms" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/control-media-buy-response.json", + "$ref": "media-buy/control-media-buy-response.json", "description": "Compact operational-control result" } }, "list-creative-formats": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-creative-formats-request.json", + "$ref": "media-buy/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request. Sales agents publish canonical sellable formats through get_products Product.format_options[]." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-creative-formats-response.json", + "$ref": "media-buy/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats. Not a sales-agent deliverability contract." } }, "create-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/create-media-buy-request.json", + "$ref": "media-buy/create-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use buy_products or accept_proposal." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/create-media-buy-response.json", + "$ref": "media-buy/create-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for create_media_buy" } }, "update-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/update-media-buy-request.json", + "$ref": "media-buy/update-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use control_media_buy or refine_proposals." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/update-media-buy-response.json", + "$ref": "media-buy/update-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for update_media_buy" } }, "get-media-buys": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buys-request.json", + "$ref": "media-buy/get-media-buys-request.json", "description": "Request parameters for retrieving media buy status, creative approvals, and delivery snapshots" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buys-response.json", + "$ref": "media-buy/get-media-buys-response.json", "description": "Response payload for get_media_buys task" } }, "get-media-buy-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buy-delivery-request.json", + "$ref": "media-buy/get-media-buy-delivery-request.json", "description": "Request parameters for retrieving comprehensive delivery metrics" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buy-delivery-response.json", + "$ref": "media-buy/get-media-buy-delivery-response.json", "description": "Response payload for get_media_buy_delivery task" } }, + "get-reporting-status": { + "request": { + "$ref": "media-buy/get-reporting-status-request.json", + "description": "Request parameters for reconciling managed reporting obligations, revisions, and materializations" + }, + "response": { + "$ref": "media-buy/get-reporting-status-response.json", + "description": "Authoritative reporting ledger status for summary, periods, or one exact revision" + } + }, + "sync-reporting-receipts": { + "request": { + "$ref": "media-buy/sync-reporting-receipts-request.json", + "description": "Submit authenticated consumer reconciliation receipts for durable reporting materializations" + }, + "response": { + "$ref": "media-buy/sync-reporting-receipts-response.json", + "description": "Per-receipt durable recording results" + } + }, "provide-performance-feedback": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/provide-performance-feedback-request.json", + "$ref": "media-buy/provide-performance-feedback-request.json", "description": "Request parameters for sharing performance outcomes with publishers" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/provide-performance-feedback-response.json", + "$ref": "media-buy/provide-performance-feedback-response.json", "description": "Response payload for provide_performance_feedback task" } }, "sync-event-sources": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-event-sources-request.json", + "$ref": "media-buy/sync-event-sources-request.json", "description": "Request parameters for configuring event sources on an account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-event-sources-response.json", + "$ref": "media-buy/sync-event-sources-response.json", "description": "Response payload for sync_event_sources task" } }, "log-event": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/log-event-request.json", + "$ref": "media-buy/log-event-request.json", "description": "Request parameters for logging conversion or marketing events" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/log-event-response.json", + "$ref": "media-buy/log-event-response.json", "description": "Response payload for log_event task" } }, "sync-audiences": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-audiences-request.json", + "$ref": "media-buy/sync-audiences-request.json", "description": "Request parameters for managing CRM-based audiences on an account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-audiences-response.json", + "$ref": "media-buy/sync-audiences-response.json", "description": "Response payload for sync_audiences task" } }, "sync-catalogs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-catalogs-request.json", + "$ref": "media-buy/sync-catalogs-request.json", "description": "Request parameters for syncing catalog feeds (products, inventory, stores, promotions, offerings) with approval workflow" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-catalogs-response.json", + "$ref": "media-buy/sync-catalogs-response.json", "description": "Response payload for sync_catalogs task with per-catalog results and item-level approval status" } } @@ -1803,100 +1915,100 @@ "tasks": { "build-creative": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/build-creative-request.json", + "$ref": "media-buy/build-creative-request.json", "description": "Request parameters for AI-powered creative generation" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/build-creative-response.json", + "$ref": "media-buy/build-creative-response.json", "description": "Response payload for build_creative task" } }, "preview-creative": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/preview-creative-request.json", + "$ref": "creative/preview-creative-request.json", "description": "Request parameters for generating creative previews" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/preview-creative-response.json", + "$ref": "creative/preview-creative-response.json", "description": "Response payload for preview_creative task" } }, "list-creative-formats": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creative-formats-request.json", + "$ref": "creative/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request; use get_adcp_capabilities creative.supported_formats[]." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creative-formats-response.json", + "$ref": "creative/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats." } }, "list-transformers": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-transformers-request.json", + "$ref": "creative/list-transformers-request.json", "description": "Request parameters for discovering account-scoped creative transformers (the creative analog of products), with optional brief filtering, per-param option expansion, and pricing" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-transformers-response.json", + "$ref": "creative/list-transformers-response.json", "description": "Response payload with transformer descriptors \u2014 input/output formats, typed config params, account-scoped enumerable option values when expanded, and per-account pricing" } }, "get-creative-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-delivery-request.json", + "$ref": "creative/get-creative-delivery-request.json", "description": "Request parameters for retrieving creative delivery data with variant-level breakdowns" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-delivery-response.json", + "$ref": "creative/get-creative-delivery-response.json", "description": "Response payload with creative delivery data including variant manifests and metrics" } }, "list-creatives": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creatives-request.json", + "$ref": "creative/list-creatives-request.json", "description": "Request parameters for querying creative library with filtering and pagination" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creatives-response.json", + "$ref": "creative/list-creatives-response.json", "description": "Response payload for list_creatives task" } }, "sync-creatives": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/sync-creatives-request.json", + "$ref": "creative/sync-creatives-request.json", "description": "Request parameters for syncing creative assets with upsert semantics" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/sync-creatives-response.json", + "$ref": "creative/sync-creatives-response.json", "description": "Response payload for sync_creatives task" } }, "validate-input": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/validate-input-request.json", + "$ref": "creative/validate-input-request.json", "description": "Request parameters for validating a creative manifest against canonical formats and/or specific products without committing to a render" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/validate-input-response.json", + "$ref": "creative/validate-input-response.json", "description": "Response payload for validate_input task with per-target validation results" } } }, "webhooks": { "creative-assignment-changed": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/creative-assignment-changed-webhook.json", + "$ref": "creative/creative-assignment-changed-webhook.json", "description": "Account-level invalidation payload for creative assignment membership or approval changes" } }, "asset_types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/asset-types/index.json", + "$ref": "creative/asset-types/index.json", "description": "Asset type definitions for creative manifests" }, "build_inputs": { "video_brief": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/video-brief.json", + "$ref": "creative/video-brief.json", "description": "Typed per-segment generation brief for build_creative input on generative video platforms" } } @@ -1906,21 +2018,21 @@ "tasks": { "get-signals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/get-signals-request.json", + "$ref": "signals/get-signals-request.json", "description": "Request parameters for discovering signals based on description" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/get-signals-response.json", + "$ref": "signals/get-signals-response.json", "description": "Response payload for get_signals task" } }, "activate-signal": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/activate-signal-request.json", + "$ref": "signals/activate-signal-request.json", "description": "Request parameters for activating a signal on a specific platform/account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/activate-signal-response.json", + "$ref": "signals/activate-signal-response.json", "description": "Response payload for activate_signal task" } } @@ -1930,298 +2042,298 @@ "description": "Governance protocol for property governance, brand standards, content standards, and compliance", "supporting-schemas": { "property-feature-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-feature-definition.json", + "$ref": "property/property-feature-definition.json", "description": "Definition of a feature that a governance agent can evaluate" }, "property-feature": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-feature.json", + "$ref": "property/property-feature.json", "description": "A discrete feature assessment for a property" }, "property-error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-error.json", + "$ref": "property/property-error.json", "description": "Error information for a property that could not be evaluated" }, "property-list": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list.json", + "$ref": "property/property-list.json", "description": "A managed property list with optional filters for dynamic evaluation" }, "property-list-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list-filters.json", + "$ref": "property/property-list-filters.json", "description": "Filters that dynamically modify a property list when resolved" }, "property-list-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list-changed-webhook.json", + "$ref": "property/property-list-changed-webhook.json", "description": "Webhook payload when a property list changes" }, "base-property-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/base-property-source.json", + "$ref": "property/base-property-source.json", "description": "A source of properties for a property list - supports publisher+tags, publisher+property_ids, or direct identifiers" }, "collection-list": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list.json", + "$ref": "collection/collection-list.json", "description": "A managed collection list with optional filters for dynamic evaluation \u2014 collections represent programs/shows independent of properties" }, "collection-list-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list-filters.json", + "$ref": "collection/collection-list-filters.json", "description": "Filters that dynamically modify a collection list when resolved \u2014 content ratings, genres, kinds, production quality" }, "collection-list-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list-changed-webhook.json", + "$ref": "collection/collection-list-changed-webhook.json", "description": "Webhook payload when a collection list changes" }, "base-collection-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/base-collection-source.json", + "$ref": "collection/base-collection-source.json", "description": "A source of collections for a collection list - supports distribution_ids, publisher_collections, or publisher_genres" }, "content-standards": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/content-standards.json", + "$ref": "content-standards/content-standards.json", "description": "Reusable content standards configuration - defines brand safety/suitability policies with scope, policy, calibration exemplars, and lifecycle dates" }, "content-standards-artifact": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/artifact.json", + "$ref": "content-standards/artifact.json", "description": "Content artifact for evaluation or calibration - represents content context where ad placements occur, identified by property_id + artifact_id" }, "artifact-webhook-payload": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/artifact-webhook-payload.json", + "$ref": "content-standards/artifact-webhook-payload.json", "description": "Webhook payload for content artifact delivery from sales agents to orchestrators" }, "policy-entry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/policy-entry.json", + "$ref": "governance/policy-entry.json", "description": "A complete policy in the policy registry with natural language text, metadata, and calibration exemplars" }, "policy-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/policy-ref.json", + "$ref": "governance/policy-ref.json", "description": "Reference to a registry policy by ID with optional version pin" } }, "tasks": { "create-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/create-property-list-request.json", + "$ref": "property/create-property-list-request.json", "description": "Request parameters for creating a new property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/create-property-list-response.json", + "$ref": "property/create-property-list-response.json", "description": "Response payload for create_property_list task" } }, "update-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/update-property-list-request.json", + "$ref": "property/update-property-list-request.json", "description": "Request parameters for updating an existing property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/update-property-list-response.json", + "$ref": "property/update-property-list-response.json", "description": "Response payload for update_property_list task" } }, "get-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/get-property-list-request.json", + "$ref": "property/get-property-list-request.json", "description": "Request parameters for retrieving a property list with resolved properties" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/get-property-list-response.json", + "$ref": "property/get-property-list-response.json", "description": "Response payload for get_property_list task" } }, "list-property-lists": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/list-property-lists-request.json", + "$ref": "property/list-property-lists-request.json", "description": "Request parameters for listing property lists" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/list-property-lists-response.json", + "$ref": "property/list-property-lists-response.json", "description": "Response payload for list_property_lists task" } }, "delete-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/delete-property-list-request.json", + "$ref": "property/delete-property-list-request.json", "description": "Request parameters for deleting a property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/delete-property-list-response.json", + "$ref": "property/delete-property-list-response.json", "description": "Response payload for delete_property_list task" } }, "create-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/create-collection-list-request.json", + "$ref": "collection/create-collection-list-request.json", "description": "Request parameters for creating a new collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/create-collection-list-response.json", + "$ref": "collection/create-collection-list-response.json", "description": "Response payload for create_collection_list task" } }, "update-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/update-collection-list-request.json", + "$ref": "collection/update-collection-list-request.json", "description": "Request parameters for updating an existing collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/update-collection-list-response.json", + "$ref": "collection/update-collection-list-response.json", "description": "Response payload for update_collection_list task" } }, "get-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/get-collection-list-request.json", + "$ref": "collection/get-collection-list-request.json", "description": "Request parameters for retrieving a collection list with resolved collections" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/get-collection-list-response.json", + "$ref": "collection/get-collection-list-response.json", "description": "Response payload for get_collection_list task" } }, "list-collection-lists": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/list-collection-lists-request.json", + "$ref": "collection/list-collection-lists-request.json", "description": "Request parameters for listing collection lists" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/list-collection-lists-response.json", + "$ref": "collection/list-collection-lists-response.json", "description": "Response payload for list_collection_lists task" } }, "delete-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/delete-collection-list-request.json", + "$ref": "collection/delete-collection-list-request.json", "description": "Request parameters for deleting a collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/delete-collection-list-response.json", + "$ref": "collection/delete-collection-list-response.json", "description": "Response payload for delete_collection_list task" } }, "list-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/list-content-standards-request.json", + "$ref": "content-standards/list-content-standards-request.json", "description": "Request parameters for listing content standards configurations" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/list-content-standards-response.json", + "$ref": "content-standards/list-content-standards-response.json", "description": "Response payload with list of content standards configurations" } }, "get-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-content-standards-request.json", + "$ref": "content-standards/get-content-standards-request.json", "description": "Request parameters for retrieving a specific standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-content-standards-response.json", + "$ref": "content-standards/get-content-standards-response.json", "description": "Response payload with full standards configuration including policy and calibration data" } }, "create-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/create-content-standards-request.json", + "$ref": "content-standards/create-content-standards-request.json", "description": "Request parameters for creating a new content standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/create-content-standards-response.json", + "$ref": "content-standards/create-content-standards-response.json", "description": "Response payload with new standards_id" } }, "update-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/update-content-standards-request.json", + "$ref": "content-standards/update-content-standards-request.json", "description": "Request parameters for updating an existing content standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/update-content-standards-response.json", + "$ref": "content-standards/update-content-standards-response.json", "description": "Response payload confirming update" } }, "calibrate-content": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/calibrate-content-request.json", + "$ref": "content-standards/calibrate-content-request.json", "description": "Request parameters for collaborative calibration dialogue" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/calibrate-content-response.json", + "$ref": "content-standards/calibrate-content-response.json", "description": "Response payload with detailed explanations for policy alignment" } }, "validate-content-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/validate-content-delivery-request.json", + "$ref": "content-standards/validate-content-delivery-request.json", "description": "Request parameters for batch validating delivery records" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/validate-content-delivery-response.json", + "$ref": "content-standards/validate-content-delivery-response.json", "description": "Response payload with batch validation results" } }, "get-media-buy-artifacts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-media-buy-artifacts-request.json", + "$ref": "content-standards/get-media-buy-artifacts-request.json", "description": "Request parameters for retrieving content artifacts from a media buy" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-media-buy-artifacts-response.json", + "$ref": "content-standards/get-media-buy-artifacts-response.json", "description": "Response payload with content artifacts for validation" } }, "get-creative-features": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-features-request.json", + "$ref": "creative/get-creative-features-request.json", "description": "Request parameters for evaluating creative features from a governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-features-response.json", + "$ref": "creative/get-creative-features-response.json", "description": "Response payload with feature values for the evaluated creative" } }, "sync-plans": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/sync-plans-request.json", + "$ref": "governance/sync-plans-request.json", "description": "Push campaign plans to the governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/sync-plans-response.json", + "$ref": "governance/sync-plans-response.json", "description": "Sync result with active validation categories and resolved policies per plan" } }, "report-plan-outcome": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-outcome-request.json", + "$ref": "governance/report-plan-outcome-request.json", "description": "Report the outcome of an action to the governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-outcome-response.json", + "$ref": "governance/report-plan-outcome-response.json", "description": "Outcome acceptance status with budget impact and findings" } }, "report-plan-adjustment": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-adjustment-request.json", + "$ref": "governance/report-plan-adjustment-request.json", "description": "Seller-authenticated append-only commitment adjustment report" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-adjustment-response.json", + "$ref": "governance/report-plan-adjustment-response.json", "description": "Accepted adjustment with gross, restored-headroom, and net budget state" } }, "get-plan-audit-logs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/get-plan-audit-logs-request.json", + "$ref": "governance/get-plan-audit-logs-request.json", "description": "Retrieve governance state and audit trail for a plan" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/get-plan-audit-logs-response.json", + "$ref": "governance/get-plan-audit-logs-response.json", "description": "Plan state with budget tracking, validation history, and compliance summary" } }, "check-governance": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/check-governance-request.json", + "$ref": "governance/check-governance-request.json", "description": "Orchestrator or seller calls the governance agent to validate an action against the campaign plan" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/check-governance-response.json", + "$ref": "governance/check-governance-response.json", "description": "Governance decision with findings and conditions" } } @@ -2232,41 +2344,41 @@ "tasks": { "get-adcp-capabilities": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-adcp-capabilities-request.json", + "$ref": "protocol/get-adcp-capabilities-request.json", "description": "Request parameters for cross-protocol capability discovery" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json", + "$ref": "protocol/get-adcp-capabilities-response.json", "description": "Response payload for get_adcp_capabilities task - includes AdCP version, supported protocols, and protocol-specific capabilities (media_buy, signals, etc.)" } }, "get-task-status": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-task-status-request.json", + "$ref": "protocol/get-task-status-request.json", "description": "Request parameters for get_task_status, the 3.x AdCP application-layer alias for legacy tasks/get polling; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-task-status-response.json", + "$ref": "protocol/get-task-status-response.json", "description": "AdCP application-layer task status, metadata, and optional completion result; alias response for legacy tasks/get" } }, "list-tasks": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/list-tasks-request.json", + "$ref": "protocol/list-tasks-request.json", "description": "Request parameters for list_tasks, the 3.x AdCP application-layer alias for legacy tasks/list reconciliation; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/list-tasks-response.json", + "$ref": "protocol/list-tasks-response.json", "description": "Filtered AdCP application-layer async task list for reconciliation; alias response for legacy tasks/list" } }, "sync-agent-notification-configs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/sync-agent-notification-configs-request.json", + "$ref": "protocol/sync-agent-notification-configs-request.json", "description": "Register, replace, pause, or clear agent-level webhook subscribers such as capabilities.changed" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/sync-agent-notification-configs-response.json", + "$ref": "protocol/sync-agent-notification-configs-response.json", "description": "Applied agent-level webhook subscriber set with credentials redacted" } } @@ -2276,68 +2388,68 @@ "description": "Sponsored Intelligence Protocol for conversational brand experiences in AI assistants", "supporting-schemas": { "si-capabilities": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-capabilities.json", + "$ref": "sponsored-intelligence/si-capabilities.json", "description": "Capability categories that brand or host can support (modalities, components, commerce)" }, "si-identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-identity.json", + "$ref": "sponsored-intelligence/si-identity.json", "description": "User identity with explicit consent for personalized brand experiences" }, "si-ui-element": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-ui-element.json", + "$ref": "sponsored-intelligence/si-ui-element.json", "description": "Standard visual components (text, link, image, product_card, carousel, action_button, app_handoff)" }, "si-context-use": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-context-use.json", + "$ref": "sponsored-intelligence/si-context-use.json", "description": "Declared host-side use mode for sponsored context entering an SI boundary" }, "si-sponsored-context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-sponsored-context.json", + "$ref": "sponsored-intelligence/si-sponsored-context.json", "description": "Declaration linking paying principal, context use, and disclosure obligation for sponsored context" }, "si-sponsored-context-receipt": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-sponsored-context-receipt.json", + "$ref": "sponsored-intelligence/si-sponsored-context-receipt.json", "description": "Host receipt recording accepted use mode and disclosure commitment for sponsored context" } }, "tasks": { "si-get-offering": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-get-offering-request.json", + "$ref": "sponsored-intelligence/si-get-offering-request.json", "description": "Get offering details, availability, and optionally matching products before session handoff" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-get-offering-response.json", + "$ref": "sponsored-intelligence/si-get-offering-response.json", "description": "Offering details, availability status, matching products, and token for session correlation" } }, "si-initiate-session": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-initiate-session-request.json", + "$ref": "sponsored-intelligence/si-initiate-session-request.json", "description": "Host initiates SI session with brand agent - includes context, identity, and capability negotiation" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-initiate-session-response.json", + "$ref": "sponsored-intelligence/si-initiate-session-response.json", "description": "Brand agent's response with session ID, initial message, UI elements, and negotiated capabilities" } }, "si-send-message": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-send-message-request.json", + "$ref": "sponsored-intelligence/si-send-message-request.json", "description": "Send a message within an active SI session" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-send-message-response.json", + "$ref": "sponsored-intelligence/si-send-message-response.json", "description": "Brand agent's response to the message, including session status and potential handoff" } }, "si-terminate-session": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-terminate-session-request.json", + "$ref": "sponsored-intelligence/si-terminate-session-request.json", "description": "Terminate an SI session with reason (handoff_transaction, handoff_complete, user_exit, session_timeout, host_terminated)" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-terminate-session-response.json", + "$ref": "sponsored-intelligence/si-terminate-session-response.json", "description": "Termination confirmation with optional ACP handoff or follow-up data" } } @@ -2345,13 +2457,13 @@ }, "adagents": { "description": "Agent authorization file format specification for publishers and data providers", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/adagents.json", + "$ref": "adagents.json", "file_location": "/.well-known/adagents.json", "purpose": "Declares authorized agents. Publishers use it for sales agent authorization over properties. Data providers use it to publish signal definitions and authorize signals agents to resell their data." }, "brand": { "description": "Brand identity claim file format specification", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand.json", + "$ref": "brand.json", "file_location": "/.well-known/brand.json", "purpose": "Declares brand identity and agent for a domain, enabling brand discovery and verification" }, @@ -2359,64 +2471,64 @@ "description": "Trusted Match Protocol (TMP) \u2014 real-time execution layer for activating pre-negotiated packages across any surface. Conformance invariants are normative in docs/trusted-match/specification.mdx; the cap-fire boundary contract is at docs/trusted-match/identity-match-implementation.mdx; a non-normative impression-tracker implementation reference (multi-identity dedup, fcap_keys labels, log-based data model, SDK primitives) is at docs/trusted-match/impression-tracker-implementation.mdx. Storage backend is an implementation choice; conformant services may use any store that satisfies the invariants.", "supporting-schemas": { "available-package": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/available-package.json", + "$ref": "trusted-match/available-package.json", "description": "A package available for contextual matching on a given impression opportunity" }, "offer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/offer.json", + "$ref": "trusted-match/offer.json", "description": "Buyer's response to a context match \u2014 ranges from simple activation (package_id only) to rich offers with brand, price, summary, and creative manifest" }, "offer-price": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/offer-price.json", + "$ref": "trusted-match/offer-price.json", "description": "Lightweight price for variable-priced offers" }, "error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/error.json", + "$ref": "trusted-match/error.json", "description": "Error response from a TMP provider or router when a request cannot be processed" }, "provider-registration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-registration.json", + "$ref": "trusted-match/provider-registration.json", "description": "TMP provider registration \u2014 endpoint, capabilities, and operational parameters for router configuration" }, "provider-context-match-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-context-match-response.json", + "$ref": "trusted-match/provider-context-match-response.json", "description": "Provider-to-router Context Match response shape \u2014 carries provider-local targeting key-values and forbids router-authored attribution buckets" }, "provider-identity-match-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-identity-match-response.json", + "$ref": "trusted-match/provider-identity-match-response.json", "description": "Provider-to-router Identity Match response shape \u2014 carries ordered TMPX `{slot_id, value}` chunks with no publisher-local names" }, "publisher-targeting-kv-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/publisher-targeting-kv-config.json", + "$ref": "trusted-match/publisher-targeting-kv-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, provider-local targeting key) to the ad-server targeting destination for that surface" }, "publisher-tmpx-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/publisher-tmpx-config.json", + "$ref": "trusted-match/publisher-tmpx-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, slot_id) to the ad-server macro name, GAM key-value, VAST substitution, or play-log field for that surface" }, "tmpx-chunk": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/tmpx-chunk.json", + "$ref": "trusted-match/tmpx-chunk.json", "description": "A single TMPX chunk \u2014 provider-local slot_id and opaque URL-safe value; shared between provider\u2192router and router\u2192publisher hops" } }, "operations": { "context-match": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/context-match-request.json", + "$ref": "trusted-match/context-match-request.json", "description": "Evaluate available packages against content context. Contains no user identity." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/context-match-response.json", + "$ref": "trusted-match/context-match-response.json", "description": "Router-to-publisher offers for matched packages with provider-attributed targeting signals" } }, "identity-match": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/identity-match-request.json", + "$ref": "trusted-match/identity-match-request.json", "description": "Evaluate user eligibility for packages using an opaque identity token. Contains no page context." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/identity-match-response.json", + "$ref": "trusted-match/identity-match-response.json", "description": "Per-package eligibility \u2014 boolean eligible plus optional intent score" } } @@ -2426,88 +2538,88 @@ "description": "Brand protocol for identity retrieval, rights discovery, acquisition, and lifecycle management", "supporting-schemas": { "rights-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/rights-pricing-option.json", + "$ref": "brand/rights-pricing-option.json", "description": "Pricing option for licensable rights" }, "rights-terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/rights-terms.json", + "$ref": "brand/rights-terms.json", "description": "Terms returned with a rights grant \u2014 coverage, restrictions, revocation, and credentials" }, "creative-approval-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/creative-approval-request.json", + "$ref": "brand/creative-approval-request.json", "description": "Payload the buyer submits to the approval_webhook from acquire_rights for rights-holder creative review" }, "creative-approval-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/creative-approval-response.json", + "$ref": "brand/creative-approval-response.json", "description": "Response from the approval_webhook \u2014 approved, rejected, or pending_review" }, "revocation-notification": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/revocation-notification.json", + "$ref": "brand/revocation-notification.json", "description": "Notification sent to the buyer's revocation_webhook when an acquired rights grant is revoked" }, "verification-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verification-status.json", + "$ref": "brand/verification-status.json", "description": "Shared status enum returned by verify_brand_claim \u2014 owned, pending_review, transferring, disputed, not_ours, archived, licensed_in, licensed_out, unknown" } }, "tasks": { "get-brand-identity": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-brand-identity-request.json", + "$ref": "brand/get-brand-identity-request.json", "description": "Request parameters for retrieving brand identity data from a brand agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-brand-identity-response.json", + "$ref": "brand/get-brand-identity-response.json", "description": "Response payload for get_brand_identity task" } }, "verify-brand-claim": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claim-request.json", + "$ref": "brand/verify-brand-claim-request.json", "description": "Request parameters for verifying a single brand claim (subsidiary / parent / property / trademark, discriminated by claim_type)" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claim-response.json", + "$ref": "brand/verify-brand-claim-response.json", "description": "Response payload for verify_brand_claim task \u2014 claim_type echoed, status from the shared VerificationStatus enum, per-claim-type details" } }, "verify-brand-claims": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claims-request.json", + "$ref": "brand/verify-brand-claims-request.json", "description": "Request parameters for bulk verification \u2014 claims[] array (max 100), each entry shaped like a single verify_brand_claim request" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claims-response.json", + "$ref": "brand/verify-brand-claims-response.json", "description": "Response payload for verify_brand_claims task \u2014 results[] positionally aligned with the request's claims[], per-result success or error inline" } }, "get-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-rights-request.json", + "$ref": "brand/get-rights-request.json", "description": "Request parameters for searching licensable rights with pricing" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-rights-response.json", + "$ref": "brand/get-rights-response.json", "description": "Response payload for get_rights task" } }, "acquire-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/acquire-rights-request.json", + "$ref": "brand/acquire-rights-request.json", "description": "Request parameters for acquiring rights with contractual clearance" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/acquire-rights-response.json", + "$ref": "brand/acquire-rights-response.json", "description": "Response payload for acquire_rights task \u2014 terms and generation credentials" } }, "update-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/update-rights-request.json", + "$ref": "brand/update-rights-request.json", "description": "Request parameters for modifying an active rights grant \u2014 dates, caps, pricing, or pause/resume" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/update-rights-response.json", + "$ref": "brand/update-rights-response.json", "description": "Response payload for update_rights task" } } @@ -2516,11 +2628,11 @@ "extensions": { "description": "Typed extension schemas for vendor-specific or domain-specific data. Extensions define the structure of data within the ext.{namespace} field. Agents declare which extensions they support in their agent card.", "registry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/extensions/index.json", + "$ref": "extensions/index.json", "description": "Auto-generated registry of all available extensions with metadata" }, "meta": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/extensions/extension-meta.json", + "$ref": "extensions/extension-meta.json", "description": "Schema that all extension files must follow. Defines valid_from, valid_until, and extension data structure." }, "schemas": {} @@ -2529,18 +2641,18 @@ "description": "Compliance testing tool schemas. The test controller is an optional sandbox-only tool that lets comply walk full lifecycle state machines by triggering seller-side transitions deterministically.", "supporting-schemas": { "task-completion-data": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/task-completion-data.json", + "$ref": "compliance/task-completion-data.json", "description": "Bounded force_task_completion result union for supported legacy async scenarios" } }, "tasks": { "comply-test-controller": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/comply-test-controller-request.json", + "$ref": "compliance/comply-test-controller-request.json", "description": "Request payload for the comply_test_controller tool \u2014 scenario selection and scenario-specific params" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/comply-test-controller-response.json", + "$ref": "compliance/comply-test-controller-response.json", "description": "Response payload \u2014 state transition results, simulation results, scenario list, or structured errors" } } @@ -2570,5 +2682,5 @@ "code": "// Use everit-org/json-schema or similar library" } ], - "published_version": "3.2.0-beta.6" + "published_version": "3.2.0-beta.8" } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json new file mode 100644 index 000000000..fe8fd47ca --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json @@ -0,0 +1,230 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Get Reporting Status Request", + "x-status": "experimental", + "x-tool-summary": "Check reporting health, enumerate expected periods and all retained revisions, or resolve one exact reporting revision.", + "description": "Authoritative caller/account-isolated reporting reliability read. The authenticated caller identity comes only from transport authentication, never request fields. summary answers the operational question for independently selected delivery configurations/feeds; periods returns a cursor-paginated obligation ledger; revision resolves one exact retained revision and its materializations/resources. Unknown, unauthorized, cross-caller, and cross-account identifiers MUST be indistinguishable. Sellers implementing this task MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "allOf": [ + { + "$ref": "../core/version-envelope.json" + }, + { + "if": { + "properties": { + "view": { + "const": "summary" + } + }, + "required": [ + "view" + ] + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "reporting_revision_id" + ] + }, + { + "required": [ + "pagination" + ] + }, + { + "required": [ + "health" + ] + } + ] + } + } + }, + { + "if": { + "properties": { + "view": { + "const": "periods" + } + }, + "required": [ + "view" + ] + }, + "then": { + "not": { + "required": [ + "reporting_revision_id" + ] + } + } + }, + { + "if": { + "properties": { + "view": { + "const": "revision" + } + }, + "required": [ + "view" + ] + }, + "then": { + "required": [ + "reporting_revision_id" + ], + "not": { + "anyOf": [ + { + "required": [ + "media_buy_ids" + ] + }, + { + "required": [ + "delivery_config_ids" + ] + }, + { + "required": [ + "feed_purposes" + ] + }, + { + "required": [ + "period" + ] + }, + { + "required": [ + "health" + ] + }, + { + "required": [ + "finality" + ] + } + ] + } + } + } + ], + "x-mutates-state": false, + "properties": { + "account": { + "$ref": "../core/canonical-account-ref.json", + "description": "Account whose caller-owned reporting status is queried." + }, + "view": { + "type": "string", + "enum": [ + "summary", + "periods", + "revision" + ], + "description": "Stable response-shape discriminator. SDK convenience methods may default this to summary, but the wire request is explicit." + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "minItems": 1, + "maxItems": 100, + "uniqueItems": true, + "description": "Optional summary/periods scope. Omit for every accessible media buy in the account." + }, + "delivery_config_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "x-entity": "reporting_delivery_config" + }, + "minItems": 1, + "maxItems": 16, + "uniqueItems": true, + "description": "Optional summary/periods scope. Use to reconcile billing, analytics, and pacing independently. Omit for every active caller-owned configuration." + }, + "feed_purposes": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate." + }, + "period": { + "type": "object", + "description": "Half-open summary/periods horizon. Omit for the seller's documented operational default horizon; the response always echoes the evaluated scope.", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "start", + "end" + ], + "additionalProperties": false + }, + "health": { + "type": "array", + "items": { + "$ref": "../enums/reporting-health.json" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Periods-view result filter only; it never changes summary health." + }, + "finality": { + "type": "array", + "items": { + "$ref": "../enums/reporting-finality.json" + }, + "minItems": 1, + "uniqueItems": true + }, + "reporting_revision_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{1,255}$", + "x-entity": "reporting_revision", + "description": "Exact retained revision to resolve in revision view." + }, + "pagination": { + "$ref": "../core/pagination-request.json", + "description": "Periods or revision-view pagination. Cursors are bound to the authenticated caller, account, filters, and ledger snapshot." + }, + "context": { + "$ref": "../core/context.json" + }, + "ext": { + "$ref": "../core/ext.json" + } + }, + "required": [ + "account", + "view" + ] +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json new file mode 100644 index 000000000..f936d20d2 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json @@ -0,0 +1,758 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Get Reporting Status Response", + "x-status": "experimental", + "description": "Authoritative caller/account-isolated reporting status response. The view echoes the request and discriminates summary, periods, exact revision, and fatal error shapes. Every identifier, cursor, ledger snapshot, destination, revision, materialization, and resource is scoped to the authenticated caller and account.", + "type": "object", + "allOf": [ + { + "$ref": "../core/version-envelope.json" + }, + { + "$ref": "../core/protocol-envelope.json" + }, + { + "if": { + "properties": { + "health": { + "const": "complete" + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "scope": { + "properties": { + "scope_closed": { + "const": true + }, + "coverage_complete": { + "const": true + } + }, + "required": [ + "scope_closed", + "coverage_complete" + ] + } + }, + "not": { + "required": [ + "next_expected_at" + ] + } + } + }, + { + "if": { + "properties": { + "health": { + "const": "action_required" + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "issues": { + "minItems": 1, + "contains": { + "properties": { + "severity": { + "const": "action_required" + } + }, + "required": [ + "severity" + ] + } + } + }, + "required": [ + "issues" + ] + } + }, + { + "if": { + "properties": { + "health": { + "const": "delayed" + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "issues": { + "minItems": 1, + "items": { + "properties": { + "severity": { + "const": "delayed" + } + } + } + } + }, + "required": [ + "issues" + ] + } + }, + { + "if": { + "properties": { + "health": { + "enum": [ + "healthy", + "waiting", + "complete" + ] + } + }, + "required": [ + "health" + ] + }, + "then": { + "properties": { + "issues": { + "maxItems": 0 + } + }, + "required": [ + "issues" + ] + } + }, + { + "if": { + "properties": { + "scope": { + "properties": { + "coverage_complete": { + "const": false + } + }, + "required": [ + "coverage_complete" + ] + } + }, + "required": [ + "scope" + ] + }, + "then": { + "properties": { + "health": { + "const": "action_required" + }, + "issues": { + "minItems": 1, + "contains": { + "properties": { + "code": { + "const": "HISTORY_UNAVAILABLE" + }, + "severity": { + "const": "action_required" + } + }, + "required": [ + "code", + "severity" + ] + } + } + }, + "required": [ + "issues" + ] + } + } + ], + "properties": { + "view": { + "type": "string", + "enum": [ + "summary", + "periods", + "revision" + ] + }, + "ledger_snapshot_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value." + }, + "ledger_as_of": { + "type": "string", + "format": "date-time", + "description": "Exclusive observation boundary for ledger_snapshot_id. Revisions committed later appear only in a later reconciliation." + }, + "account_id": { + "type": "string", + "minLength": 1, + "x-entity": "account", + "description": "Resolved seller/storefront account identifier." + }, + "scope": { + "type": "object", + "description": "Exact denominator evaluated for summary or periods health. complete is valid only when scope_closed is true.", + "properties": { + "period_start": { + "type": "string", + "format": "date-time" + }, + "period_end": { + "type": "string", + "format": "date-time" + }, + "scope_closed": { + "type": "boolean", + "description": "True only when no new obligation can enter this evaluated scope." + }, + "media_buy_ids": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "x-entity": "media_buy" + }, + "uniqueItems": true + }, + "all_accessible_media_buys": { + "type": "boolean", + "description": "True when media_buy_ids was omitted and the scope covers all caller-accessible account buys." + }, + "delivery_config_generations": { + "type": "array", + "description": "Exact independently reconciled configuration generations in the denominator.", + "items": { + "type": "object", + "properties": { + "delivery_config_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "x-entity": "reporting_delivery_config" + }, + "delivery_config_version": { + "type": "integer", + "minimum": 1 + }, + "feed_purpose": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + } + }, + "required": [ + "delivery_config_id", + "delivery_config_version", + "feed_purpose" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "feed_purposes": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "pacing", + "analytics", + "billing" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "finality": { + "type": "array", + "items": { + "$ref": "../enums/reporting-finality.json" + }, + "minItems": 1, + "uniqueItems": true + }, + "ledger_retained_from": { + "type": "string", + "format": "date-time", + "description": "Earliest period boundary for which anti-entropy metadata is retained for every selected configuration generation." + }, + "coverage_complete": { + "type": "boolean", + "description": "Whether the requested horizon is fully inside retained ledger coverage. False means health cannot prove completeness for the whole requested horizon." + } + }, + "required": [ + "period_start", + "period_end", + "scope_closed", + "all_accessible_media_buys", + "delivery_config_generations", + "feed_purposes", + "finality", + "ledger_retained_from", + "coverage_complete" + ], + "allOf": [ + { + "if": { + "properties": { + "all_accessible_media_buys": { + "const": false + } + }, + "required": [ + "all_accessible_media_buys" + ] + }, + "then": { + "required": [ + "media_buy_ids" + ] + } + } + ], + "additionalProperties": false + }, + "health": { + "$ref": "../enums/reporting-health.json" + }, + "data_through": { + "type": [ + "string", + "null" + ], + "format": "date-time", + "description": "Conservative latest included event time across satisfied obligations in scope, or null when unavailable/unknown." + }, + "next_expected_at": { + "type": "string", + "format": "date-time", + "description": "Next obligation due time for an open scope. Omitted for a closed complete scope." + }, + "obligation_counts": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "minimum": 0 + }, + "waiting": { + "type": "integer", + "minimum": 0 + }, + "healthy": { + "type": "integer", + "minimum": 0 + }, + "delayed": { + "type": "integer", + "minimum": 0 + }, + "action_required": { + "type": "integer", + "minimum": 0 + }, + "complete": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "total", + "waiting", + "healthy", + "delayed", + "action_required", + "complete" + ], + "additionalProperties": false + }, + "issues": { + "type": "array", + "items": { + "$ref": "../core/reporting-status-issue.json" + } + }, + "periods": { + "type": "array", + "items": { + "$ref": "../core/reporting-obligation.json" + } + }, + "revisions": { + "type": "array", + "items": { + "$ref": "../core/reporting-revision.json" + }, + "description": "Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, materializations, and receipts, avoiding unbounded nested history." + }, + "pagination": { + "$ref": "../core/pagination-response.json" + }, + "revision": { + "$ref": "../core/reporting-revision.json" + }, + "materializations": { + "type": "array", + "items": { + "$ref": "../core/reporting-materialization.json" + } + }, + "receipts": { + "type": "array", + "items": { + "$ref": "../core/reporting-receipt.json" + }, + "description": "Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." + }, + "errors": { + "type": "array", + "items": { + "$ref": "../core/error.json" + } + }, + "context": { + "$ref": "../core/context.json" + }, + "ext": { + "$ref": "../core/ext.json" + } + }, + "oneOf": [ + { + "title": "Successful lookup", + "properties": { + "status": { + "type": "string", + "const": "completed" + } + }, + "required": [ + "status" + ], + "oneOf": [ + { + "title": "Summary view", + "properties": { + "view": { + "type": "string", + "const": "summary" + } + }, + "required": [ + "view", + "ledger_snapshot_id", + "ledger_as_of", + "account_id", + "scope", + "health", + "data_through", + "obligation_counts", + "issues" + ], + "not": { + "anyOf": [ + { + "required": [ + "periods" + ] + }, + { + "required": [ + "revisions" + ] + }, + { + "required": [ + "pagination" + ] + }, + { + "required": [ + "revision" + ] + }, + { + "required": [ + "materializations" + ] + }, + { + "required": [ + "receipts" + ] + } + ] + } + }, + { + "title": "Periods view", + "properties": { + "view": { + "type": "string", + "const": "periods" + }, + "pagination": { + "required": [ + "has_more", + "total_count" + ] + } + }, + "required": [ + "view", + "ledger_snapshot_id", + "ledger_as_of", + "account_id", + "scope", + "periods", + "revisions", + "materializations", + "receipts", + "pagination" + ], + "not": { + "required": [ + "revision" + ] + } + }, + { + "title": "Revision view", + "properties": { + "view": { + "type": "string", + "const": "revision" + }, + "pagination": { + "required": [ + "has_more", + "total_count" + ] + } + }, + "required": [ + "view", + "ledger_snapshot_id", + "ledger_as_of", + "account_id", + "revision", + "materializations", + "receipts", + "pagination" + ], + "not": { + "anyOf": [ + { + "required": [ + "scope" + ] + }, + { + "required": [ + "health" + ] + }, + { + "required": [ + "periods" + ] + }, + { + "required": [ + "revisions" + ] + } + ] + } + } + ] + }, + { + "title": "Failed lookup", + "properties": { + "status": { + "type": "string", + "const": "failed" + } + }, + "required": [ + "status" + ], + "oneOf": [ + { + "title": "Unavailable lookup", + "type": "object", + "properties": { + "adcp_version": { + "type": "string" + }, + "adcp_major_version": { + "type": "integer" + }, + "status": { + "type": "string", + "const": "failed" + }, + "view": { + "enum": [ + "summary", + "periods", + "revision" + ] + }, + "failure_kind": { + "type": "string", + "const": "lookup_unavailable" + }, + "context_id": { + "type": "string" + }, + "context": { + "$ref": "../core/context.json" + }, + "message": { + "const": "Reporting status resource is unavailable." + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "replayed": { + "type": "boolean" + }, + "adcp_error": { + "type": "object", + "properties": { + "code": { + "const": "NOT_FOUND" + }, + "message": { + "const": "Reporting status resource is unavailable." + } + }, + "required": [ + "code", + "message" + ], + "additionalProperties": false + }, + "errors": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "object", + "properties": { + "code": { + "const": "NOT_FOUND" + }, + "message": { + "const": "Reporting status resource is unavailable." + } + }, + "required": [ + "code", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "status", + "view", + "failure_kind", + "errors" + ], + "additionalProperties": false + }, + { + "title": "Operational failure", + "type": "object", + "properties": { + "adcp_version": { + "type": "string" + }, + "adcp_major_version": { + "type": "integer" + }, + "status": { + "type": "string", + "const": "failed" + }, + "view": { + "enum": [ + "summary", + "periods", + "revision" + ] + }, + "failure_kind": { + "type": "string", + "const": "operational" + }, + "context_id": { + "type": "string" + }, + "context": { + "$ref": "../core/context.json" + }, + "message": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "replayed": { + "type": "boolean" + }, + "adcp_error": { + "$ref": "../core/error.json" + }, + "errors": { + "type": "array", + "items": { + "$ref": "../core/error.json" + }, + "minItems": 1 + } + }, + "required": [ + "status", + "view", + "failure_kind", + "errors" + ], + "additionalProperties": false + } + ] + } + ], + "x-adcp-validation": { + "caller_isolation": "Derive caller identity only from authenticated transport. Every account, configuration generation, cursor, ledger snapshot, revision, materialization, resource, and destination must belong to that caller/account; unknown and unauthorized identifiers must use the identical lookup_unavailable shape. operational failures MUST NOT be used for identifier resolution or authorization failures.", + "snapshot_consistency": "All pages reached from a cursor MUST preserve ledger_snapshot_id and ledger_as_of. A cursor is unusable by another caller or account.", + "resource_retention": "A complete obligation must retain at least one readable verified exact materialization through its resource_retained_until. Metadata retention does not imply resource readability after that boundary." + }, + "additionalProperties": true +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json b/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json new file mode 100644 index 000000000..5941bc487 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json @@ -0,0 +1,66 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Sync Reporting Receipts Request", + "x-status": "experimental", + "x-tool-summary": "Record a consumer's independently verified reporting totals and destination evidence in the seller ledger.", + "description": "Submit durable authenticated consumer reconciliation results for reporting materializations. This is a batched idempotent upsert, not an acknowledgement of mere webhook receipt. Identity comes from authenticated transport; the request MUST NOT assert a buyer or governance principal.", + "type": "object", + "allOf": [ + { + "$ref": "../core/version-envelope.json" + } + ], + "properties": { + "adcp_version": { + "$ref": "../core/version-envelope.json#/properties/adcp_version" + }, + "adcp_major_version": { + "$ref": "../core/version-envelope.json#/properties/adcp_major_version" + }, + "account": { + "$ref": "../core/canonical-account-ref.json" + }, + "idempotency_key": { + "type": "string", + "minLength": 16, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{16,255}$", + "description": "Client-generated batch key. Exact retries reuse the key and body." + }, + "receipts": { + "type": "array", + "items": { + "allOf": [ + { + "$ref": "../core/reporting-receipt.json" + }, + { + "not": { + "required": [ + "received_at" + ] + } + } + ] + }, + "minItems": 1, + "maxItems": 100 + }, + "context": { + "$ref": "../core/context.json" + }, + "ext": { + "$ref": "../core/ext.json" + } + }, + "required": [ + "account", + "idempotency_key", + "receipts" + ], + "x-adcp-validation": { + "batch_identity": "reporting_receipt_id values MUST be unique within the batch. Every referenced obligation, revision, and materialization MUST resolve within the authenticated caller and account or fail with an indistinguishable unavailable result.", + "partial_results": "Each receipt is independent. One failed result does not roll back successfully recorded receipts; retries use the same receipt IDs and content." + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json b/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json new file mode 100644 index 000000000..9e0d4ba48 --- /dev/null +++ b/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json @@ -0,0 +1,127 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Sync Reporting Receipts Response", + "x-status": "experimental", + "description": "Per-receipt durable recording results. Successful readback lets a consumer prove the seller recorded its reconciliation outcome; failed results expose no cross-caller or cross-account resource metadata.", + "type": "object", + "allOf": [ + { + "$ref": "../core/version-envelope.json" + }, + { + "$ref": "../core/protocol-envelope.json" + } + ], + "properties": { + "status": { + "type": "string", + "const": "completed", + "description": "Receipt batches complete synchronously with one result per submitted receipt." + }, + "results": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "Recorded reporting receipt", + "type": "object", + "properties": { + "result": { + "type": "string", + "const": "recorded" + }, + "receipt": { + "allOf": [ + { + "$ref": "../core/reporting-receipt.json" + }, + { + "required": [ + "received_at" + ] + } + ] + } + }, + "required": [ + "result", + "receipt" + ], + "additionalProperties": false + }, + { + "title": "Unchanged reporting receipt", + "type": "object", + "properties": { + "result": { + "type": "string", + "const": "unchanged" + }, + "receipt": { + "allOf": [ + { + "$ref": "../core/reporting-receipt.json" + }, + { + "required": [ + "received_at" + ] + } + ] + } + }, + "required": [ + "result", + "receipt" + ], + "additionalProperties": false + }, + { + "title": "Failed reporting receipt", + "type": "object", + "properties": { + "result": { + "type": "string", + "const": "failed" + }, + "reporting_receipt_id": { + "type": "string", + "minLength": 16, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{16,255}$", + "x-entity": "reporting_receipt" + }, + "errors": { + "type": "array", + "items": { + "$ref": "../core/error.json" + }, + "minItems": 1, + "maxItems": 16 + } + }, + "required": [ + "result", + "reporting_receipt_id", + "errors" + ], + "additionalProperties": false + } + ] + }, + "minItems": 1, + "maxItems": 100 + }, + "context": { + "$ref": "../core/context.json" + }, + "ext": { + "$ref": "../core/ext.json" + } + }, + "required": [ + "status", + "results" + ], + "additionalProperties": true +} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json b/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json index 6e7db0871..0fd4beb85 100644 --- a/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json +++ b/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json @@ -84,6 +84,66 @@ ] } }, + { + "if": { + "properties": { + "media_buy": { + "required": [ + "reporting_delivery" + ] + } + }, + "required": [ + "media_buy" + ] + }, + "then": { + "properties": { + "experimental_features": { + "contains": { + "const": "media_buy.reporting_delivery" + } + } + }, + "required": [ + "experimental_features" + ] + } + }, + { + "if": { + "properties": { + "media_buy": { + "required": [ + "reporting_delivery" + ] + } + }, + "required": [ + "media_buy" + ] + }, + "then": { + "required": [ + "webhook_signing" + ], + "properties": { + "webhook_signing": { + "properties": { + "supported": { + "const": true + } + }, + "required": [ + "supported", + "profile", + "algorithms", + "legacy_hmac_fallback" + ] + } + } + } + }, { "if": { "allOf": [ @@ -1159,6 +1219,11 @@ "minItems": 1, "uniqueItems": true }, + "reporting_delivery": { + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reporting-delivery-capabilities.json", + "x-status": "experimental", + "description": "Managed reporting status and durable delivery capability. Presence requires media_buy.reporting_delivery in experimental_features. This generalizes, but does not remove, the legacy reporting_delivery_methods/offline_delivery_protocols surface." + }, "performance_feedback": { "type": "object", "x-status": "experimental", diff --git a/scripts/consolidate_exports.py b/scripts/consolidate_exports.py index 19654156d..88fea0913 100644 --- a/scripts/consolidate_exports.py +++ b/scripts/consolidate_exports.py @@ -41,6 +41,22 @@ # We need BOTH versions of these types available, so import them with qualified # names. KNOWN_COLLISIONS: dict[str, set[str]] = { + # Reporting schedules use the same wire enum name for the advertised + # schedule constraint and the installed, resolved account schedule. + "Alignment": {"reporting_schedule", "reporting_schedule_offering"}, + # Both documents expose ordered primary-key field names but they are + # distinct generated RootModel classes until schema model reuse can + # identify them structurally. + "PrimaryKey": { + "reporting_canonicalization_contract", + "reporting_delivery_offering", + }, + # Report definitions and the capabilities envelope both use this schema + # title for different enum surfaces. + "TimezoneBasis": { + "reporting_report_definition", + "get_adcp_capabilities_response", + }, "Package": {"package", "create_media_buy_response", "get_media_buys_response"}, # DeliveryStatus appears in get_media_buy_delivery_response (5 values) and # get_media_buys_response (6 values, adds not_delivering). Export both with diff --git a/scripts/generate_types.py b/scripts/generate_types.py index 466eb354f..c4472f94f 100755 --- a/scripts/generate_types.py +++ b/scripts/generate_types.py @@ -126,12 +126,15 @@ def rewrite_refs(obj, current_schema_rel_path: Path): # their eventual absolute temp-tree path. This keeps one generated # model per canonical schema instead of inlining duplicate classes. macro_ref_match = re.search( - r"/(enums/(?:macro-[^/]+|universal-macro)\.json|core/macro-[^/]+\.json)$", + r"(?:^|/)(enums/(?:macro-[^/]+|universal-macro)\.json|core/macro-[^/]+\.json|macro-[^/]+\.json)$", file_part, ) if not fragment and macro_ref_match: + target = macro_ref_match.group(1) + if target.startswith("macro-"): + target = f"core/{target}" temp_rel = Path( - *(part.replace("-", "_") for part in macro_ref_match.group(1).split("/")) + *(part.replace("-", "_") for part in target.split("/")) ) obj["$ref"] = (TEMP_DIR / temp_rel).as_posix() return obj @@ -144,6 +147,26 @@ def rewrite_refs(obj, current_schema_rel_path: Path): preserve_canonical_url = ( canonical_url and current_schema_rel_path in PRESERVE_CANONICAL_URL_REFS ) + preserve_local_ref = ( + not canonical_url + and current_schema_rel_path in PRESERVE_CANONICAL_URL_REFS + and file_part + and "://" not in file_part + and not file_part.startswith("//") + ) + if preserve_local_ref: + target_rel = Path( + posixpath.normpath( + (current_schema_rel_path.parent / file_part).as_posix() + ) + ) + temp_rel = Path( + *(part.replace("-", "_") for part in target_rel.parts) + ) + obj["$ref"] = (TEMP_DIR / temp_rel).as_posix() + ( + separator + fragment if separator else "" + ) + return obj version_match = None if not preserve_canonical_url: version_match = re.match( diff --git a/src/adcp/types/__init__.py b/src/adcp/types/__init__.py index 62a2aef67..6b05b3dd0 100644 --- a/src/adcp/types/__init__.py +++ b/src/adcp/types/__init__.py @@ -140,11 +140,31 @@ "ReportUsageResponse", "ReportingBucket", "ReportingCanonicalContentDigest", + "ReportingCanonicalizationContract", "ReportingControlTotal", + "ReportingDatasetShareDestination", + "ReportingDeliveryCapabilities", + "ReportingDeliveryConfiguration", + "ReportingDeliveryConfigurationState", + "ReportingDeliveryMethod", + "ReportingDeliveryOffering", + "ReportingDeliveryReadyWebhook", + "ReportingFileCompression", + "ReportingFileEntry", + "ReportingFileManifest", "ReportingMaterialization", "ReportingObligation", "ReportingReceipt", + "ReportingReconciliationMode", + "ReportingReportDefinition", + "ReportingResource", "ReportingRevision", + "ReportingSchedule", + "ReportingScheduleOffering", + "ReportingStatusIssue", + "ReportingVerification", + "ReportingVerificationProfile", + "ReportingWriteDestination", "Setup", "SyncAccountsRequest", "SyncAccountsResponse", @@ -1746,16 +1766,36 @@ def __dir__() -> list[str]: RepeatableAssetGroup, ReportingBucket, ReportingCanonicalContentDigest, + ReportingCanonicalizationContract, ReportingCapabilities, ReportingControlTotal, + ReportingDatasetShareDestination, + ReportingDeliveryCapabilities, + ReportingDeliveryConfiguration, + ReportingDeliveryConfigurationState, + ReportingDeliveryMethod, + ReportingDeliveryOffering, + ReportingDeliveryReadyWebhook, + ReportingFileCompression, + ReportingFileEntry, + ReportingFileManifest, ReportingFrequency, ReportingMaterialization, ReportingObligation, ReportingPeriod, ReportingReceipt, + ReportingReconciliationMode, + ReportingReportDefinition, + ReportingResource, ReportingRevision, + ReportingSchedule, + ReportingScheduleOffering, + ReportingStatusIssue, + ReportingVerification, + ReportingVerificationProfile, ReportingWebhook, ReportingWebhookAuthentication, + ReportingWriteDestination, ReportPlanAdjustmentRequest, ReportPlanAdjustmentResponse, ReportPlanOutcomeRequest, diff --git a/src/adcp/types/_eager.py b/src/adcp/types/_eager.py index afbb8f944..647ea55fc 100644 --- a/src/adcp/types/_eager.py +++ b/src/adcp/types/_eager.py @@ -337,15 +337,35 @@ Renders, ReportingBucket, ReportingCanonicalContentDigest, + ReportingCanonicalizationContract, ReportingCapabilities, ReportingControlTotal, + ReportingDatasetShareDestination, + ReportingDeliveryCapabilities, + ReportingDeliveryConfiguration, + ReportingDeliveryConfigurationState, + ReportingDeliveryMethod, + ReportingDeliveryOffering, + ReportingDeliveryReadyWebhook, + ReportingFileCompression, + ReportingFileEntry, + ReportingFileManifest, ReportingFrequency, ReportingMaterialization, ReportingObligation, ReportingPeriod, ReportingReceipt, + ReportingReconciliationMode, + ReportingReportDefinition, + ReportingResource, ReportingRevision, + ReportingSchedule, + ReportingScheduleOffering, + ReportingStatusIssue, + ReportingVerification, + ReportingVerificationProfile, ReportingWebhook, + ReportingWriteDestination, ReportPlanAdjustmentRequest, ReportPlanAdjustmentResponse, ReportPlanOutcomeRequest, @@ -1673,16 +1693,36 @@ def __init__(self, *args: object, **kwargs: object) -> None: "ReportUsageResponse", "ReportingBucket", "ReportingCanonicalContentDigest", + "ReportingCanonicalizationContract", "ReportingCapabilities", "ReportingControlTotal", + "ReportingDatasetShareDestination", + "ReportingDeliveryCapabilities", + "ReportingDeliveryConfiguration", + "ReportingDeliveryConfigurationState", + "ReportingDeliveryMethod", + "ReportingDeliveryOffering", + "ReportingDeliveryReadyWebhook", + "ReportingFileCompression", + "ReportingFileEntry", + "ReportingFileManifest", "ReportingFrequency", "ReportingMaterialization", "ReportingObligation", "ReportingPeriod", "ReportingReceipt", + "ReportingReconciliationMode", + "ReportingReportDefinition", + "ReportingResource", "ReportingRevision", + "ReportingSchedule", + "ReportingScheduleOffering", + "ReportingStatusIssue", + "ReportingVerification", + "ReportingVerificationProfile", "ReportingWebhook", "ReportingWebhookAuthentication", + "ReportingWriteDestination", "Request", "ResolvedBrand", "ResolvedProperty", diff --git a/src/adcp/types/capabilities.py b/src/adcp/types/capabilities.py index 10912cdac..0fd1f10ff 100644 --- a/src/adcp/types/capabilities.py +++ b/src/adcp/types/capabilities.py @@ -128,9 +128,6 @@ from adcp.types.generated_poc.bundled.protocol.get_adcp_capabilities_response import ( Idempotency as IdempotencySupported, ) -from adcp.types.generated_poc.bundled.protocol.get_adcp_capabilities_response import ( - MediaBuy as CapabilitiesMediaBuy, -) from adcp.types.generated_poc.bundled.protocol.get_adcp_capabilities_response import ( MediaBuy as _MediaBuy, ) @@ -146,6 +143,22 @@ from adcp.types.generated_poc.bundled.protocol.get_adcp_capabilities_response import ( Signals as _Signals, ) +from adcp.types.generated_poc.core.reporting_delivery_capabilities import ( + ReportingDeliveryCapabilities, +) + + +class CapabilitiesMediaBuy(_MediaBuy): + """Media-buy capabilities with the canonical reporting-delivery model. + + The bundled capability schema is generated independently from its canonical + source graph. Keep this referenced field on the same public model identity + as ``adcp.types.ReportingDeliveryCapabilities`` so typed adopter code does + not have to round-trip through an untyped dictionary. + """ + + reporting_delivery: ReportingDeliveryCapabilities | None = None + # ``Signals.features`` and the unsupported arm of the ``Adcp.idempotency`` # discriminated union are inline schemas the codegen materializes under diff --git a/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py b/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py index 531f3c24d..8cf629239 100644 --- a/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py +++ b/src/adcp/types/generated_poc/core/reporting_canonical_content_digest.py @@ -1,20 +1,27 @@ # generated by datamodel-codegen: # filename: core/reporting_canonical_content_digest.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations from typing import Annotated, Literal from adcp.types.base import AdCPBaseModel -from pydantic import ConfigDict, Field +from pydantic import AnyUrl, ConfigDict, Field class ReportingCanonicalContentDigest(AdCPBaseModel): model_config = ConfigDict( extra='forbid', + regex_engine="python-re", ) algorithm: Literal['sha256'] = 'sha256' value: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] canonicalization_id: Annotated[str, Field(max_length=128, min_length=1)] + canonicalization_uri: Annotated[ + AnyUrl, + Field( + description='Location of the exact immutable canonicalization contract. Consumers verify canonicalization_sha256 before applying it.' + ), + ] canonicalization_sha256: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] diff --git a/src/adcp/types/generated_poc/core/reporting_canonicalization_contract.py b/src/adcp/types/generated_poc/core/reporting_canonicalization_contract.py new file mode 100644 index 000000000..848a880dc --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_canonicalization_contract.py @@ -0,0 +1,56 @@ +# generated by datamodel-codegen: +# filename: core/reporting_canonicalization_contract.json +# timestamp: 2026-08-29T04:02:05+00:00 + +from __future__ import annotations + +from typing import Annotated, Any, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + + +class PrimaryKey(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1)] + + +class GoldenVector(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + name: Annotated[str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$')] + input_rows: list[dict[str, Any]] + canonical_utf8_base64: Annotated[ + str, Field(description='Base64 of the exact expected canonical UTF-8 bytes.', min_length=1) + ] + sha256: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] + + +class ReportingCanonicalizationContract(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + contract_version: Literal['1.0'] = '1.0' + media_type: Literal['application/vnd.adcp.reporting-canonicalization+json'] = 'application/vnd.adcp.reporting-canonicalization+json' + algorithm: Literal['adcp_jcs_rows_v1'] = 'adcp_jcs_rows_v1' + schema_sha256: Annotated[ + str, + Field( + description='Digest of the exact row schema to which this contract applies.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] + primary_keys: Annotated[ + list[PrimaryKey], + Field( + description="Ordered scalar fields used to sort rows and reject duplicate logical rows. This MUST equal the offering's primary_keys.", + min_length=1, + ), + ] + golden_vectors: Annotated[ + list[GoldenVector], + Field( + description='Cross-language conformance vectors. They MUST include an empty report and an ordering/encoding case.', + min_length=2, + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py b/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py index b1524f77d..aeba77793 100644 --- a/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py +++ b/src/adcp/types/generated_poc/core/reporting_dataset_share_destination.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_dataset_share_destination.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -19,7 +19,7 @@ class ReportingDatasetShareDestination1(AdCPBaseModel): destination_ref: Annotated[ str, Field( - description='Seller-issued reference returned by an earlier sync or bilateral setup.', + description='Seller-issued immutable recipient/destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup.', max_length=255, min_length=1, ), @@ -82,7 +82,7 @@ class ReportingDatasetShareDestination( root: Annotated[ ReportingDatasetShareDestination1 | ReportingDatasetShareDestination2, Field( - description='Recipient configuration for a producer-hosted reporting share. The caller either references an existing seller-issued binding or asks the seller to provision one for the named recipient. The seller verifies authenticated-caller authority to disclose the selected account/feed/scope and proves recipient control before readiness. A destination_ref is bound to that caller/account and cannot be probed or reused across scopes. No bearer profile, token, private key, password, or other credential may appear here.', + description="Recipient configuration for a producer-hosted reporting share. The caller either references an existing seller-issued immutable recipient/destination generation or asks the seller to provision one for the named recipient. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes disclosure of its feed and scope. Changing proof-bound recipient coordinates or the accepted delivery contract produces a new destination_ref. No bearer profile, token, private key, password, or other credential may appear here.", title='Reporting Dataset Share Destination', ), ] diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config.py b/src/adcp/types/generated_poc/core/reporting_delivery_config.py index 585252c6c..191f2db27 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_config.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_config.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -73,6 +73,15 @@ class ReportingDeliveryConfiguration(AdCPBaseModel): description='Operational use of this independently reconciled feed. pacing is the fast snapshot path; billing is invoice-authoritative. Event-level exposure is intentionally deferred until a privacy and authorization contract exists.' ), ] + report_definition_id: Annotated[ + str, + Field( + description='Exact immutable semantic definition selected from the offering. This makes the expected obligation identity independently derivable and prevents attribution, timezone, source-mapping, or restatement-policy drift behind a profile label.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] reporting_profile: Annotated[ str, Field( diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py index 69bdbce6f..0e86dc0a2 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_config_state.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -54,7 +54,7 @@ class ReportingDeliveryConfigurationState(AdCPBaseModel): destination_ref: Annotated[ str | None, Field( - description='Seller-issued stable binding. Present once the destination or recipient has been resolved; callers can use it with destination.mode existing on later syncs.', + description='Seller-issued immutable destination-generation reference. It is caller-scoped and reusable across separately authorized account configurations; it is not itself account authority or a bearer grant.', max_length=255, min_length=1, ), @@ -65,7 +65,7 @@ class ReportingDeliveryConfigurationState(AdCPBaseModel): publication_stopped_at: Annotated[ AwareDatetime | None, Field( - description='Applied cutoff after which the seller starts no new obligations or publications for this generation.' + description='Applied schedule boundary at or after deactivation. No obligation whose period starts at or after this cutoff is created; earlier obligations remain owed through their SLA and recovery lifecycle.' ), ] = None seller_managed_access_ends_at: Annotated[ diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_offering.py b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py index 5d5212906..b3c74ea65 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_offering.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_offering.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -11,7 +11,7 @@ from pydantic import AnyUrl, ConfigDict, Field, RootModel from ..enums import reporting_finality -from . import reporting_reconciliation_mode, reporting_schedule +from . import reporting_reconciliation_mode, reporting_schedule_offering class FeedPurpose(StrEnum): @@ -73,6 +73,14 @@ class ReportingProfile(AdCPBaseModel): min_length=1, ), ] + canonicalization_contract_version: Literal['1.0'] = '1.0' + canonicalization_media_type: Literal['application/vnd.adcp.reporting-canonicalization+json'] = 'application/vnd.adcp.reporting-canonicalization+json' + canonicalization_uri: Annotated[ + AnyUrl, + Field( + description='Retrievable exact canonicalization contract on the authenticated seller/provider or AdCP-registry origin. SDKs apply the same bounded, redirect-free SSRF controls as schema_uri and verify canonicalization_sha256 before use.' + ), + ] canonicalization_sha256: Annotated[ str, Field( @@ -160,16 +168,39 @@ class Method(AdCPBaseModel): class ReportingDeliveryOffering(AdCPBaseModel): model_config = ConfigDict( extra='forbid', + regex_engine="python-re", ) offering_id: Annotated[ str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$') ] feed_purpose: FeedPurpose + report_definition_id: Annotated[ + str, + Field( + description='Immutable semantic definition for metric, grain, attribution, action-report-time, timezone/calendar, source/API mapping, and restatement/finality policy. Configurations and revisions MUST echo this exact value.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] + report_definition_uri: Annotated[ + AnyUrl, + Field( + description='Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin.' + ), + ] + report_definition_sha256: Annotated[ + str, + Field( + description='Digest of the exact report-definition bytes. SDKs verify this before parsing and cache by digest.', + pattern='^[A-Fa-f0-9]{64}$', + ), + ] reporting_profile: Annotated[ ReportingProfile, Field(description='Machine-readable semantic and validation contract for delivered rows.'), ] - schedule: reporting_schedule.ReportingSchedule + schedule: reporting_schedule_offering.ReportingScheduleOffering supported_finality: Annotated[list[reporting_finality.ReportingFinality], Field(min_length=1)] reconciliation_mode: Annotated[ reporting_reconciliation_mode.ReportingReconciliationMode, diff --git a/src/adcp/types/generated_poc/core/reporting_materialization.py b/src/adcp/types/generated_poc/core/reporting_materialization.py index b3ce98f4e..7310fecf6 100644 --- a/src/adcp/types/generated_poc/core/reporting_materialization.py +++ b/src/adcp/types/generated_poc/core/reporting_materialization.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_materialization.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -64,7 +64,7 @@ class ReportingMaterialization(AdCPBaseModel): destination_ref: Annotated[ str, Field( - description='Resolved destination/share binding, scoped to the authenticated caller and account.', + description='Immutable caller-owned destination generation selected by the account-authorized obligation. It may be reused by the same caller across other independently authorized accounts.', max_length=255, min_length=1, ), @@ -78,7 +78,7 @@ class ReportingMaterialization(AdCPBaseModel): status: Annotated[ Status, Field( - description='Immutable result of this attempt. Staleness is evaluated in get_reporting_status health, not stored as a materialization state.' + description='Lifecycle of this attempt. pending may transition once to available, delivered, or failed; terminal evidence is immutable. Staleness is evaluated in get_reporting_status health, not stored as a materialization state.' ), ] ready_at: Annotated[ diff --git a/src/adcp/types/generated_poc/core/reporting_obligation.py b/src/adcp/types/generated_poc/core/reporting_obligation.py index bf97a1a27..07d3dc677 100644 --- a/src/adcp/types/generated_poc/core/reporting_obligation.py +++ b/src/adcp/types/generated_poc/core/reporting_obligation.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_obligation.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -64,7 +64,18 @@ class ReportingObligation(AdCPBaseModel): feed_purpose: FeedPurpose reporting_profile: Annotated[str, Field(max_length=128, min_length=1)] account_id: Annotated[str, Field(min_length=1)] - media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + media_buy_ids: Annotated[ + list[MediaBuyId], + Field( + description='Exact frozen media-buy denominator resolved for this period, including buys with zero rows. An empty array is the definitive zero-buy set; omission is never used to mean all, empty, or unknown.' + ), + ] + scope_resolved_at: Annotated[ + AwareDatetime, + Field( + description='Instant at which the configured scope was resolved and frozen for this obligation. For all_media_buys, include every caller-authorized account media buy whose effective flight overlaps the half-open period and was known by this cutoff. Later-created or backdated buys do not rewrite this obligation.' + ), + ] period: Period expected_at: AwareDatetime schedule: Annotated[ @@ -74,7 +85,7 @@ class ReportingObligation(AdCPBaseModel): destination_ref: Annotated[ str, Field( - description='Resolved caller/account-bound destination or recipient binding for this obligation.', + description='Immutable caller-owned destination generation selected by this account-authorized obligation. The account/configuration join—not possession of this reusable reference—authorizes disclosure.', max_length=255, min_length=1, ), diff --git a/src/adcp/types/generated_poc/core/reporting_report_definition.py b/src/adcp/types/generated_poc/core/reporting_report_definition.py new file mode 100644 index 000000000..d7660cef2 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_report_definition.py @@ -0,0 +1,160 @@ +# generated by datamodel-codegen: +# filename: core/reporting_report_definition.json +# timestamp: 2026-08-29T04:02:05+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated, Any, Literal + +from adcp.types.base import AdCPBaseModel +from pydantic import ConfigDict, Field, RootModel + + +class Provider(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + domain: Annotated[ + str, Field(pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$') + ] + + +class Source(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + provider: Provider + system: Annotated[str, Field(max_length=128, min_length=1)] + api_version: Annotated[str, Field(max_length=128, min_length=1)] + query_semantics: Annotated[ + dict[str, Any], + Field( + description='Canonical JSON object containing every source option that can change the numbers, including attribution settings, action-report-time, filters, and mapping version.' + ), + ] + + +class TimezoneBasis(StrEnum): + utc = 'utc' + account_timezone = 'account_timezone' + configured_timezone = 'configured_timezone' + + +class Calendar(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + timezone_basis: TimezoneBasis + timezone: Annotated[str | None, Field(max_length=255, min_length=1)] = None + + +class Aggregation(StrEnum): + sum = 'sum' + count = 'count' # type: ignore[assignment] + min = 'min' + max = 'max' + average = 'average' + ratio = 'ratio' + last = 'last' + custom = 'custom' + + +class Metric(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + name: Annotated[str, Field(max_length=128, min_length=1)] + source_expression: Annotated[str, Field(max_length=2048, min_length=1)] + aggregation: Aggregation + unit: Annotated[str | None, Field(max_length=64, min_length=1)] = None + + +class Dimension(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1)] + + +class RestatementPolicy(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + source_requery_duration: Annotated[ + str, + Field( + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] + emit_only_on_content_change: Literal[True] + + +class FinalityPolicies(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + finality_policy_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + basis: Literal['source_final'] = 'source_final' + source_signal: Annotated[str, Field(max_length=512, min_length=1)] + + +class FinalityPolicies1(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + finality_policy_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + basis: Literal['contractual_cutoff'] = 'contractual_cutoff' + duration_after_period_end: Annotated[ + str, + Field( + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] + + +class FinalityPolicies2(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + finality_policy_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + basis: Literal['stabilized'] = 'stabilized' + minimum_age: Annotated[ + str, + Field( + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] + unchanged_for: Annotated[ + str, + Field( + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] + + +class ReportingReportDefinition(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + contract_version: Literal['1.0'] = '1.0' + media_type: Literal['application/vnd.adcp.reporting-definition+json'] = 'application/vnd.adcp.reporting-definition+json' + report_definition_id: Annotated[ + str, Field(max_length=255, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,255}$') + ] + reporting_profile: Annotated[str, Field(max_length=128, min_length=1)] + grain: Annotated[str, Field(max_length=128, min_length=1)] + source: Source + calendar: Calendar + metrics: Annotated[list[Metric], Field(min_length=1)] + dimensions: list[Dimension] + restatement_policy: RestatementPolicy + finality_policies: Annotated[ + list[FinalityPolicies | FinalityPolicies1 | FinalityPolicies2], Field(min_length=1) + ] diff --git a/src/adcp/types/generated_poc/core/reporting_revision.py b/src/adcp/types/generated_poc/core/reporting_revision.py index b43780e68..4410937f6 100644 --- a/src/adcp/types/generated_poc/core/reporting_revision.py +++ b/src/adcp/types/generated_poc/core/reporting_revision.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_revision.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -27,6 +27,12 @@ class Period(AdCPBaseModel): source_timezone: Annotated[str, Field(min_length=1)] +class FinalityBasis(StrEnum): + source_final = 'source_final' + contractual_cutoff = 'contractual_cutoff' + stabilized = 'stabilized' + + class DataThroughPrecision(StrEnum): exact = 'exact' lower_bound = 'lower_bound' @@ -56,6 +62,8 @@ class ReportingRevision(AdCPBaseModel): pattern='^[A-Za-z0-9_.:-]{1,255}$', ), ] + report_definition_uri: AnyUrl + report_definition_sha256: Annotated[str, Field(pattern='^[A-Fa-f0-9]{64}$')] reporting_profile: Annotated[str, Field(max_length=128, min_length=1)] schema_version: Annotated[str, Field(max_length=64, min_length=1)] schema_uri: Annotated[ @@ -82,11 +90,37 @@ class ReportingRevision(AdCPBaseModel): ), ] = 'local_fragment_only' account_id: Annotated[str, Field(min_length=1)] - media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + media_buy_ids: Annotated[ + list[MediaBuyId], + Field( + description='Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator.' + ), + ] period: Annotated[ Period, Field(description='Half-open reporting interval with its source calendar boundary.') ] finality: reporting_finality.ReportingFinality + finality_basis: Annotated[ + FinalityBasis | None, + Field( + description='Why an official revision is considered final: an authoritative source signal, a versioned contractual cutoff, or a versioned stabilization rule.' + ), + ] = None + finality_policy_id: Annotated[ + str | None, + Field( + description='Immutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id.', + max_length=255, + min_length=1, + pattern='^[A-Za-z0-9_.:-]{1,255}$', + ), + ] = None + finalized_at: Annotated[ + AwareDatetime | None, + Field( + description='When the producer applied the declared finality basis to this official revision.' + ), + ] = None observed_at: Annotated[ AwareDatetime, Field(description='When the seller obtained or committed this source observation.'), diff --git a/src/adcp/types/generated_poc/core/reporting_schedule.py b/src/adcp/types/generated_poc/core/reporting_schedule.py index 8772fd711..837a0f09e 100644 --- a/src/adcp/types/generated_poc/core/reporting_schedule.py +++ b/src/adcp/types/generated_poc/core/reporting_schedule.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_schedule.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -8,7 +8,7 @@ from typing import Annotated from adcp.types.base import AdCPBaseModel -from pydantic import ConfigDict, Field +from pydantic import AwareDatetime, ConfigDict, Field class Alignment(StrEnum): @@ -35,6 +35,20 @@ class ReportingSchedule(AdCPBaseModel): description='Calendar used to establish exact period boundaries. The obligation echoes resolved timestamps and source timezone.' ), ] + period_anchor: Annotated[ + AwareDatetime | None, + Field( + description='Required for billing_cycle alignment. This immutable instant anchors the recurring half-open billing periods so producer and consumer derive the same month, quarter, or other contractual cycle.' + ), + ] = None + period_timezone: Annotated[ + str | None, + Field( + description='Required IANA timezone for billing_cycle calendar arithmetic. A numeric UTC offset is not sufficient because it does not define DST transitions.', + max_length=255, + min_length=1, + ), + ] = None delivery_sla: Annotated[ str, Field( diff --git a/src/adcp/types/generated_poc/core/reporting_schedule_offering.py b/src/adcp/types/generated_poc/core/reporting_schedule_offering.py new file mode 100644 index 000000000..433a9e010 --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_schedule_offering.py @@ -0,0 +1,50 @@ +# generated by datamodel-codegen: +# filename: core/reporting_schedule_offering.json +# timestamp: 2026-08-29T04:02:05+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field + + +class Alignment(StrEnum): + utc = 'utc' + account_timezone = 'account_timezone' + billing_cycle = 'billing_cycle' + + +class PeriodAnchorPolicy(StrEnum): + fixed = 'fixed' + configurable = 'configurable' + + +class ReportingScheduleOffering(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + regex_engine="python-re", + ) + period_duration: Annotated[ + str, + Field( + pattern='^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] + alignment: Alignment + period_anchor_policy: Annotated[ + PeriodAnchorPolicy | None, + Field( + description='For billing_cycle only. fixed requires the advertised anchor and timezone; configurable lets each authorized account configuration select them.' + ), + ] = None + period_anchor: AwareDatetime | None = None + period_timezone: Annotated[str | None, Field(max_length=255, min_length=1)] = None + delivery_sla: Annotated[ + str, + Field( + pattern='^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$' + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_write_destination.py b/src/adcp/types/generated_poc/core/reporting_write_destination.py index 365b91a5f..f3ba6049c 100644 --- a/src/adcp/types/generated_poc/core/reporting_write_destination.py +++ b/src/adcp/types/generated_poc/core/reporting_write_destination.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_write_destination.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -18,7 +18,7 @@ class ReportingWriteDestination1(AdCPBaseModel): destination_ref: Annotated[ str, Field( - description='Seller-issued reference returned by an earlier sync or bilateral setup.', + description='Seller-issued immutable destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup.', max_length=255, min_length=1, ), @@ -63,7 +63,7 @@ class ReportingWriteDestination(RootModel[ReportingWriteDestination1 | Reporting root: Annotated[ ReportingWriteDestination1 | ReportingWriteDestination2, Field( - description='Storage or warehouse destination for durable reporting. The caller either references an existing seller-issued binding or asks the seller to validate and bind a provider-native location. The seller verifies authenticated-caller authority for the account/feed/scope and destination control before readiness. A destination_ref is bound to that caller/account and cannot be probed or reused across scopes. Access grants name advertised producer identities; credentials never transit AdCP.', + description="Storage or warehouse destination for durable reporting. The caller either references an existing seller-issued immutable destination generation or asks the seller to validate and bind a provider-native location. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes its feed and scope. Changing proof-bound coordinates or the accepted delivery contract produces a new destination_ref. Access grants name advertised producer identities; credentials never transit AdCP.", title='Reporting Write Destination', ), ] diff --git a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py index 441001908..cdfab0374 100644 --- a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py +++ b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py @@ -1,24 +1,26 @@ # generated by datamodel-codegen: # filename: media_buy/sync_reporting_receipts_request.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations from typing import Annotated -from adcp.types.base import AdCPBaseModel from pydantic import ConfigDict, Field from ..core import canonical_account_ref from ..core import context as context_1 from ..core import ext as ext_1 -from ..core import reporting_receipt +from ..core import reporting_receipt, version_envelope +from ..core.version_envelope import AdcpVersionEnvelope -class SyncReportingReceiptsRequest(AdCPBaseModel): +class SyncReportingReceiptsRequest(AdcpVersionEnvelope): model_config = ConfigDict( extra='forbid', ) + adcp_version: version_envelope.AdcpVersion | None = None + adcp_major_version: version_envelope.AdcpMajorVersion | None = None account: canonical_account_ref.CanonicalAccountReference idempotency_key: Annotated[ str, diff --git a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py index d89887606..1280e42c7 100644 --- a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py +++ b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_response.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: media_buy/sync_reporting_receipts_response.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T04:02:05+00:00 from __future__ import annotations @@ -13,6 +13,8 @@ from ..core import error from ..core import ext as ext_1 from ..core import reporting_receipt +from ..core.protocol_envelope import ProtocolEnvelope +from ..core.version_envelope import AdcpVersionEnvelope class Results(AdCPBaseModel): @@ -42,10 +44,16 @@ class Results19(AdCPBaseModel): receipt: reporting_receipt.ReportingReceipt -class SyncReportingReceiptsResponse(AdCPBaseModel): +class SyncReportingReceiptsResponse(AdcpVersionEnvelope, ProtocolEnvelope): model_config = ConfigDict( - extra='forbid', + extra='allow', ) + status: Annotated[ + Literal['completed'], + Field( + description='Receipt batches complete synchronously with one result per submitted receipt.' + ), + ] = 'completed' results: Annotated[list[Results18 | Results19 | Results], Field(max_length=100, min_length=1)] context: context_1.ContextObject | None = None ext: ext_1.ExtensionObject | None = None diff --git a/src/adcp/types/v32.pyi b/src/adcp/types/v32.pyi index ccd36456f..ce9d2f56c 100644 --- a/src/adcp/types/v32.pyi +++ b/src/adcp/types/v32.pyi @@ -41,11 +41,10 @@ class _ExternalCorePushNotificationConfig(TypedDict, total=False): class _ExternalCoreReportingWebhook(TypedDict, total=False): url: Required[builtins.str] - operation_id: Required[builtins.str] token: NotRequired[builtins.str] authentication: Required[_ExternalCoreReportingWebhookAuthentication] reporting_frequency: Required[Literal['hourly', 'daily', 'monthly']] - requested_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + requested_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] class _AcceptProposalRequestOpportunity(TypedDict, total=False): opportunity_id: Required[builtins.str] @@ -227,6 +226,7 @@ class _BuildCreativeRequestCreativeManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeRequestCreativeManifestVariant1FormatOptionRefVariant1 | _BuildCreativeRequestCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -239,6 +239,7 @@ class _BuildCreativeRequestCreativeManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeRequestCreativeManifestVariant2FormatOptionRefVariant1 | _BuildCreativeRequestCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -247,6 +248,21 @@ class _BuildCreativeRequestCreativeManifestVariant2(TypedDict, total=False): provenance: NotRequired[_ExternalCoreProvenance] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreCreativeRepresentationSet(TypedDict, total=False): + creative_id: Required[builtins.str] + revision_id: Required[builtins.str] + revision_content_digest: Required[builtins.str] + name: Required[builtins.str] + representations: Required[builtins.list[_ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1 | _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2]] + provenance: NotRequired[_ExternalCoreProvenance] + +class _ExternalCoreRepresentationDestination(TypedDict, total=False): + product_id: Required[builtins.str] + format_option: Required[_ExternalCoreRepresentationDestinationFormatOptionVariant1 | _ExternalCoreRepresentationDestinationFormatOptionVariant2 | _ExternalCoreRepresentationDestinationFormatOptionVariant3 | _ExternalCoreRepresentationDestinationFormatOptionVariant4 | _ExternalCoreRepresentationDestinationFormatOptionVariant5 | _ExternalCoreRepresentationDestinationFormatOptionVariant6 | _ExternalCoreRepresentationDestinationFormatOptionVariant7 | _ExternalCoreRepresentationDestinationFormatOptionVariant8 | _ExternalCoreRepresentationDestinationFormatOptionVariant9 | _ExternalCoreRepresentationDestinationFormatOptionVariant10 | _ExternalCoreRepresentationDestinationFormatOptionVariant11 | _ExternalCoreRepresentationDestinationFormatOptionVariant12 | _ExternalCoreRepresentationDestinationFormatOptionVariant13 | _ExternalCoreRepresentationDestinationFormatOptionVariant14 | _ExternalCoreRepresentationDestinationFormatOptionVariant15] + placement_refs: NotRequired[builtins.list[_ExternalCorePlacementRef]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + class _ExternalCoreFormatId(TypedDict, total=False): agent_url: Required[builtins.str] id: Required[builtins.str] @@ -331,6 +347,7 @@ class _BuildCreativeResponseCreativeManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeResponseCreativeManifestVariant1FormatOptionRefVariant1 | _BuildCreativeResponseCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -343,6 +360,7 @@ class _BuildCreativeResponseCreativeManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeResponseCreativeManifestVariant2FormatOptionRefVariant1 | _BuildCreativeResponseCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -366,6 +384,7 @@ class _BuildCreativeResponseCreativeManifestsItemVariant1(TypedDict, total=False format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeResponseCreativeManifestsItemVariant1FormatOptionRefVariant1 | _BuildCreativeResponseCreativeManifestsItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -378,6 +397,7 @@ class _BuildCreativeResponseCreativeManifestsItemVariant2(TypedDict, total=False format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_BuildCreativeResponseCreativeManifestsItemVariant2FormatOptionRefVariant1 | _BuildCreativeResponseCreativeManifestsItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -717,6 +737,7 @@ class _ComplyTestControllerRequestParams(TypedDict, total=False): metrics: NotRequired[builtins.list[_ComplyTestControllerRequestParamsMetricsItem]] tool: NotRequired[builtins.str] upstream_name: NotRequired[builtins.str] + cache_age_seconds: NotRequired[builtins.int] result: NotRequired[builtins.dict[builtins.str, Any]] class _ComplyTestControllerRequestAccount(TypedDict, total=False): @@ -1057,6 +1078,7 @@ class _ExternalCoreAccount(TypedDict, total=False): reporting_bucket: NotRequired[_ExternalCoreAccountReportingBucket] sandbox: NotRequired[builtins.bool] notification_configs: NotRequired[builtins.list[_ExternalCoreNotificationConfig]] + reporting_delivery_configs: NotRequired[builtins.list[_ExternalCoreReportingDeliveryConfigState]] webhook_activity: NotRequired[builtins.list[_ExternalCoreWebhookActivityRecord]] ext: NotRequired[builtins.dict[builtins.str, Any]] @@ -1305,6 +1327,7 @@ class _GetAdcpCapabilitiesResponseMediaBuy(TypedDict, total=False): reporting_delivery_methods: NotRequired[builtins.list[Literal['webhook', 'offline']]] performance_feedback: NotRequired[_GetAdcpCapabilitiesResponseMediaBuyPerformanceFeedback] offline_delivery_protocols: NotRequired[builtins.list[Literal['s3', 'gcs', 'azure_blob']]] + reporting_delivery: NotRequired[_ExternalCoreReportingDeliveryCapabilities] supports_proposals: NotRequired[builtins.bool] outcome_target: NotRequired[builtins.bool] governance_aware: NotRequired[builtins.bool] @@ -1351,8 +1374,10 @@ class _GetAdcpCapabilitiesResponseBrand(TypedDict, total=False): class _GetAdcpCapabilitiesResponseCreative(TypedDict, total=False): supports_compliance: NotRequired[builtins.bool] has_creative_library: NotRequired[builtins.bool] + supports_revisions: NotRequired[builtins.bool] supports_generation: NotRequired[builtins.bool] supports_transformation: NotRequired[builtins.bool] + representation_resolution: NotRequired[_GetAdcpCapabilitiesResponseCreativeRepresentationResolution] supports_transformers: NotRequired[builtins.bool] supports_refinement: NotRequired[builtins.bool] supports_spend_controls: NotRequired[builtins.bool] @@ -1594,6 +1619,7 @@ class _GetCreativeFeaturesRequestCreativeManifestVariant1(TypedDict, total=False format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_GetCreativeFeaturesRequestCreativeManifestVariant1FormatOptionRefVariant1 | _GetCreativeFeaturesRequestCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -1606,6 +1632,7 @@ class _GetCreativeFeaturesRequestCreativeManifestVariant2(TypedDict, total=False format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_GetCreativeFeaturesRequestCreativeManifestVariant2FormatOptionRefVariant1 | _GetCreativeFeaturesRequestCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -1857,6 +1884,7 @@ class _ExternalCoreProduct(TypedDict, total=False): installments: NotRequired[builtins.list[_ExternalCoreInstallment]] enforced_policies: NotRequired[builtins.list[builtins.str]] trusted_match: NotRequired[_ExternalCoreProductTrustedMatch] + audience_activation: NotRequired[_ExternalCoreProductAudienceActivation] material_submission: NotRequired[_ExternalCoreProductMaterialSubmission] ext: NotRequired[builtins.dict[builtins.str, Any]] @@ -1928,13 +1956,14 @@ class _ExternalCoreProductFilters(TypedDict, total=False): social_placement_surfaces: NotRequired[builtins.list[Literal['feed', 'stories', 'short_video', 'explore', 'search']]] required_axe_integrations: NotRequired[builtins.list[builtins.str]] trusted_match: NotRequired[_ExternalCoreProductFiltersTrustedMatch] + audience_activation_methods: NotRequired[builtins.list[_ExternalCoreProductFiltersAudienceActivationMethodsItemVariant1 | _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant2 | _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant3 | _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant4 | _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant5 | _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant6]] required_features: NotRequired[_ExternalCoreMediaBuyFeatures] required_geo_targeting: NotRequired[builtins.list[_ExternalCoreProductFiltersRequiredGeoTargetingItem]] signal_targeting: NotRequired[builtins.list[_ExternalCoreProductFiltersSignalTargetingItemVariant1 | _ExternalCoreProductFiltersSignalTargetingItemVariant2 | _ExternalCoreProductFiltersSignalTargetingItemVariant3]] postal_areas: NotRequired[builtins.list[builtins.dict[builtins.str, Any]]] geo_proximity: NotRequired[builtins.list[_ExternalCoreProductFiltersGeoProximityItemVariant1 | _ExternalCoreProductFiltersGeoProximityItemVariant2 | _ExternalCoreProductFiltersGeoProximityItemVariant3]] required_performance_standards: NotRequired[builtins.list[_ExternalCorePerformanceStandard]] - required_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + required_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] required_vendor_metrics: NotRequired[builtins.list[_ExternalCoreProductFiltersRequiredVendorMetricsItem]] keywords: NotRequired[builtins.list[_ExternalCoreProductFiltersKeywordsItem]] audience_evidence_requirements: NotRequired[_ExternalCoreAudienceEvidenceRequirements] @@ -2088,6 +2117,168 @@ class _ExternalCoreIdentifier(TypedDict, total=False): type: Required[Literal['domain', 'subdomain', 'network_id', 'ios_bundle', 'android_package', 'apple_app_store_id', 'google_play_id', 'roku_store_id', 'fire_tv_asin', 'samsung_app_id', 'apple_tv_bundle', 'bundle_id', 'venue_id', 'screen_id', 'openooh_venue_type', 'rss_url', 'apple_podcast_id', 'spotify_collection_id', 'podcast_guid', 'station_id', 'facility_id']] value: Required[builtins.str] +class _GetReportingStatusRequestPeriod(TypedDict, total=False): + start: Required[builtins.str] + end: Required[builtins.str] + +class _GetReportingStatusResponseScope(TypedDict, total=False): + period_start: Required[builtins.str] + period_end: Required[builtins.str] + scope_closed: Required[builtins.bool] + media_buy_ids: NotRequired[builtins.list[builtins.str]] + all_accessible_media_buys: Required[builtins.bool] + delivery_config_generations: Required[builtins.list[_GetReportingStatusResponseScopeDeliveryConfigGenerationsItem]] + feed_purposes: Required[builtins.list[Literal['pacing', 'analytics', 'billing']]] + finality: Required[builtins.list[Literal['snapshot', 'official']]] + ledger_retained_from: Required[builtins.str] + coverage_complete: Required[builtins.bool] + +class _GetReportingStatusResponseObligationCounts(TypedDict, total=False): + total: Required[builtins.int] + waiting: Required[builtins.int] + healthy: Required[builtins.int] + delayed: Required[builtins.int] + action_required: Required[builtins.int] + complete: Required[builtins.int] + +class _ExternalCoreReportingStatusIssue(TypedDict, total=False): + code: Required[Literal['REPORT_OVERDUE', 'PRODUCTION_FAILED', 'DELIVERY_FAILED', 'ACCESS_REQUIRED', 'CONFIGURATION_REQUIRED', 'RESOURCE_EXPIRED', 'READER_INCOMPATIBLE', 'HISTORY_UNAVAILABLE']] + severity: Required[Literal['delayed', 'action_required']] + responsible_party: Required[Literal['buyer', 'seller', 'provider']] + recommended_action: Required[Literal['wait_for_retry', 'contact_buyer', 'contact_seller', 'contact_provider', 'repair_access', 'update_configuration', 'use_supported_reader']] + message: NotRequired[builtins.str] + reporting_obligation_id: NotRequired[builtins.str] + delivery_config_id: NotRequired[builtins.str] + delivery_config_version: NotRequired[builtins.int] + feed_purpose: NotRequired[Literal['pacing', 'analytics', 'billing']] + media_buy_ids: NotRequired[builtins.list[builtins.str]] + period_start: NotRequired[builtins.str] + period_end: NotRequired[builtins.str] + expected_at: NotRequired[builtins.str] + +class _ExternalCoreReportingObligation(TypedDict, total=False): + reporting_obligation_id: Required[builtins.str] + delivery_config_id: Required[builtins.str] + delivery_config_version: Required[builtins.int] + report_definition_id: Required[builtins.str] + feed_purpose: Required[Literal['pacing', 'analytics', 'billing']] + reporting_profile: Required[builtins.str] + account_id: Required[builtins.str] + media_buy_ids: Required[builtins.list[builtins.str]] + scope_resolved_at: Required[builtins.str] + period: Required[_ExternalCoreReportingObligationPeriod] + expected_at: Required[builtins.str] + schedule: Required[_ExternalCoreReportingSchedule] + destination_ref: Required[builtins.str] + required_finality: Required[Literal['snapshot', 'official']] + reconciliation_mode: Required[Literal['delivery_only', 'consumer_receipt']] + reconciliation_status: Required[Literal['not_required', 'pending', 'accepted', 'rejected']] + health: Required[Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete']] + production_status: Required[Literal['not_due', 'pending', 'published', 'failed']] + revision_count: Required[builtins.int] + materialization_count: Required[builtins.int] + successful_materialization_count: Required[builtins.int] + receipt_count: Required[builtins.int] + accepted_receipt_count: Required[builtins.int] + issues: Required[builtins.list[_ExternalCoreReportingStatusIssue]] + resource_retained_until: NotRequired[builtins.str] + +class _ExternalCoreReportingRevision(TypedDict, total=False): + reporting_revision_id: Required[builtins.str] + report_definition_id: Required[builtins.str] + report_definition_uri: Required[builtins.str] + report_definition_sha256: Required[builtins.str] + reporting_profile: Required[builtins.str] + schema_version: Required[builtins.str] + schema_uri: Required[builtins.str] + schema_sha256: Required[builtins.str] + schema_dialect: Required[Literal['https://json-schema.org/draft/2020-12/schema']] + schema_ref_policy: Required[Literal['local_fragment_only']] + account_id: Required[builtins.str] + media_buy_ids: Required[builtins.list[builtins.str]] + period: Required[_ExternalCoreReportingRevisionPeriod] + finality: Required[Literal['snapshot', 'official']] + finality_basis: NotRequired[Literal['source_final', 'contractual_cutoff', 'stabilized']] + finality_policy_id: NotRequired[builtins.str] + finalized_at: NotRequired[builtins.str] + observed_at: Required[builtins.str] + data_through: Required[builtins.str | None] + data_through_precision: Required[Literal['exact', 'lower_bound', 'unknown']] + supersedes_reporting_revision_id: NotRequired[builtins.str] + row_count: Required[builtins.int] + control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + created_at: Required[builtins.str] + +class _ExternalCoreReportingMaterialization(TypedDict, total=False): + reporting_materialization_id: Required[builtins.str] + reporting_revision_id: Required[builtins.str] + reporting_obligation_id: Required[builtins.str] + delivery_config_id: Required[builtins.str] + delivery_config_version: Required[builtins.int] + destination_ref: Required[builtins.str] + feed_purpose: Required[Literal['pacing', 'analytics', 'billing']] + method: Required[Literal['file_transfer', 'dataset_share', 'warehouse_materialization']] + transport: NotRequired[builtins.str] + attempt: Required[builtins.int] + status: Required[Literal['pending', 'available', 'delivered', 'failed']] + ready_at: NotRequired[builtins.str] + failed_at: NotRequired[builtins.str] + failure_code: NotRequired[builtins.str] + resource: NotRequired[_ExternalCoreReportingResource] + verification: NotRequired[_ExternalCoreReportingVerification] + created_at: Required[builtins.str] + +class _ExternalCoreReportingReceipt(TypedDict, total=False): + reporting_receipt_id: Required[builtins.str] + reporting_obligation_id: Required[builtins.str] + reporting_revision_id: Required[builtins.str] + reporting_materialization_id: Required[builtins.str] + status: Required[Literal['accepted', 'rejected']] + verification_profile: Required[Literal['native_commit', 'manifest_checksums', 'canonical_digest']] + observed_row_count: Required[builtins.int] + observed_control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + observed_canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + observed_manifest_sha256: NotRequired[builtins.str] + observed_native_version_ref: NotRequired[builtins.str] + consumer_commit_ref: NotRequired[builtins.str] + rejection_codes: NotRequired[builtins.list[builtins.str]] + observed_at: Required[builtins.str] + received_at: NotRequired[builtins.str] + +class _GetReportingStatusResponsePagination(TypedDict, total=False): + has_more: Required[builtins.bool] + cursor: NotRequired[builtins.str] + total_count: Required[builtins.int] + +class _GetReportingStatusResponseAdcpError(TypedDict, total=False): + code: Required[Literal['NOT_FOUND']] + message: Required[Literal['Reporting status resource is unavailable.']] + field: NotRequired[builtins.str] + suggestion: NotRequired[builtins.str] + retry_after: NotRequired[builtins.float] + issues: NotRequired[builtins.list[_GetReportingStatusResponseAdcpErrorIssuesItem]] + details: NotRequired[builtins.dict[builtins.str, Any]] + recovery: NotRequired[Literal['transient', 'correctable', 'terminal']] + source: NotRequired[Literal['producer', 'sdk']] + sdk_id: NotRequired[builtins.str] + +class _GetReportingStatusResponseErrorsItem(TypedDict, total=False): + code: Required[Literal['NOT_FOUND']] + message: Required[Literal['Reporting status resource is unavailable.']] + +class _GetReportingStatusResponseAdcpError2(TypedDict, total=False): + code: Required[builtins.str] + message: Required[builtins.str] + field: NotRequired[builtins.str] + suggestion: NotRequired[builtins.str] + retry_after: NotRequired[builtins.float] + issues: NotRequired[builtins.list[_GetReportingStatusResponseAdcpError2IssuesItem]] + details: NotRequired[builtins.dict[builtins.str, Any]] + recovery: NotRequired[Literal['transient', 'correctable', 'terminal']] + source: NotRequired[Literal['producer', 'sdk']] + sdk_id: NotRequired[builtins.str] + class _GetRightsResponseRightsItem(TypedDict, total=False): rights_id: Required[builtins.str] brand_id: Required[builtins.str] @@ -2286,6 +2477,7 @@ class _ExternalCoreAccountWithAuthorization(TypedDict, total=False): reporting_bucket: NotRequired[_ExternalCoreAccountWithAuthorizationReportingBucket] sandbox: NotRequired[builtins.bool] notification_configs: NotRequired[builtins.list[_ExternalCoreNotificationConfig]] + reporting_delivery_configs: NotRequired[builtins.list[_ExternalCoreReportingDeliveryConfigState]] webhook_activity: NotRequired[builtins.list[_ExternalCoreWebhookActivityRecord]] ext: NotRequired[builtins.dict[builtins.str, Any]] authorization: NotRequired[_ExternalCoreAccountAuthorization] @@ -2340,7 +2532,7 @@ class _ExternalCoreFormat(TypedDict, total=False): supported_disclosure_positions: NotRequired[builtins.list[Literal['prominent', 'footer', 'audio', 'subtitle', 'overlay', 'end_card', 'pre_roll', 'companion']]] disclosure_capabilities: NotRequired[builtins.list[_ExternalCoreFormatDisclosureCapabilitiesItem]] format_card_detailed: NotRequired[_ExternalCoreFormatFormatCardDetailed] - reported_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + reported_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] pricing_options: NotRequired[builtins.list[_ExternalCoreFormatPricingOptionsItemVariant1 | _ExternalCoreFormatPricingOptionsItemVariant2 | _ExternalCoreFormatPricingOptionsItemVariant3 | _ExternalCoreFormatPricingOptionsItemVariant4 | _ExternalCoreFormatPricingOptionsItemVariant5]] canonical: NotRequired[_ExternalCoreCanonicalProjectionRef] canonical_parameters: NotRequired[_ExternalCoreFormatCanonicalParametersVariant1 | _ExternalCoreFormatCanonicalParametersVariant2 | _ExternalCoreFormatCanonicalParametersVariant3 | _ExternalCoreFormatCanonicalParametersVariant4 | _ExternalCoreFormatCanonicalParametersVariant5 | _ExternalCoreFormatCanonicalParametersVariant6 | _ExternalCoreFormatCanonicalParametersVariant7 | _ExternalCoreFormatCanonicalParametersVariant8 | _ExternalCoreFormatCanonicalParametersVariant9 | _ExternalCoreFormatCanonicalParametersVariant10 | _ExternalCoreFormatCanonicalParametersVariant11 | _ExternalCoreFormatCanonicalParametersVariant12 | _ExternalCoreFormatCanonicalParametersVariant13 | _ExternalCoreFormatCanonicalParametersVariant14 | _ExternalCoreFormatCanonicalParametersVariant15] @@ -2396,6 +2588,8 @@ class _ListCreativesResponseQuerySummary(TypedDict, total=False): class _ListCreativesResponseCreativesItemVariant1(TypedDict, total=False): creative_id: Required[builtins.str] + revision_id: NotRequired[builtins.str] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] account: NotRequired[_ExternalCoreAccount] name: Required[builtins.str] format_id: Required[_ExternalCoreFormatId] @@ -2424,6 +2618,8 @@ class _ListCreativesResponseCreativesItemVariant1(TypedDict, total=False): class _ListCreativesResponseCreativesItemVariant2(TypedDict, total=False): creative_id: Required[builtins.str] + revision_id: NotRequired[builtins.str] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] account: NotRequired[_ExternalCoreAccount] name: Required[builtins.str] format_id: NotRequired[_ExternalCoreFormatId] @@ -2537,8 +2733,8 @@ class _ListTasksRequestFilters(TypedDict, total=False): protocols: NotRequired[builtins.list[Literal['media-buy', 'signals', 'governance', 'creative', 'brand', 'sponsored-intelligence', 'measurement']]] status: NotRequired[Literal['submitted', 'working', 'input-required', 'completed', 'canceled', 'failed', 'rejected', 'auth-required', 'unknown']] statuses: NotRequired[builtins.list[Literal['submitted', 'working', 'input-required', 'completed', 'canceled', 'failed', 'rejected', 'auth-required', 'unknown']]] - task_type: NotRequired[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs']] - task_types: NotRequired[builtins.list[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs']]] + task_type: NotRequired[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs', 'sync_reporting_receipts']] + task_types: NotRequired[builtins.list[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs', 'sync_reporting_receipts']]] created_after: NotRequired[builtins.str] created_before: NotRequired[builtins.str] updated_after: NotRequired[builtins.str] @@ -2561,7 +2757,7 @@ class _ListTasksResponseQuerySummary(TypedDict, total=False): class _ListTasksResponseTasksItem(TypedDict, total=False): task_id: Required[builtins.str] - task_type: Required[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs']] + task_type: Required[Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs', 'sync_reporting_receipts']] domain: Required[Literal['media-buy', 'signals', 'creative']] status: Required[Literal['submitted', 'working', 'input-required', 'completed', 'canceled', 'failed', 'rejected', 'auth-required', 'unknown']] created_at: Required[builtins.str] @@ -2745,7 +2941,7 @@ class _ExternalCorePerformanceStandard(TypedDict, total=False): class _PackageRequestCommittedMetricsItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_PackageRequestCommittedMetricsItemVariant1Qualifier] class _PackageRequestCommittedMetricsItemVariant2(TypedDict, total=False): @@ -2769,6 +2965,7 @@ class _PackageRequestCreativesItemVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PackageRequestCreativesItemVariant1FormatOptionRefVariant1 | _PackageRequestCreativesItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_PackageRequestCreativesItemVariant1InputsItem]] @@ -2787,6 +2984,7 @@ class _PackageRequestCreativesItemVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PackageRequestCreativesItemVariant2FormatOptionRefVariant1 | _PackageRequestCreativesItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_PackageRequestCreativesItemVariant2InputsItem]] @@ -2803,6 +3001,7 @@ class _PreviewCreativeRequestCreativeManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeRequestCreativeManifestVariant1FormatOptionRefVariant1 | _PreviewCreativeRequestCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -2815,6 +3014,7 @@ class _PreviewCreativeRequestCreativeManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeRequestCreativeManifestVariant2FormatOptionRefVariant1 | _PreviewCreativeRequestCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -2866,6 +3066,7 @@ class _PreviewCreativeResponseManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeResponseManifestVariant1FormatOptionRefVariant1 | _PreviewCreativeResponseManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -2878,6 +3079,7 @@ class _PreviewCreativeResponseManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeResponseManifestVariant2FormatOptionRefVariant1 | _PreviewCreativeResponseManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -2892,7 +3094,7 @@ class _ExternalCoreDatetimeRange(TypedDict, total=False): class _ProvidePerformanceFeedbackRequestMetricVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_ProvidePerformanceFeedbackRequestMetricVariant1Qualifier] class _ProvidePerformanceFeedbackRequestMetricVariant2(TypedDict, total=False): @@ -3240,6 +3442,7 @@ class _SyncAccountsRequestAccountsItemVariant1(TypedDict, total=False): payment_terms: NotRequired[Literal['net_15', 'net_30', 'net_45', 'net_60', 'net_90', 'prepay']] sandbox: NotRequired[builtins.bool] preferred_reporting_protocol: NotRequired[Literal['s3', 'gcs', 'azure_blob']] + reporting_delivery_configs: NotRequired[builtins.list[_ExternalCoreReportingDeliveryConfig]] notification_configs: NotRequired[builtins.list[_SyncAccountsRequestAccountsItemVariant1NotificationConfigsItem]] class _SyncAccountsRequestAccountsItemVariant2(TypedDict, total=False): @@ -3257,6 +3460,7 @@ class _SyncAccountsRequestAccountsItemVariant2(TypedDict, total=False): payment_terms: NotRequired[Literal['net_15', 'net_30', 'net_45', 'net_60', 'net_90', 'prepay']] sandbox: NotRequired[builtins.bool] preferred_reporting_protocol: NotRequired[Literal['s3', 'gcs', 'azure_blob']] + reporting_delivery_configs: NotRequired[builtins.list[_ExternalCoreReportingDeliveryConfig]] notification_configs: NotRequired[builtins.list[_SyncAccountsRequestAccountsItemVariant2NotificationConfigsItem]] class _SyncAccountsResponseAccountsItem(TypedDict, total=False): @@ -3284,6 +3488,7 @@ class _SyncAccountsResponseAccountsItem(TypedDict, total=False): warnings: NotRequired[builtins.list[builtins.str]] sandbox: NotRequired[builtins.bool] notification_configs: NotRequired[builtins.list[_ExternalCoreNotificationConfig]] + reporting_delivery_configs: NotRequired[builtins.list[_ExternalCoreReportingDeliveryConfigState]] authorization: NotRequired[_ExternalCoreAccountAuthorization] class _SyncAgentNotificationConfigsRequestNotificationConfigsItem(TypedDict, total=False): @@ -3321,6 +3526,7 @@ class _SyncAudiencesRequestAudiencesItem(TypedDict, total=False): tags: NotRequired[builtins.list[builtins.str]] add: NotRequired[builtins.list[_ExternalCoreAudienceMember]] remove: NotRequired[builtins.list[_ExternalCoreAudienceMember]] + source: NotRequired[_SyncAudiencesRequestAudiencesItemSourceVariant1 | _SyncAudiencesRequestAudiencesItemSourceVariant2] delete: NotRequired[builtins.bool] consent_basis: NotRequired[Literal['consent', 'legitimate_interest', 'contract', 'legal_obligation']] @@ -3336,6 +3542,7 @@ class _SyncAudiencesResponseAudiencesItem(TypedDict, total=False): effective_match_rate: NotRequired[builtins.float] match_breakdown: NotRequired[builtins.list[_SyncAudiencesResponseAudiencesItemMatchBreakdownItem]] last_synced_at: NotRequired[builtins.str] + source: NotRequired[_SyncAudiencesResponseAudiencesItemSource] minimum_size: NotRequired[builtins.int] errors: NotRequired[builtins.list[_ExternalCoreError]] @@ -3438,6 +3645,7 @@ class _SyncCreativesRequestCreativesItemVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_SyncCreativesRequestCreativesItemVariant1FormatOptionRefVariant1 | _SyncCreativesRequestCreativesItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_SyncCreativesRequestCreativesItemVariant1InputsItem]] @@ -3449,6 +3657,7 @@ class _SyncCreativesRequestCreativesItemVariant1(TypedDict, total=False): industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] provenance: NotRequired[_ExternalCoreProvenance] rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + revision_id: NotRequired[builtins.str] localization: NotRequired[_ExternalCoreCreativeLocalization | None] class _SyncCreativesRequestCreativesItemVariant2(TypedDict, total=False): @@ -3457,6 +3666,7 @@ class _SyncCreativesRequestCreativesItemVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_SyncCreativesRequestCreativesItemVariant2FormatOptionRefVariant1 | _SyncCreativesRequestCreativesItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_SyncCreativesRequestCreativesItemVariant2InputsItem]] @@ -3468,6 +3678,7 @@ class _SyncCreativesRequestCreativesItemVariant2(TypedDict, total=False): industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] provenance: NotRequired[_ExternalCoreProvenance] rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + revision_id: NotRequired[builtins.str] localization: NotRequired[_ExternalCoreCreativeLocalization | None] class _SyncCreativesRequestAssignmentsItem(TypedDict, total=False): @@ -3498,6 +3709,7 @@ class _SyncCreativesRequestAssignmentOperationsItemVariant3(TypedDict, total=Fal class _SyncCreativesResponseCreativesItem(TypedDict, total=False): creative_id: Required[builtins.str] + revision_id: NotRequired[builtins.str] account: NotRequired[_ExternalCoreAccount] action: Required[Literal['created', 'updated', 'unchanged', 'failed', 'deleted']] status: NotRequired[Literal['processing', 'pending_review', 'approved', 'suspended', 'rejected', 'archived']] @@ -3506,6 +3718,7 @@ class _SyncCreativesResponseCreativesItem(TypedDict, total=False): changes: NotRequired[builtins.list[builtins.str]] errors: NotRequired[builtins.list[_ExternalCoreError]] warnings: NotRequired[builtins.list[builtins.str]] + macro_resolution_results: NotRequired[builtins.list[_ExternalCoreMacroResolutionResult]] preview_url: NotRequired[builtins.str] expires_at: NotRequired[builtins.str] assigned_to: NotRequired[builtins.list[builtins.str]] @@ -3585,6 +3798,36 @@ class _SyncPlansResponsePlansItem(TypedDict, total=False): categories: NotRequired[builtins.list[_SyncPlansResponsePlansItemCategoriesItem]] resolved_policies: NotRequired[builtins.list[_SyncPlansResponsePlansItemResolvedPoliciesItem]] +class _SyncReportingReceiptsRequestReceiptsItem(TypedDict, total=False): + reporting_receipt_id: Required[builtins.str] + reporting_obligation_id: Required[builtins.str] + reporting_revision_id: Required[builtins.str] + reporting_materialization_id: Required[builtins.str] + status: Required[Literal['accepted', 'rejected']] + verification_profile: Required[Literal['native_commit', 'manifest_checksums', 'canonical_digest']] + observed_row_count: Required[builtins.int] + observed_control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + observed_canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + observed_manifest_sha256: NotRequired[builtins.str] + observed_native_version_ref: NotRequired[builtins.str] + consumer_commit_ref: NotRequired[builtins.str] + rejection_codes: NotRequired[builtins.list[builtins.str]] + observed_at: Required[builtins.str] + received_at: NotRequired[builtins.str] + +class _SyncReportingReceiptsResponseResultsItemVariant1(TypedDict, total=False): + result: Required[Literal['recorded']] + receipt: Required[_SyncReportingReceiptsResponseResultsItemVariant1Receipt] + +class _SyncReportingReceiptsResponseResultsItemVariant2(TypedDict, total=False): + result: Required[Literal['unchanged']] + receipt: Required[_SyncReportingReceiptsResponseResultsItemVariant2Receipt] + +class _SyncReportingReceiptsResponseResultsItemVariant3(TypedDict, total=False): + result: Required[Literal['failed']] + reporting_receipt_id: Required[builtins.str] + errors: Required[builtins.list[_ExternalCoreError]] + class _TasksGetRequestAccountVariant1(TypedDict, total=False): account_id: Required[builtins.str] @@ -3893,6 +4136,7 @@ class _ValidateInputRequestManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ValidateInputRequestManifestVariant1FormatOptionRefVariant1 | _ValidateInputRequestManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -3905,6 +4149,7 @@ class _ValidateInputRequestManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ValidateInputRequestManifestVariant2FormatOptionRefVariant1 | _ValidateInputRequestManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -3934,6 +4179,7 @@ class _ExternalCreativeValidateInputResult(TypedDict, total=False): result_kind: Required[Literal['validated_pass', 'validated_fail', 'unvalidatable_nondeterministic']] violations: NotRequired[builtins.list[_ExternalCreativeValidateInputResultViolationsItem]] warnings: NotRequired[builtins.list[_ExternalCreativeValidateInputResultWarningsItem]] + macro_resolution_results: NotRequired[builtins.list[_ExternalCoreMacroResolutionResult]] class _ValidatePropertyDeliveryRequestAccountVariant1(TypedDict, total=False): account_id: Required[builtins.str] @@ -4100,7 +4346,7 @@ class _AcceptProposalResponseAcceptedProposalForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -4195,6 +4441,17 @@ class _BuildCreativeRequestCreativeManifestVariant1FormatOptionRefVariant2(Typed format_option_id: Required[builtins.str] publisher_domain: NotRequired[Never] +class _ExternalCoreRepresentationSelection(TypedDict, total=False): + creative_id: Required[builtins.str] + revision_id: Required[builtins.str] + revision_content_digest: Required[builtins.str] + selected_representation_id: Required[builtins.str] + strategy: Required[Literal['representation_order', 'highest_compatible_vast']] + selected_output_digest: Required[builtins.str] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + resolved_by: Required[Literal['buyer', 'seller']] + class _ExternalCoreRightsConstraint(TypedDict, total=False): rights_id: Required[builtins.str] rights_agent: Required[_ExternalCoreRightsConstraintRightsAgent] @@ -4245,6 +4502,325 @@ class _BuildCreativeRequestCreativeManifestVariant2FormatOptionRefVariant2(Typed format_option_id: Required[builtins.str] publisher_domain: NotRequired[Never] +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1(TypedDict, total=False): + format_id: Required[_ExternalCoreFormatId] + format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] + format_option_ref: NotRequired[_ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1FormatOptionRefVariant1 | _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] + assets: Required[builtins.dict[builtins.str, Any]] + component_assets: NotRequired[builtins.dict[builtins.str, Any]] + brand: NotRequired[_ExternalCoreBrandRef] + rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] + provenance: NotRequired[_ExternalCoreProvenance] + ext: NotRequired[builtins.dict[builtins.str, Any]] + representation_id: Required[builtins.str] + source: Required[_ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1Source] + +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2(TypedDict, total=False): + format_id: NotRequired[_ExternalCoreFormatId] + format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] + format_option_ref: NotRequired[_ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2FormatOptionRefVariant1 | _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] + assets: Required[builtins.dict[builtins.str, Any]] + component_assets: NotRequired[builtins.dict[builtins.str, Any]] + brand: NotRequired[_ExternalCoreBrandRef] + rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] + provenance: NotRequired[_ExternalCoreProvenance] + ext: NotRequired[builtins.dict[builtins.str, Any]] + representation_id: Required[builtins.str] + source: Required[_ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2Source] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['image']] + params: Required[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1 | _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2 | _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3 | _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['html5']] + params: Required[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1 | _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2 | _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3 | _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['display_tag']] + params: Required[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1 | _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2 | _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3 | _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant4(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['image_carousel']] + params: Required[_ExternalFormatsCanonicalImageCarousel] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant5(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['video_hosted']] + params: Required[_ExternalFormatsCanonicalVideoHosted] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant6(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['video_vast']] + params: Required[_ExternalFormatsCanonicalVideoVast] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant7(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['audio_hosted']] + params: Required[_ExternalFormatsCanonicalAudioHosted] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant8(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['audio_daast']] + params: Required[_ExternalFormatsCanonicalAudioDaast] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant9(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['sponsored_placement']] + params: Required[_ExternalFormatsCanonicalSponsoredPlacement] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant10(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['native_in_feed']] + params: Required[_ExternalFormatsCanonicalNativeInFeed] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant11(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['responsive_creative']] + params: Required[_ExternalFormatsCanonicalResponsiveCreative] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant12(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['agent_placement']] + params: Required[_ExternalFormatsCanonicalAgentPlacement] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant13(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['seller_rendered_stateful_display']] + params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant14(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['coordinated_placements']] + params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant15(TypedDict, total=False): + format_option_id: NotRequired[builtins.str] + publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] + display_name: NotRequired[builtins.str] + sample_render_url: NotRequired[builtins.str] + applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] + seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] + locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] + canonical_formats_only: NotRequired[builtins.bool] + experimental: NotRequired[builtins.bool] + format_shape: NotRequired[builtins.str] + v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] + format_schema: NotRequired[_ExternalCorePlatformExtensionRef] + format_kind: Required[Literal['custom']] + params: Required[builtins.dict[builtins.str, Any]] + +class _ExternalCorePlacementRef(TypedDict, total=False): + publisher_domain: NotRequired[builtins.str] + placement_id: Required[builtins.str] + class _BuildCreativeRequestSignalConditionsItemVariant1SignalRefVariant1(TypedDict, total=False): scope: Required[Literal['product']] signal_id: Required[builtins.str] @@ -4601,7 +5177,7 @@ class _BuyProductsResponseAcceptedProposalForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -4675,7 +5251,7 @@ class _ExternalCoreCanonicalProposalForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -4823,10 +5399,13 @@ class _ComplyTestControllerRequestParamsReachWindow(TypedDict, total=False): period: NotRequired[_ComplyTestControllerRequestParamsReachWindowPeriod] class _ComplyTestControllerRequestParamsViewability(TypedDict, total=False): + vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ComplyTestControllerRequestParamsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ComplyTestControllerRequestParamsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreVendorMetricValue(TypedDict, total=False): @@ -4841,10 +5420,12 @@ class _ExternalCoreVendorMetricValue(TypedDict, total=False): class _ComplyTestControllerRequestParamsNotYetMeasurableVendorMetricsItem(TypedDict, total=False): vendor: Required[_ExternalCoreBrandRef] metric_id: Required[builtins.str] + qualifier: NotRequired[_Qualifier] class _ComplyTestControllerRequestParamsNotYetMeasurableVendorMetricsByPackageValueItem(TypedDict, total=False): vendor: Required[_ExternalCoreBrandRef] metric_id: Required[builtins.str] + qualifier: NotRequired[_Qualifier] class _ComplyTestControllerRequestParamsMetricsItem(TypedDict, total=False): metric_id: Required[builtins.str] @@ -4882,6 +5463,7 @@ class _ExternalTrustedMatchOfferCreativeManifestVariant1(TypedDict, total=False) format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalTrustedMatchOfferCreativeManifestVariant1FormatOptionRefVariant1 | _ExternalTrustedMatchOfferCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -4894,6 +5476,7 @@ class _ExternalTrustedMatchOfferCreativeManifestVariant2(TypedDict, total=False) format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalTrustedMatchOfferCreativeManifestVariant2FormatOptionRefVariant1 | _ExternalTrustedMatchOfferCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -5082,7 +5665,7 @@ class _ExternalMediaBuyPackageRequestOptimizationGoalsItemVariant3(TypedDict, to class _ExternalMediaBuyPackageRequestCommittedMetricsItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_ExternalMediaBuyPackageRequestCommittedMetricsItemVariant1Qualifier] class _ExternalMediaBuyPackageRequestCommittedMetricsItemVariant2(TypedDict, total=False): @@ -5097,6 +5680,7 @@ class _ExternalMediaBuyPackageRequestCreativesItemVariant1(TypedDict, total=Fals format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalMediaBuyPackageRequestCreativesItemVariant1FormatOptionRefVariant1 | _ExternalMediaBuyPackageRequestCreativesItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_ExternalMediaBuyPackageRequestCreativesItemVariant1InputsItem]] @@ -5115,6 +5699,7 @@ class _ExternalMediaBuyPackageRequestCreativesItemVariant2(TypedDict, total=Fals format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalMediaBuyPackageRequestCreativesItemVariant2FormatOptionRefVariant1 | _ExternalMediaBuyPackageRequestCreativesItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_ExternalMediaBuyPackageRequestCreativesItemVariant2InputsItem]] @@ -5175,19 +5760,31 @@ class _ExternalCoreAccountReportingBucket(TypedDict, total=False): class _ExternalCoreNotificationConfig(TypedDict, total=False): subscriber_id: Required[builtins.str] url: Required[builtins.str] - event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change']]] + event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change', 'reporting.delivery_ready']]] product_payload_view: NotRequired[Literal['canonical', 'legacy']] authentication: NotRequired[_ExternalCoreNotificationConfigAuthentication] active: NotRequired[builtins.bool] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreReportingDeliveryConfigState(TypedDict, total=False): + configuration: Required[_ExternalCoreReportingDeliveryConfig] + state: Required[Literal['pending_validation', 'pending_setup', 'ready', 'action_required', 'inactive']] + destination_ref: NotRequired[builtins.str] + validated_at: NotRequired[builtins.str] + activated_at: NotRequired[builtins.str] + deactivated_at: NotRequired[builtins.str] + publication_stopped_at: NotRequired[builtins.str] + seller_managed_access_ends_at: NotRequired[builtins.str] + setup: NotRequired[_ExternalCoreReportingDeliveryConfigStateSetup] + issues: NotRequired[builtins.list[_ExternalCoreReportingStatusIssue]] + class _ExternalCoreWebhookActivityRecord(TypedDict, total=False): idempotency_key: Required[builtins.str] notification_id: NotRequired[builtins.str] subscriber_id: NotRequired[builtins.str] fired_at: Required[builtins.str] completed_at: NotRequired[builtins.str | None] - notification_type: Required[Literal['scheduled', 'final', 'delayed', 'adjusted', 'window_update', 'impairment', 'creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change', 'capabilities.changed']] + notification_type: Required[Literal['scheduled', 'final', 'delayed', 'adjusted', 'window_update', 'impairment', 'creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change', 'capabilities.changed', 'reporting.delivery_ready']] sequence_number: NotRequired[builtins.int] attempt: Required[builtins.int] status: Required[Literal['success', 'failed', 'timeout', 'connection_error', 'pending']] @@ -5266,7 +5863,7 @@ class _ExternalCorePackageTargetingResolution(TypedDict, total=False): class _ExternalCorePackageCommittedMetricsItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_ExternalCorePackageCommittedMetricsItemVariant1Qualifier] committed_at: Required[builtins.str] @@ -5280,6 +5877,9 @@ class _ExternalCorePackageCommittedMetricsItemVariant2(TypedDict, total=False): class _ExternalCorePackageFormatsToProvideItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5292,10 +5892,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant1(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image']] params: Required[_ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant1 | _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant2 | _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant3 | _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant1PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5308,10 +5917,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant2(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['html5']] params: Required[_ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant1 | _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant2 | _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant3 | _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant2PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5324,10 +5942,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant3(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['display_tag']] params: Required[_ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant1 | _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant2 | _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant3 | _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant3PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5340,10 +5967,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant4(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image_carousel']] params: Required[_ExternalFormatsCanonicalImageCarousel] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant4PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5356,10 +5992,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant5(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_hosted']] params: Required[_ExternalFormatsCanonicalVideoHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant5PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5372,10 +6017,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant6(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_vast']] params: Required[_ExternalFormatsCanonicalVideoVast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant6PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5388,10 +6042,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant7(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_hosted']] params: Required[_ExternalFormatsCanonicalAudioHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant7PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5404,10 +6067,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant8(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_daast']] params: Required[_ExternalFormatsCanonicalAudioDaast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant8PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5420,10 +6092,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant9(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['sponsored_placement']] params: Required[_ExternalFormatsCanonicalSponsoredPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant9PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5436,10 +6117,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant10(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['native_in_feed']] params: Required[_ExternalFormatsCanonicalNativeInFeed] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant10PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5452,10 +6142,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant11(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['responsive_creative']] params: Required[_ExternalFormatsCanonicalResponsiveCreative] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant11PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5468,10 +6167,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant12(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['agent_placement']] params: Required[_ExternalFormatsCanonicalAgentPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant12PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5484,10 +6192,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant13(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['seller_rendered_stateful_display']] params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant13PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5500,10 +6217,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant14(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['coordinated_placements']] params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant14PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsToProvideItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5516,10 +6242,19 @@ class _ExternalCorePackageFormatsToProvideItemVariant15(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['custom']] params: Required[builtins.dict[builtins.str, Any]] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsToProvideItemVariant15PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5532,10 +6267,19 @@ class _ExternalCorePackageFormatsPendingItemVariant1(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image']] params: Required[_ExternalCorePackageFormatsPendingItemVariant1ParamsVariant1 | _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant2 | _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant3 | _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant1PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5548,10 +6292,19 @@ class _ExternalCorePackageFormatsPendingItemVariant2(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['html5']] params: Required[_ExternalCorePackageFormatsPendingItemVariant2ParamsVariant1 | _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant2 | _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant3 | _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant2PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5564,10 +6317,19 @@ class _ExternalCorePackageFormatsPendingItemVariant3(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['display_tag']] params: Required[_ExternalCorePackageFormatsPendingItemVariant3ParamsVariant1 | _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant2 | _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant3 | _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant3PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5580,10 +6342,19 @@ class _ExternalCorePackageFormatsPendingItemVariant4(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image_carousel']] params: Required[_ExternalFormatsCanonicalImageCarousel] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant4PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5596,10 +6367,19 @@ class _ExternalCorePackageFormatsPendingItemVariant5(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_hosted']] params: Required[_ExternalFormatsCanonicalVideoHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant5PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5612,10 +6392,19 @@ class _ExternalCorePackageFormatsPendingItemVariant6(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_vast']] params: Required[_ExternalFormatsCanonicalVideoVast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant6PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5628,10 +6417,19 @@ class _ExternalCorePackageFormatsPendingItemVariant7(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_hosted']] params: Required[_ExternalFormatsCanonicalAudioHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant7PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5644,10 +6442,19 @@ class _ExternalCorePackageFormatsPendingItemVariant8(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_daast']] params: Required[_ExternalFormatsCanonicalAudioDaast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant8PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5660,10 +6467,19 @@ class _ExternalCorePackageFormatsPendingItemVariant9(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['sponsored_placement']] params: Required[_ExternalFormatsCanonicalSponsoredPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant9PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5676,10 +6492,19 @@ class _ExternalCorePackageFormatsPendingItemVariant10(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['native_in_feed']] params: Required[_ExternalFormatsCanonicalNativeInFeed] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant10PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5692,10 +6517,19 @@ class _ExternalCorePackageFormatsPendingItemVariant11(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['responsive_creative']] params: Required[_ExternalFormatsCanonicalResponsiveCreative] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant11PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5708,10 +6542,19 @@ class _ExternalCorePackageFormatsPendingItemVariant12(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['agent_placement']] params: Required[_ExternalFormatsCanonicalAgentPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant12PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5724,10 +6567,19 @@ class _ExternalCorePackageFormatsPendingItemVariant13(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['seller_rendered_stateful_display']] params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant13PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5740,10 +6592,19 @@ class _ExternalCorePackageFormatsPendingItemVariant14(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['coordinated_placements']] params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant14PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -5756,6 +6617,12 @@ class _ExternalCorePackageFormatsPendingItemVariant15(TypedDict, total=False): format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['custom']] params: Required[builtins.dict[builtins.str, Any]] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_ExternalCorePackageFormatsPendingItemVariant15PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _ExternalCorePackageOptimizationGoalsItemVariant1(TypedDict, total=False): kind: Required[Literal['metric']] @@ -5925,6 +6792,19 @@ class _GetAdcpCapabilitiesResponseMediaBuyProposalRefinement(TypedDict, total=Fa class _GetAdcpCapabilitiesResponseMediaBuyPerformanceFeedback(TypedDict, total=False): reports_application_status: NotRequired[builtins.bool] +class _ExternalCoreReportingDeliveryCapabilities(TypedDict, total=False): + supported: Required[Literal[True]] + configuration_task: Required[Literal['sync_accounts']] + status_task: Required[Literal['get_reporting_status']] + receipt_task: Required[Literal['sync_reporting_receipts']] + readiness_notification: Required[Literal['reporting.delivery_ready']] + offerings: Required[builtins.list[_ExternalCoreReportingDeliveryOffering]] + automated_recovery_window_seconds: Required[builtins.int] + status_retention_days: Required[builtins.int] + resource_retention_days: Required[builtins.int] + supports_webhook_activity: NotRequired[builtins.bool] + authorization_revocation_seconds: Required[builtins.int] + class _GetAdcpCapabilitiesResponseMediaBuyRelationshipNotifications(TypedDict, total=False): supported: Required[Literal[True]] registration_task: Required[Literal['sync_accounts']] @@ -5961,6 +6841,7 @@ class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargeting(TypedDict, total=Fal supports_platform_customer_id: NotRequired[builtins.bool] supported_uid_types: NotRequired[builtins.list[Literal['rampid', 'rampid_derived', 'id5', 'uid2', 'euid', 'pairid', 'maid', 'hashed_email', 'publisher_first_party', 'world_id_nullifier', 'other']]] minimum_audience_size: Required[builtins.int] + supported_activation_methods: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant1 | _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant2 | _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant3 | _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant4 | _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant5 | _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant6]] matching_latency_hours: NotRequired[_GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingMatchingLatencyHours] class _GetAdcpCapabilitiesResponseMediaBuyVendorMetricOptimization(TypedDict, total=False): @@ -6025,6 +6906,10 @@ class _GetAdcpCapabilitiesResponseSponsoredIntelligenceEndpoint(TypedDict, total transports: Required[builtins.list[_GetAdcpCapabilitiesResponseSponsoredIntelligenceEndpointTransportsItem]] preferred: NotRequired[Literal['mcp', 'a2a']] +class _GetAdcpCapabilitiesResponseCreativeRepresentationResolution(TypedDict, total=False): + supported: Required[Literal[True]] + strategies: Required[builtins.list[Literal['representation_order', 'highest_compatible_vast']]] + class _GetAdcpCapabilitiesResponseCreativeMultiplicity(TypedDict, total=False): supports_catalog_fanout: NotRequired[builtins.bool] max_creatives_limit: NotRequired[builtins.int] @@ -6037,7 +6922,7 @@ class _GetAdcpCapabilitiesResponseCreativeMultiplicity(TypedDict, total=False): class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItem(TypedDict, total=False): capability_id: NotRequired[builtins.str] - format: Required[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant4 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant5 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant6 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant7 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant8 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant9 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant10 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant11 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant12 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant13 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant14 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant15] + format: Required[_ExternalCoreCreativeOperationFormatDeclaration] operations: NotRequired[builtins.list[Literal['build', 'validate', 'preview']]] class _GetAdcpCapabilitiesResponseCreativePreview(TypedDict, total=False): @@ -6111,6 +6996,7 @@ class _ExternalCoreDeliveryMetrics(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -6120,6 +7006,7 @@ class _ExternalCoreDeliveryMetrics(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreDeliveryMetricsQuartileData | _ExternalCoreDeliveryMetricsQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreDeliveryMetricsDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreDeliveryMetricsOohMetrics] viewability: NotRequired[_ExternalCoreDeliveryMetricsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -6156,6 +7043,7 @@ class _ExternalCoreCreativeVariant(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreCreativeVariantByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -6165,6 +7053,7 @@ class _ExternalCoreCreativeVariant(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreCreativeVariantQuartileData | _ExternalCoreCreativeVariantQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreCreativeVariantTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreCreativeVariantDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreCreativeVariantOohMetrics] viewability: NotRequired[_ExternalCoreCreativeVariantViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -6180,6 +7069,7 @@ class _ExternalCoreCreativeVariant(TypedDict, total=False): by_action_source: NotRequired[builtins.list[_ExternalCoreCreativeVariantByActionSourceItem]] vendor_metric_values: NotRequired[builtins.list[_ExternalCoreVendorMetricValue]] variant_id: Required[builtins.str] + revision_id: NotRequired[builtins.str] locale_variant_id: NotRequired[builtins.str] manifest: NotRequired[_ExternalCoreCreativeVariantManifestVariant1 | _ExternalCoreCreativeVariantManifestVariant2] generation_context: NotRequired[_ExternalCoreCreativeVariantGenerationContext] @@ -6283,7 +7173,7 @@ class _ExternalCoreAttributionWindowPostView(TypedDict, total=False): class _GetMediaBuyDeliveryResponseAggregatedTotalsMetricAggregatesItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_GetMediaBuyDeliveryResponseAggregatedTotalsMetricAggregatesItemVariant1Qualifier] value: Required[builtins.float] measurable_impressions: NotRequired[builtins.float] @@ -6324,6 +7214,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotals(TypedDict, total= conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -6333,6 +7224,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotals(TypedDict, total= quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -6370,6 +7262,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItem(TypedDict, conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -6379,6 +7272,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItem(TypedDict, quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -6703,6 +7597,9 @@ class _ExternalCoreProductPublisherPropertiesItemVariant3(TypedDict, total=False class _ExternalCoreProductFormatOptionsItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6719,6 +7616,9 @@ class _ExternalCoreProductFormatOptionsItemVariant1(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6735,6 +7635,9 @@ class _ExternalCoreProductFormatOptionsItemVariant2(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6751,6 +7654,9 @@ class _ExternalCoreProductFormatOptionsItemVariant3(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6767,6 +7673,9 @@ class _ExternalCoreProductFormatOptionsItemVariant4(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6783,6 +7692,9 @@ class _ExternalCoreProductFormatOptionsItemVariant5(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6799,6 +7711,9 @@ class _ExternalCoreProductFormatOptionsItemVariant6(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6815,6 +7730,9 @@ class _ExternalCoreProductFormatOptionsItemVariant7(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6831,6 +7749,9 @@ class _ExternalCoreProductFormatOptionsItemVariant8(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6847,6 +7768,9 @@ class _ExternalCoreProductFormatOptionsItemVariant9(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6863,6 +7787,9 @@ class _ExternalCoreProductFormatOptionsItemVariant10(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6879,6 +7806,9 @@ class _ExternalCoreProductFormatOptionsItemVariant11(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6895,6 +7825,9 @@ class _ExternalCoreProductFormatOptionsItemVariant12(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6911,6 +7844,9 @@ class _ExternalCoreProductFormatOptionsItemVariant13(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -6927,6 +7863,9 @@ class _ExternalCoreProductFormatOptionsItemVariant14(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -7079,7 +8018,7 @@ class _ExternalCoreDeliveryForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -7114,7 +8053,7 @@ class _ExternalCoreReportingCapabilities(TypedDict, total=False): expected_delay_minutes: Required[builtins.int] timezone: Required[builtins.str] supports_webhooks: Required[builtins.bool] - available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] vendor_metrics: NotRequired[builtins.list[_ExternalCoreReportingCapabilitiesVendorMetricsItem]] supports_creative_breakdown: NotRequired[builtins.bool] supports_format_breakdown: NotRequired[builtins.bool] @@ -7336,6 +8275,11 @@ class _ExternalCoreProductTrustedMatch(TypedDict, total=False): dynamic_brands: NotRequired[builtins.bool] providers: NotRequired[builtins.list[_ExternalCoreProductTrustedMatchProvidersItem]] +class _ExternalCoreProductAudienceActivation(TypedDict, total=False): + methods: Required[builtins.list[_ExternalCoreProductAudienceActivationMethodsItemVariant1 | _ExternalCoreProductAudienceActivationMethodsItemVariant2 | _ExternalCoreProductAudienceActivationMethodsItemVariant3 | _ExternalCoreProductAudienceActivationMethodsItemVariant4 | _ExternalCoreProductAudienceActivationMethodsItemVariant5 | _ExternalCoreProductAudienceActivationMethodsItemVariant6]] + preferred_method: NotRequired[_ExternalCoreProductAudienceActivationPreferredMethodVariant1 | _ExternalCoreProductAudienceActivationPreferredMethodVariant2 | _ExternalCoreProductAudienceActivationPreferredMethodVariant3 | _ExternalCoreProductAudienceActivationPreferredMethodVariant4 | _ExternalCoreProductAudienceActivationPreferredMethodVariant5 | _ExternalCoreProductAudienceActivationPreferredMethodVariant6] + notes: NotRequired[builtins.str] + class _ExternalCoreProductMaterialSubmission(TypedDict, total=False): url: NotRequired[builtins.str] email: NotRequired[builtins.str] @@ -7378,6 +8322,31 @@ class _ExternalCoreProductFiltersTrustedMatch(TypedDict, total=False): providers: NotRequired[builtins.list[_ExternalCoreProductFiltersTrustedMatchProvidersItem]] response_types: NotRequired[builtins.list[Literal['activation', 'catalog_items', 'creative', 'deal']]] +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant1(TypedDict, total=False): + pattern: Required[Literal['sync_audiences']] + +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant2(TypedDict, total=False): + pattern: Required[Literal['tmp_identity_match']] + buyer_agent: NotRequired[_ExternalCoreProductFiltersAudienceActivationMethodsItemVariant2BuyerAgent] + +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant3(TypedDict, total=False): + pattern: Required[Literal['file_transfer']] + transport: NotRequired[Literal['s3', 'gcs', 'azure_blob']] + directions: NotRequired[builtins.list[Literal['buyer_to_seller', 'seller_to_buyer']]] + vendor: NotRequired[_ExternalCoreBrandRef] + +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant4(TypedDict, total=False): + pattern: Required[Literal['dataset_query']] + vendor: NotRequired[_ExternalCoreBrandRef] + +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant5(TypedDict, total=False): + pattern: Required[Literal['clean_room']] + vendor: NotRequired[_ExternalCoreBrandRef] + +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant6(TypedDict, total=False): + pattern: Required[Literal['platform_distribution']] + vendor: NotRequired[_ExternalCoreBrandRef] + class _ExternalCoreMediaBuyFeatures(TypedDict, total=False): inline_creative_management: NotRequired[builtins.bool] property_list_filtering: NotRequired[builtins.bool] @@ -7647,6 +8616,78 @@ class _GetProductsResponseFilterDiagnosticsExcludedByValue(TypedDict, total=Fals values: NotRequired[builtins.list[builtins.str | builtins.dict[builtins.str, Any]]] notes: NotRequired[builtins.str] +class _GetReportingStatusResponseScopeDeliveryConfigGenerationsItem(TypedDict, total=False): + delivery_config_id: Required[builtins.str] + delivery_config_version: Required[builtins.int] + feed_purpose: Required[Literal['pacing', 'analytics', 'billing']] + +class _ExternalCoreReportingObligationPeriod(TypedDict, total=False): + start: Required[builtins.str] + end: Required[builtins.str] + source_timezone: Required[builtins.str] + +class _ExternalCoreReportingSchedule(TypedDict, total=False): + period_duration: Required[builtins.str] + alignment: Required[Literal['utc', 'account_timezone', 'billing_cycle']] + period_anchor: NotRequired[builtins.str] + period_timezone: NotRequired[builtins.str] + delivery_sla: Required[builtins.str] + +class _ExternalCoreReportingRevisionPeriod(TypedDict, total=False): + start: Required[builtins.str] + end: Required[builtins.str] + source_timezone: Required[builtins.str] + +class _ExternalCoreReportingControlTotal(TypedDict, total=False): + name: Required[builtins.str] + value: Required[builtins.str] + value_type: Required[Literal['integer', 'decimal']] + unit: NotRequired[builtins.str] + +class _ExternalCoreReportingCanonicalContentDigest(TypedDict, total=False): + algorithm: Required[Literal['sha256']] + value: Required[builtins.str] + canonicalization_id: Required[builtins.str] + canonicalization_uri: Required[builtins.str] + canonicalization_sha256: Required[builtins.str] + +class _ExternalCoreReportingResource(TypedDict, total=False): + resource_ref: Required[builtins.str] + kind: Required[Literal['manifest', 'dataset', 'warehouse_relation']] + location: Required[builtins.str] + native_version_ref: NotRequired[builtins.str] + manifest_version: NotRequired[Literal['1.0']] + manifest_sha256: NotRequired[builtins.str] + immutability: Required[Literal['immutable_location', 'native_version']] + expires_at: Required[builtins.str] + reader_compatibility: NotRequired[builtins.list[builtins.str]] + +class _ExternalCoreReportingVerification(TypedDict, total=False): + verified_at: Required[builtins.str] + verification_path: Required[Literal['producer', 'representative_consumer', 'destination']] + verification_profile: Required[Literal['native_commit', 'manifest_checksums', 'canonical_digest']] + row_count: Required[builtins.int] + control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + physical_checksums: NotRequired[builtins.list[_ExternalCoreReportingVerificationPhysicalChecksumsItem]] + native_commit_evidence: NotRequired[_ExternalCoreReportingVerificationNativeCommitEvidence] + +class _GetReportingStatusResponseAdcpErrorIssuesItem(TypedDict, total=False): + pointer: Required[builtins.str] + message: Required[builtins.str] + keyword: Required[builtins.str] + schemaPath: NotRequired[builtins.str] + schema_id: NotRequired[builtins.str] + discriminator: NotRequired[builtins.list[_GetReportingStatusResponseAdcpErrorIssuesItemDiscriminatorItem]] + +class _GetReportingStatusResponseAdcpError2IssuesItem(TypedDict, total=False): + pointer: Required[builtins.str] + message: Required[builtins.str] + keyword: Required[builtins.str] + schemaPath: NotRequired[builtins.str] + schema_id: NotRequired[builtins.str] + discriminator: NotRequired[builtins.list[_GetReportingStatusResponseAdcpError2IssuesItemDiscriminatorItem]] + class _GetRightsResponseRightsItemExclusivityStatus(TypedDict, total=False): available: NotRequired[builtins.bool] existing_exclusives: NotRequired[builtins.list[builtins.str]] @@ -8187,6 +9228,9 @@ class _ExternalCoreCanonicalProjectionRef(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8203,6 +9247,9 @@ class _ExternalCoreFormatCanonicalParametersVariant1(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8219,6 +9266,9 @@ class _ExternalCoreFormatCanonicalParametersVariant2(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8235,6 +9285,9 @@ class _ExternalCoreFormatCanonicalParametersVariant3(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8251,6 +9304,9 @@ class _ExternalCoreFormatCanonicalParametersVariant4(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8267,6 +9323,9 @@ class _ExternalCoreFormatCanonicalParametersVariant5(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8283,6 +9342,9 @@ class _ExternalCoreFormatCanonicalParametersVariant6(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8299,6 +9361,9 @@ class _ExternalCoreFormatCanonicalParametersVariant7(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8315,6 +9380,9 @@ class _ExternalCoreFormatCanonicalParametersVariant8(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8331,6 +9399,9 @@ class _ExternalCoreFormatCanonicalParametersVariant9(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8347,6 +9418,9 @@ class _ExternalCoreFormatCanonicalParametersVariant10(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8363,6 +9437,9 @@ class _ExternalCoreFormatCanonicalParametersVariant11(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8379,6 +9456,9 @@ class _ExternalCoreFormatCanonicalParametersVariant12(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8395,6 +9475,9 @@ class _ExternalCoreFormatCanonicalParametersVariant13(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8411,6 +9494,9 @@ class _ExternalCoreFormatCanonicalParametersVariant14(TypedDict, total=False): class _ExternalCoreFormatCanonicalParametersVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8674,7 +9760,7 @@ class _ExternalCoreProductOfferFilters(TypedDict, total=False): trusted_match: NotRequired[_ExternalCoreProductOfferFiltersTrustedMatch] required_features: NotRequired[_ExternalCoreProductOfferFiltersRequiredFeatures] required_performance_standards: NotRequired[builtins.list[_ExternalCoreProductOfferFiltersRequiredPerformanceStandardsItem]] - required_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + required_metrics: NotRequired[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] required_vendor_metrics: NotRequired[builtins.list[_ExternalCoreProductOfferFiltersRequiredVendorMetricsItem]] audience_evidence_requirements: NotRequired[_ExternalCoreProductAudienceEvidenceRequirements] ext: NotRequired[builtins.dict[builtins.str, Any]] @@ -8711,6 +9797,9 @@ class _ExternalCoreCanonicalProductPublisherPropertiesItemVariant3(TypedDict, to class _ExternalCoreCanonicalFormatOption(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8742,7 +9831,7 @@ class _ExternalCoreCanonicalDeliveryForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -8755,7 +9844,7 @@ class _ExternalCoreCanonicalReportingCapabilities(TypedDict, total=False): expected_delay_minutes: Required[builtins.int] timezone: Required[builtins.str] supports_webhooks: Required[builtins.bool] - available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] vendor_metrics: NotRequired[builtins.list[_ExternalCoreCanonicalReportingCapabilitiesVendorMetricsItem]] supports_creative_breakdown: NotRequired[builtins.bool] supports_format_breakdown: NotRequired[builtins.bool] @@ -8837,6 +9926,9 @@ class _ExternalCoreTransformerVoiceSynthesisRefItem(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8853,6 +9945,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant1(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8869,6 +9964,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant2(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8885,6 +9983,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant3(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8901,6 +10002,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant4(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8917,6 +10021,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant5(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8933,6 +10040,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant6(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8949,6 +10059,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant7(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8965,6 +10078,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant8(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8981,6 +10097,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant9(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -8997,6 +10116,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant10(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -9013,6 +10135,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant11(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -9029,6 +10154,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant12(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -9045,6 +10173,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant13(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -9061,6 +10192,9 @@ class _ExternalCoreTransformerInputFormatsItemVariant14(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -9187,7 +10321,7 @@ class _MediaBuyCommitmentResponseAcceptedProposalForecast(TypedDict, total=False forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -9289,10 +10423,6 @@ class _PackageRequestCommittedMetricsItemVariant2Qualifier(TypedDict, total=Fals attribution_window: NotRequired[_ExternalCoreDuration] lift_dimension: NotRequired[Literal['awareness', 'consideration', 'favorability', 'purchase_intent', 'ad_recall']] -class _ExternalCorePlacementRef(TypedDict, total=False): - publisher_domain: NotRequired[builtins.str] - placement_id: Required[builtins.str] - class _PackageRequestCreativesItemVariant1FormatOptionRefVariant1(TypedDict, total=False): scope: Required[Literal['publisher']] publisher_domain: Required[builtins.str] @@ -9347,6 +10477,7 @@ class _PreviewCreativeRequestRequestsItemCreativeManifestVariant1(TypedDict, tot format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeRequestRequestsItemCreativeManifestVariant1FormatOptionRefVariant1 | _PreviewCreativeRequestRequestsItemCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -9359,6 +10490,7 @@ class _PreviewCreativeRequestRequestsItemCreativeManifestVariant2(TypedDict, tot format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_PreviewCreativeRequestRequestsItemCreativeManifestVariant2FormatOptionRefVariant1 | _PreviewCreativeRequestRequestsItemCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -9560,7 +10692,7 @@ class _RequestProposalsResponseProposalsItemForecast(TypedDict, total=False): forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -9675,10 +10807,25 @@ class _ExternalCoreOperatorIdentity(TypedDict, total=False): operator: Required[builtins.str] operator_unit: NotRequired[_ExternalCoreOperatorUnit] +class _ExternalCoreReportingDeliveryConfig(TypedDict, total=False): + delivery_config_id: Required[builtins.str] + delivery_config_version: Required[builtins.int] + offering_id: Required[builtins.str] + active: Required[builtins.bool] + feed_purpose: Required[Literal['pacing', 'analytics', 'billing']] + report_definition_id: Required[builtins.str] + reporting_profile: Required[builtins.str] + scope: Required[_ExternalCoreReportingDeliveryConfigScope] + required_finality: Required[Literal['snapshot', 'official']] + reconciliation_mode: Required[Literal['delivery_only', 'consumer_receipt']] + schedule: Required[_ExternalCoreReportingSchedule] + method: Required[_ExternalCoreReportingDeliveryConfigMethodVariant1 | _ExternalCoreReportingDeliveryConfigMethodVariant2 | _ExternalCoreReportingDeliveryConfigMethodVariant3] + revocation_effective_at: NotRequired[builtins.str] + class _SyncAccountsRequestAccountsItemVariant1NotificationConfigsItem(TypedDict, total=False): subscriber_id: Required[builtins.str] url: Required[builtins.str] - event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change']]] + event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change', 'reporting.delivery_ready']]] product_payload_view: NotRequired[Literal['canonical', 'legacy']] authentication: NotRequired[_SyncAccountsRequestAccountsItemVariant1NotificationConfigsItemAuthentication] active: NotRequired[builtins.bool] @@ -9698,7 +10845,7 @@ class _SyncAccountsRequestAccountsItemVariant2AccountVariant2(TypedDict, total=F class _SyncAccountsRequestAccountsItemVariant2NotificationConfigsItem(TypedDict, total=False): subscriber_id: Required[builtins.str] url: Required[builtins.str] - event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change']]] + event_types: Required[builtins.list[Literal['creative.status_changed', 'creative.assignment_changed', 'indicators.changed', 'creative.purged', 'account.status_changed', 'product.created', 'product.updated', 'product.priced', 'product.removed', 'signal.created', 'signal.updated', 'signal.priced', 'signal.removed', 'wholesale_feed.bulk_change', 'reporting.delivery_ready']]] product_payload_view: NotRequired[Literal['canonical', 'legacy']] authentication: NotRequired[_SyncAccountsRequestAccountsItemVariant2NotificationConfigsItemAuthentication] active: NotRequired[builtins.bool] @@ -9755,12 +10902,31 @@ class _ExternalCoreAudienceMember(TypedDict, total=False): uids: NotRequired[builtins.list[_ExternalCoreAudienceMemberUidsItem]] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _SyncAudiencesRequestAudiencesItemSourceVariant1(TypedDict, total=False): + kind: Required[Literal['dataset']] + vendor: Required[_ExternalCoreBrandRef] + locator: Required[builtins.str] + access_expires_at: NotRequired[builtins.str] + +class _SyncAudiencesRequestAudiencesItemSourceVariant2(TypedDict, total=False): + kind: Required[Literal['platform_segment']] + vendor: Required[_ExternalCoreBrandRef] + segment_ref: Required[builtins.str] + class _SyncAudiencesResponseAudiencesItemMatchBreakdownItem(TypedDict, total=False): id_type: Required[Literal['hashed_email', 'hashed_phone', 'rampid', 'id5', 'uid2', 'euid', 'pairid', 'maid', 'other']] submitted: Required[builtins.int] matched: Required[builtins.int] match_rate: Required[builtins.float] +class _SyncAudiencesResponseAudiencesItemSource(TypedDict, total=False): + kind: Required[Literal['dataset', 'platform_segment']] + vendor: Required[_ExternalCoreBrandRef] + locator: NotRequired[builtins.str] + segment_ref: NotRequired[builtins.str] + columns_read: NotRequired[builtins.list[builtins.str]] + access_status: NotRequired[Literal['active', 'unavailable']] + class _SyncCatalogsResponseCatalogsItemItemIssuesItem(TypedDict, total=False): item_id: Required[builtins.str] status: Required[Literal['approved', 'pending', 'rejected', 'warning', 'withdrawn']] @@ -9823,6 +10989,26 @@ class _SyncCreativesRequestCreativesItemVariant2InputsItem(TypedDict, total=Fals macros: NotRequired[builtins.dict[builtins.str, builtins.str]] context_description: NotRequired[builtins.str] +class _ExternalCoreMacroResolutionResult(TypedDict, total=False): + declaration_id: Required[builtins.str] + asset_path: Required[builtins.str] + token: Required[builtins.str] + dialect: Required[Literal['adcp', 'iab_vast', 'iab_daast', 'vendor', 'unknown']] + dialect_namespace: NotRequired[builtins.str] + dialect_revision: NotRequired[builtins.str] + dialect_semantic: Required[builtins.str] + mapping_status: Required[Literal['verified_universal', 'dialect_defined', 'unresolved']] + universal_semantic: NotRequired[Literal['MEDIA_BUY_ID', 'PACKAGE_ID', 'CREATIVE_ID', 'CACHEBUSTER', 'TIMESTAMP', 'CLICK_URL', 'GDPR', 'GDPR_CONSENT', 'US_PRIVACY', 'GPP_STRING', 'GPP_SID', 'IP_ADDRESS', 'LIMIT_AD_TRACKING', 'DEVICE_TYPE', 'OS', 'OS_VERSION', 'DEVICE_MAKE', 'DEVICE_MODEL', 'USER_AGENT', 'APP_BUNDLE', 'APP_NAME', 'COUNTRY', 'REGION', 'CITY', 'ZIP', 'DMA', 'LAT', 'LONG', 'DEVICE_ID', 'DEVICE_ID_TYPE', 'DOMAIN', 'PAGE_URL', 'REFERRER', 'KEYWORDS', 'PLACEMENT_ID', 'FOLD_POSITION', 'AD_WIDTH', 'AD_HEIGHT', 'VIDEO_ID', 'VIDEO_TITLE', 'VIDEO_DURATION', 'VIDEO_CATEGORY', 'CONTENT_GENRE', 'CONTENT_RATING', 'PLAYER_WIDTH', 'PLAYER_HEIGHT', 'POD_POSITION', 'POD_SIZE', 'AD_BREAK_ID', 'STATION_ID', 'COLLECTION_NAME', 'INSTALLMENT_ID', 'AUDIO_DURATION', 'TMPX', 'IMPRESSION_ID', 'AXEM', 'CATALOG_ID', 'SKU', 'GTIN', 'OFFERING_ID', 'JOB_ID', 'HOTEL_ID', 'FLIGHT_ID', 'VEHICLE_ID', 'LISTING_ID', 'STORE_ID', 'PROGRAM_ID', 'DESTINATION_ID', 'CREATIVE_VARIANT_ID', 'APP_ITEM_ID', 'ITEM_NAME', 'ITEM_DESCRIPTION', 'ITEM_TAGLINE', 'ITEM_PRICE', 'ITEM_PRICE_CURRENCY']] + operation: Required[Literal['translate_to_native', 'resolve_value', 'preserve']] + performed_by: NotRequired[Literal['buyer', 'creative_agent', 'seller', 'request_executor', 'source_ad_server']] + requested_encoding: Required[_ExternalCoreMacroEncoding] + required: Required[builtins.bool] + unavailable_behavior: Required[Literal['preserve', 'omit_parameter', 'dialect_sentinel', 'reject']] + status: Required[Literal['resolvable', 'preserved_for_downstream', 'unsupported', 'ambiguous']] + reason: Required[Literal['capability_match', 'preserved_unknown', 'preserved_for_downstream', 'dialect_unsupported', 'namespace_mismatch', 'revision_mismatch', 'semantic_unsupported', 'operation_unsupported', 'resolver_mismatch', 'context_unsupported', 'encoding_unsupported', 'ambiguous_mapping']] + matched_encodings: NotRequired[builtins.list[_ExternalCoreMacroEncoding]] + message: NotRequired[builtins.str] + class _SyncEventSourcesResponseEventSourcesItemSetup(TypedDict, total=False): snippet: NotRequired[builtins.str] snippet_type: NotRequired[Literal['javascript', 'html', 'pixel_url', 'server_only']] @@ -9920,6 +11106,40 @@ class _SyncPlansResponsePlansItemResolvedPoliciesItem(TypedDict, total=False): enforcement: Required[Literal['must', 'should', 'may']] reason: NotRequired[builtins.str] +class _SyncReportingReceiptsResponseResultsItemVariant1Receipt(TypedDict, total=False): + reporting_receipt_id: Required[builtins.str] + reporting_obligation_id: Required[builtins.str] + reporting_revision_id: Required[builtins.str] + reporting_materialization_id: Required[builtins.str] + status: Required[Literal['accepted', 'rejected']] + verification_profile: Required[Literal['native_commit', 'manifest_checksums', 'canonical_digest']] + observed_row_count: Required[builtins.int] + observed_control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + observed_canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + observed_manifest_sha256: NotRequired[builtins.str] + observed_native_version_ref: NotRequired[builtins.str] + consumer_commit_ref: NotRequired[builtins.str] + rejection_codes: NotRequired[builtins.list[builtins.str]] + observed_at: Required[builtins.str] + received_at: Required[builtins.str] + +class _SyncReportingReceiptsResponseResultsItemVariant2Receipt(TypedDict, total=False): + reporting_receipt_id: Required[builtins.str] + reporting_obligation_id: Required[builtins.str] + reporting_revision_id: Required[builtins.str] + reporting_materialization_id: Required[builtins.str] + status: Required[Literal['accepted', 'rejected']] + verification_profile: Required[Literal['native_commit', 'manifest_checksums', 'canonical_digest']] + observed_row_count: Required[builtins.int] + observed_control_totals: Required[builtins.list[_ExternalCoreReportingControlTotal]] + observed_canonical_content_digest: NotRequired[_ExternalCoreReportingCanonicalContentDigest] + observed_manifest_sha256: NotRequired[builtins.str] + observed_native_version_ref: NotRequired[builtins.str] + consumer_commit_ref: NotRequired[builtins.str] + rejection_codes: NotRequired[builtins.list[builtins.str]] + observed_at: Required[builtins.str] + received_at: Required[builtins.str] + class _TasksGetRequestAccountVariant2Brand(TypedDict, total=False): domain: Required[builtins.str] brand_id: NotRequired[builtins.str] @@ -10073,6 +11293,7 @@ class _ExternalMediaBuyPackageUpdateCreativesItemVariant1(TypedDict, total=False format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalMediaBuyPackageUpdateCreativesItemVariant1FormatOptionRefVariant1 | _ExternalMediaBuyPackageUpdateCreativesItemVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_ExternalMediaBuyPackageUpdateCreativesItemVariant1InputsItem]] @@ -10091,6 +11312,7 @@ class _ExternalMediaBuyPackageUpdateCreativesItemVariant2(TypedDict, total=False format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalMediaBuyPackageUpdateCreativesItemVariant2FormatOptionRefVariant1 | _ExternalMediaBuyPackageUpdateCreativesItemVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] inputs: NotRequired[builtins.list[_ExternalMediaBuyPackageUpdateCreativesItemVariant2InputsItem]] @@ -10464,173 +11686,951 @@ class _ExternalCoreProvenanceVerificationItem(TypedDict, total=False): confidence: NotRequired[builtins.float] details_url: NotRequired[builtins.str] -class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['url']] - preview_url: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['html']] - preview_html: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['both']] - preview_url: Required[builtins.str] - preview_html: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreviewPreviewsItemInput(TypedDict, total=False): - name: Required[builtins.str] - macros: NotRequired[builtins.dict[builtins.str, builtins.str]] - context_description: NotRequired[builtins.str] - -class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['url']] - preview_url: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['html']] - preview_html: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3(TypedDict, total=False): - render_id: Required[builtins.str] - output_format: Required[Literal['both']] - preview_url: Required[builtins.str] - preview_html: Required[builtins.str] - role: Required[builtins.str] - dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3Dimensions] - embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3Embedding] - renderer: NotRequired[_ExternalCorePreviewRendererMetadata] - -class _BuildCreativeResponsePreview2PreviewsItemInput(TypedDict, total=False): - name: Required[builtins.str] - macros: NotRequired[builtins.dict[builtins.str, builtins.str]] - context_description: NotRequired[builtins.str] +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1FormatOptionRefVariant1(TypedDict, total=False): + scope: Required[Literal['publisher']] + publisher_domain: Required[builtins.str] + format_option_id: Required[builtins.str] -class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant1(TypedDict, total=False): +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1FormatOptionRefVariant2(TypedDict, total=False): scope: Required[Literal['product']] - signal_id: Required[builtins.str] - -class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant2(TypedDict, total=False): - scope: Required[Literal['data_provider']] - data_provider_domain: Required[builtins.str] - signal_id: Required[builtins.str] - -class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant3(TypedDict, total=False): - scope: Required[Literal['signal_source']] - signal_source_url: Required[builtins.str] - signal_id: Required[builtins.str] + format_option_id: Required[builtins.str] + publisher_domain: NotRequired[Never] -class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalIdVariant1(TypedDict, total=False): - source: Required[Literal['catalog']] - data_provider_domain: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant1Source(TypedDict, total=False): + system: Required[builtins.str] + source_representation: Required[builtins.str] + source_id: NotRequired[builtins.str] -class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalIdVariant2(TypedDict, total=False): - source: Required[Literal['agent']] - agent_url: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2FormatOptionRefVariant1(TypedDict, total=False): + scope: Required[Literal['publisher']] + publisher_domain: Required[builtins.str] + format_option_id: Required[builtins.str] -class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant1(TypedDict, total=False): +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2FormatOptionRefVariant2(TypedDict, total=False): scope: Required[Literal['product']] - signal_id: Required[builtins.str] + format_option_id: Required[builtins.str] + publisher_domain: NotRequired[Never] -class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant2(TypedDict, total=False): - scope: Required[Literal['data_provider']] - data_provider_domain: Required[builtins.str] - signal_id: Required[builtins.str] +class _ExternalCoreCreativeRepresentationSetRepresentationsItemVariant2Source(TypedDict, total=False): + system: Required[builtins.str] + source_representation: Required[builtins.str] + source_id: NotRequired[builtins.str] + +class _ExternalCoreTrackerExecutionContract(TypedDict, total=False): + complete: Required[builtins.bool] + honored: Required[builtins.list[_ExternalCoreTrackerExecutionContractHonoredItemVariant1 | _ExternalCoreTrackerExecutionContractHonoredItemVariant2 | _ExternalCoreTrackerExecutionContractHonoredItemVariant3]] + +class _ExternalCoreMacroResolutionCapability(TypedDict, total=False): + dialect: Required[Literal['adcp', 'iab_vast', 'iab_daast', 'vendor', 'unknown']] + dialect_namespace: NotRequired[builtins.str] + dialect_revision: NotRequired[builtins.str] + dialect_semantic: Required[builtins.str] + mapping_status: Required[Literal['verified_universal', 'dialect_defined']] + universal_semantic: NotRequired[Literal['MEDIA_BUY_ID', 'PACKAGE_ID', 'CREATIVE_ID', 'CACHEBUSTER', 'TIMESTAMP', 'CLICK_URL', 'GDPR', 'GDPR_CONSENT', 'US_PRIVACY', 'GPP_STRING', 'GPP_SID', 'IP_ADDRESS', 'LIMIT_AD_TRACKING', 'DEVICE_TYPE', 'OS', 'OS_VERSION', 'DEVICE_MAKE', 'DEVICE_MODEL', 'USER_AGENT', 'APP_BUNDLE', 'APP_NAME', 'COUNTRY', 'REGION', 'CITY', 'ZIP', 'DMA', 'LAT', 'LONG', 'DEVICE_ID', 'DEVICE_ID_TYPE', 'DOMAIN', 'PAGE_URL', 'REFERRER', 'KEYWORDS', 'PLACEMENT_ID', 'FOLD_POSITION', 'AD_WIDTH', 'AD_HEIGHT', 'VIDEO_ID', 'VIDEO_TITLE', 'VIDEO_DURATION', 'VIDEO_CATEGORY', 'CONTENT_GENRE', 'CONTENT_RATING', 'PLAYER_WIDTH', 'PLAYER_HEIGHT', 'POD_POSITION', 'POD_SIZE', 'AD_BREAK_ID', 'STATION_ID', 'COLLECTION_NAME', 'INSTALLMENT_ID', 'AUDIO_DURATION', 'TMPX', 'IMPRESSION_ID', 'AXEM', 'CATALOG_ID', 'SKU', 'GTIN', 'OFFERING_ID', 'JOB_ID', 'HOTEL_ID', 'FLIGHT_ID', 'VEHICLE_ID', 'LISTING_ID', 'STORE_ID', 'PROGRAM_ID', 'DESTINATION_ID', 'CREATIVE_VARIANT_ID', 'APP_ITEM_ID', 'ITEM_NAME', 'ITEM_DESCRIPTION', 'ITEM_TAGLINE', 'ITEM_PRICE', 'ITEM_PRICE_CURRENCY']] + operation: Required[Literal['translate_to_native', 'resolve_value']] + performed_by: Required[Literal['buyer', 'creative_agent', 'seller', 'request_executor', 'source_ad_server']] + supported_contexts: Required[builtins.list[Literal['url_query_value', 'url_path_segment', 'opaque']]] + supported_encodings: NotRequired[builtins.list[_ExternalCoreMacroEncoding]] + translation_target: NotRequired[_ExternalCoreMacroTranslationTarget] -class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant3(TypedDict, total=False): - scope: Required[Literal['signal_source']] - signal_source_url: Required[builtins.str] - signal_id: Required[builtins.str] +class _ExternalCoreCreativeLocalePolicy(TypedDict, total=False): + accepted_language_ranges: Required[builtins.list[builtins.str]] -class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalIdVariant1(TypedDict, total=False): - source: Required[Literal['catalog']] - data_provider_domain: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCorePlatformExtensionRef(TypedDict, total=False): + uri: Required[builtins.str] + digest: Required[builtins.str] -class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalIdVariant2(TypedDict, total=False): - source: Required[Literal['agent']] - agent_url: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + motion_level: NotRequired[Literal['static', 'limited_motion']] + width: Required[builtins.int] + height: Required[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1SizesItem]] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + aspect_ratio: NotRequired[builtins.str] + max_file_size_kb: NotRequired[builtins.int] + image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] + ssl_required: NotRequired[builtins.bool] + headline_max_chars: NotRequired[builtins.int] + body_text_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] -class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant1(TypedDict, total=False): - scope: Required[Literal['product']] - signal_id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + motion_level: NotRequired[Literal['static', 'limited_motion']] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: Required[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2SizesItem]] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + aspect_ratio: NotRequired[builtins.str] + max_file_size_kb: NotRequired[builtins.int] + image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] + ssl_required: NotRequired[builtins.bool] + headline_max_chars: NotRequired[builtins.int] + body_text_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] -class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant2(TypedDict, total=False): - scope: Required[Literal['data_provider']] - data_provider_domain: Required[builtins.str] - signal_id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + motion_level: NotRequired[Literal['static', 'limited_motion']] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3SizesItem]] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + aspect_ratio: NotRequired[builtins.str] + max_file_size_kb: NotRequired[builtins.int] + image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] + ssl_required: NotRequired[builtins.bool] + headline_max_chars: NotRequired[builtins.int] + body_text_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] -class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant3(TypedDict, total=False): - scope: Required[Literal['signal_source']] - signal_source_url: Required[builtins.str] - signal_id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + motion_level: NotRequired[Literal['static', 'limited_motion']] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4SizesItem]] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + aspect_ratio: NotRequired[builtins.str] + max_file_size_kb: NotRequired[builtins.int] + image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] + ssl_required: NotRequired[builtins.bool] + headline_max_chars: NotRequired[builtins.int] + body_text_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] -class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalIdVariant1(TypedDict, total=False): - source: Required[Literal['catalog']] - data_provider_domain: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: Required[builtins.int] + height: Required[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + max_initial_load_kb: NotRequired[builtins.int] + max_polite_load_kb: NotRequired[builtins.int] + host_initiated_subload: NotRequired[builtins.bool] + max_animation_duration_ms: NotRequired[builtins.int] + max_cpu_load_percent: NotRequired[builtins.int] + mraid_required: NotRequired[builtins.bool] + mraid_version: NotRequired[Literal['2.0', '3.0']] + om_sdk_required: NotRequired[builtins.bool] + clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] -class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalIdVariant2(TypedDict, total=False): - source: Required[Literal['agent']] - agent_url: Required[builtins.str] - id: Required[builtins.str] +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: Required[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + max_initial_load_kb: NotRequired[builtins.int] + max_polite_load_kb: NotRequired[builtins.int] + host_initiated_subload: NotRequired[builtins.bool] + max_animation_duration_ms: NotRequired[builtins.int] + max_cpu_load_percent: NotRequired[builtins.int] + mraid_required: NotRequired[builtins.bool] + mraid_version: NotRequired[Literal['2.0', '3.0']] + om_sdk_required: NotRequired[builtins.bool] + clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] -class _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1(TypedDict, total=False): - format_id: Required[_ExternalCoreFormatId] - format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] - format_option_ref: NotRequired[_BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1FormatOptionRefVariant1 | _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1FormatOptionRefVariant2] - assets: Required[builtins.dict[builtins.str, Any]] - component_assets: NotRequired[builtins.dict[builtins.str, Any]] - brand: NotRequired[_ExternalCoreBrandRef] - rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] - industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] - provenance: NotRequired[_ExternalCoreProvenance] - ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + max_initial_load_kb: NotRequired[builtins.int] + max_polite_load_kb: NotRequired[builtins.int] + host_initiated_subload: NotRequired[builtins.bool] + max_animation_duration_ms: NotRequired[builtins.int] + max_cpu_load_percent: NotRequired[builtins.int] + mraid_required: NotRequired[builtins.bool] + mraid_version: NotRequired[Literal['2.0', '3.0']] + om_sdk_required: NotRequired[builtins.bool] + clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] -class _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2(TypedDict, total=False): - format_id: NotRequired[_ExternalCoreFormatId] - format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] - format_option_ref: NotRequired[_BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2FormatOptionRefVariant1 | _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2FormatOptionRefVariant2] - assets: Required[builtins.dict[builtins.str, Any]] - component_assets: NotRequired[builtins.dict[builtins.str, Any]] - brand: NotRequired[_ExternalCoreBrandRef] - rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] - industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] - provenance: NotRequired[_ExternalCoreProvenance] - ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + max_initial_load_kb: NotRequired[builtins.int] + max_polite_load_kb: NotRequired[builtins.int] + host_initiated_subload: NotRequired[builtins.bool] + max_animation_duration_ms: NotRequired[builtins.int] + max_cpu_load_percent: NotRequired[builtins.int] + mraid_required: NotRequired[builtins.bool] + mraid_version: NotRequired[Literal['2.0', '3.0']] + om_sdk_required: NotRequired[builtins.bool] + clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] -class _BuildCreativeResponseCreativesItemVariantsItemEval(TypedDict, total=False): - features: NotRequired[builtins.list[_ExternalCreativeCreativeFeatureResult]] - ranked_against: NotRequired[builtins.int] - calls_used: NotRequired[builtins.int] - seconds_used: NotRequired[builtins.float] +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: Required[builtins.int] + height: Required[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] + ssl_required: NotRequired[builtins.bool] + max_redirect_depth: NotRequired[builtins.int] + max_response_time_ms: NotRequired[builtins.int] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + om_sdk_required: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: Required[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] + ssl_required: NotRequired[builtins.bool] + max_redirect_depth: NotRequired[builtins.int] + max_response_time_ms: NotRequired[builtins.int] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + om_sdk_required: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] + ssl_required: NotRequired[builtins.bool] + max_redirect_depth: NotRequired[builtins.int] + max_response_time_ms: NotRequired[builtins.int] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + om_sdk_required: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4SlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + width: NotRequired[builtins.int] + height: NotRequired[builtins.int] + sizes: NotRequired[builtins.list[_ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4SizesItem]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] + ssl_required: NotRequired[builtins.bool] + max_redirect_depth: NotRequired[builtins.int] + max_response_time_ms: NotRequired[builtins.int] + backup_image_required: NotRequired[builtins.bool] + backup_image_max_size_kb: NotRequired[builtins.int] + om_sdk_required: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalImageCarousel(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalImageCarouselSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + card_aspect_ratio: NotRequired[builtins.str] + min_cards: NotRequired[builtins.int] + max_cards: NotRequired[builtins.int] + allowed_card_media_asset_types: NotRequired[builtins.list[Literal['image', 'video']]] + allowed_card_asset_types: NotRequired[builtins.list[Literal['image', 'video']]] + card_image_max_file_size_kb: NotRequired[builtins.int] + card_video_max_file_size_kb: NotRequired[builtins.int] + card_video_max_duration_ms: NotRequired[builtins.int] + primary_text_max_chars: NotRequired[builtins.int] + card_headline_max_chars: NotRequired[builtins.int] + card_description_max_chars: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalVideoHosted(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalVideoHostedSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + orientation: NotRequired[Literal['vertical', 'horizontal', 'square']] + aspect_ratio: NotRequired[builtins.str] + min_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + duration_ms_range: NotRequired[builtins.list[builtins.int | None]] + duration_ms_exact: NotRequired[builtins.int] + video_codecs: NotRequired[builtins.list[Literal['h264', 'h265', 'vp8', 'vp9', 'av1', 'prores']]] + audio_codecs: NotRequired[builtins.list[Literal['aac', 'mp3', 'opus', 'pcm']]] + containers: NotRequired[builtins.list[Literal['mp4', 'webm', 'mov']]] + min_bitrate_kbps: NotRequired[builtins.int] + max_bitrate_kbps: NotRequired[builtins.int] + max_file_size_mb: NotRequired[builtins.int] + frame_rates: NotRequired[builtins.list[builtins.float]] + captions: NotRequired[Literal['required', 'recommended', 'not_required']] + om_sdk_required: NotRequired[builtins.bool] + headline_max_chars: NotRequired[builtins.int] + primary_text_max_chars: NotRequired[builtins.int] + brand_name_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + companion_banner_widths: NotRequired[builtins.list[builtins.int]] + companion_banner_heights: NotRequired[builtins.list[builtins.int]] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + +class _ExternalFormatsCanonicalVideoVast(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalVideoVastSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + orientation: NotRequired[Literal['vertical', 'horizontal', 'square']] + aspect_ratio: NotRequired[builtins.str] + vast_versions: NotRequired[builtins.list[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']]] + vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + media_file_requirements: NotRequired[_ExternalCoreVastMediaFileRequirements] + vpaid_enabled: NotRequired[builtins.bool] + vpaid_version: NotRequired[Literal['1.0', '2.0']] + simid_supported: NotRequired[builtins.bool] + duration_ms_range: NotRequired[builtins.list[builtins.int]] + duration_ms_exact: NotRequired[builtins.int] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + creative_type: NotRequired[Literal['linear', 'nonlinear', 'either']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + motion_level: NotRequired[Literal['static', 'limited_motion', 'full_motion']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] + linear_required: NotRequired[builtins.bool] + skippable_after_ms: NotRequired[builtins.int] + max_wrapper_depth: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalAudioHosted(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAudioHostedSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + duration_ms_range: NotRequired[builtins.list[builtins.int | None]] + duration_ms_exact: NotRequired[builtins.int] + audio_codecs: NotRequired[builtins.list[Literal['mp3', 'aac', 'wav', 'opus', 'flac']]] + audio_sample_rates: NotRequired[builtins.list[builtins.int]] + audio_channels: NotRequired[builtins.list[Literal['mono', 'stereo']]] + min_bitrate_kbps: NotRequired[builtins.int] + max_bitrate_kbps: NotRequired[builtins.int] + max_file_size_mb: NotRequired[builtins.float] + loudness_lufs: NotRequired[builtins.float] + loudness_tolerance_db: NotRequired[builtins.float] + true_peak_dbfs: NotRequired[builtins.float] + asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + companion_image_required: NotRequired[builtins.bool] + companion_image_aspect_ratio: NotRequired[builtins.str] + companion_image_max_file_size_kb: NotRequired[builtins.int] + brand_name_max_chars: NotRequired[builtins.int] + +class _ExternalFormatsCanonicalAudioDaast(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAudioDaastSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + daast_version: NotRequired[Literal['1.0', '1.1']] + daast_versions: NotRequired[builtins.list[Literal['1.0', '1.1']]] + duration_ms_range: NotRequired[builtins.list[builtins.int]] + duration_ms_exact: NotRequired[builtins.int] + linear_required: NotRequired[builtins.bool] + max_wrapper_depth: NotRequired[builtins.int] + ssl_required: NotRequired[builtins.bool] + companion_image_required: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSponsoredPlacement(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalSponsoredPlacementSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + supported_catalog_types: NotRequired[builtins.list[Literal['offering', 'product', 'inventory', 'store', 'promotion', 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app']]] + min_items: NotRequired[builtins.int] + max_items: NotRequired[builtins.int] + fanout_mode: NotRequired[Literal['per_item', 'multi_item_in_creative', 'single_item']] + required_catalog_fields: NotRequired[builtins.list[builtins.str]] + supported_id_types: NotRequired[builtins.list[Literal['asin', 'sku', 'gtin', 'offering_id', 'store_id', 'hotel_id', 'flight_id', 'vehicle_id', 'listing_id', 'program_id', 'destination_id', 'app_id', 'job_id']]] + hero_asset_supported: NotRequired[builtins.bool] + item_production_model: NotRequired[Literal['buyer_uploaded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized']] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + +class _ExternalFormatsCanonicalNativeInFeed(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalNativeInFeedSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] + menu_placement: NotRequired[Literal['tile', 'headline_banner']] + focus_behavior: NotRequired[Literal['none', 'autoplay_muted', 'autoplay_sound']] + motion_level: NotRequired[Literal['static', 'limited_motion', 'full_motion']] + activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] + title_max_chars: NotRequired[builtins.int] + body_text_max_chars: NotRequired[builtins.int] + cta_max_chars: NotRequired[builtins.int] + cta_values: NotRequired[builtins.list[builtins.str]] + main_image_sizes: NotRequired[builtins.list[_ExternalFormatsCanonicalNativeInFeedMainImageSizesItem]] + icon_size: NotRequired[_ExternalFormatsCanonicalNativeInFeedIconSize] + max_image_file_size_kb: NotRequired[builtins.int] + image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp']]] + ssl_required: NotRequired[builtins.bool] + asset_source: NotRequired[Literal['buyer_uploaded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] + buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] + +class _ExternalFormatsCanonicalResponsiveCreative(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalResponsiveCreativeSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + headlines_min: NotRequired[builtins.int] + headlines_max: NotRequired[builtins.int] + headline_max_chars: NotRequired[builtins.int] + long_headlines_min: NotRequired[builtins.int] + long_headlines_max: NotRequired[builtins.int] + long_headline_max_chars: NotRequired[builtins.int] + descriptions_min: NotRequired[builtins.int] + descriptions_max: NotRequired[builtins.int] + description_max_chars: NotRequired[builtins.int] + images_landscape_min: NotRequired[builtins.int] + images_landscape_max: NotRequired[builtins.int] + images_landscape_aspect_ratio: NotRequired[builtins.str] + images_square_min: NotRequired[builtins.int] + images_square_max: NotRequired[builtins.int] + images_vertical_min: NotRequired[builtins.int] + images_vertical_max: NotRequired[builtins.int] + videos_min: NotRequired[builtins.int] + videos_max: NotRequired[builtins.int] + video_min_duration_ms: NotRequired[builtins.int] + video_max_duration_ms: NotRequired[builtins.int] + logo_min: NotRequired[builtins.int] + logo_max: NotRequired[builtins.int] + logo_aspect_ratios: NotRequired[builtins.list[builtins.str]] + business_name_max_chars: NotRequired[builtins.int] + asset_image_max_file_size_kb: NotRequired[builtins.int] + supports_catalog_input: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalAgentPlacement(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAgentPlacementSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + output_modality: NotRequired[Literal['text', 'audio', 'card']] + max_mention_length_chars: NotRequired[builtins.int] + max_mention_duration_ms: NotRequired[builtins.int] + supports_offering_reference: NotRequired[builtins.bool] + supports_landing_page_url: NotRequired[builtins.bool] + tone_constraints: NotRequired[builtins.list[builtins.str]] + disclosure_required: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplay(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplaySlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + supply_mode: NotRequired[Literal['components', 'rendered_canvases', 'layered_source']] + states: Required[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItem]] + initial_state_id: Required[builtins.str] + reveal: NotRequired[Literal['none', 'clip_window', 'scroll_parallax']] + transitions: NotRequired[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant1 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant2 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant3 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant4 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant5 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant6]] + clickthrough: NotRequired[Literal['required', 'optional', 'none']] + user_controls: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayUserControls] + canvas_constraints: NotRequired[builtins.list[_ExternalCoreCanvasConstraint]] + duration_ms_range: NotRequired[builtins.list[builtins.int | None]] + duration_ms_exact: NotRequired[builtins.int] + aspect_ratio: NotRequired[builtins.str] + containers: NotRequired[builtins.list[Literal['mp4', 'webm', 'mov']]] + video_playback: NotRequired[Literal['none', 'auto_muted', 'user_initiated']] + max_initial_load_kb: NotRequired[builtins.int] + max_subload_kb: NotRequired[builtins.int] + polite_load: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalCoordinatedPlacements(TypedDict, total=False): + experimental: NotRequired[builtins.bool] + deprecated: NotRequired[builtins.bool] + v1_translatable: NotRequired[builtins.bool] + since_version: NotRequired[builtins.str] + migration_target_version: NotRequired[builtins.str] + composition_model: NotRequired[Literal['deterministic', 'algorithmic']] + provenance_required: NotRequired[builtins.bool] + platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] + synthesis_nondeterministic: NotRequired[builtins.bool] + slots: NotRequired[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsSlotsItem]] + required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] + reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] + production_window_business_days: NotRequired[builtins.int] + components: Required[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsComponentsItem]] + shared_slots: NotRequired[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsSharedSlotsItem]] + +class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['url']] + preview_url: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['html']] + preview_html: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant2Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['both']] + preview_url: Required[builtins.str] + preview_html: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreviewPreviewsItemRendersItemVariant3Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreviewPreviewsItemInput(TypedDict, total=False): + name: Required[builtins.str] + macros: NotRequired[builtins.dict[builtins.str, builtins.str]] + context_description: NotRequired[builtins.str] + +class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['url']] + preview_url: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant1Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['html']] + preview_html: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant2Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3(TypedDict, total=False): + render_id: Required[builtins.str] + output_format: Required[Literal['both']] + preview_url: Required[builtins.str] + preview_html: Required[builtins.str] + role: Required[builtins.str] + dimensions: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3Dimensions] + embedding: NotRequired[_BuildCreativeResponsePreview2PreviewsItemRendersItemVariant3Embedding] + renderer: NotRequired[_ExternalCorePreviewRendererMetadata] + +class _BuildCreativeResponsePreview2PreviewsItemInput(TypedDict, total=False): + name: Required[builtins.str] + macros: NotRequired[builtins.dict[builtins.str, builtins.str]] + context_description: NotRequired[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant1(TypedDict, total=False): + scope: Required[Literal['product']] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant2(TypedDict, total=False): + scope: Required[Literal['data_provider']] + data_provider_domain: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalRefVariant3(TypedDict, total=False): + scope: Required[Literal['signal_source']] + signal_source_url: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalIdVariant1(TypedDict, total=False): + source: Required[Literal['catalog']] + data_provider_domain: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant1SignalIdVariant2(TypedDict, total=False): + source: Required[Literal['agent']] + agent_url: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant1(TypedDict, total=False): + scope: Required[Literal['product']] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant2(TypedDict, total=False): + scope: Required[Literal['data_provider']] + data_provider_domain: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalRefVariant3(TypedDict, total=False): + scope: Required[Literal['signal_source']] + signal_source_url: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalIdVariant1(TypedDict, total=False): + source: Required[Literal['catalog']] + data_provider_domain: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant2SignalIdVariant2(TypedDict, total=False): + source: Required[Literal['agent']] + agent_url: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant1(TypedDict, total=False): + scope: Required[Literal['product']] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant2(TypedDict, total=False): + scope: Required[Literal['data_provider']] + data_provider_domain: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalRefVariant3(TypedDict, total=False): + scope: Required[Literal['signal_source']] + signal_source_url: Required[builtins.str] + signal_id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalIdVariant1(TypedDict, total=False): + source: Required[Literal['catalog']] + data_provider_domain: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemSignalConditionVariant3SignalIdVariant2(TypedDict, total=False): + source: Required[Literal['agent']] + agent_url: Required[builtins.str] + id: Required[builtins.str] + +class _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1(TypedDict, total=False): + format_id: Required[_ExternalCoreFormatId] + format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] + format_option_ref: NotRequired[_BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1FormatOptionRefVariant1 | _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] + assets: Required[builtins.dict[builtins.str, Any]] + component_assets: NotRequired[builtins.dict[builtins.str, Any]] + brand: NotRequired[_ExternalCoreBrandRef] + rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] + provenance: NotRequired[_ExternalCoreProvenance] + ext: NotRequired[builtins.dict[builtins.str, Any]] + +class _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2(TypedDict, total=False): + format_id: NotRequired[_ExternalCoreFormatId] + format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] + format_option_ref: NotRequired[_BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2FormatOptionRefVariant1 | _BuildCreativeResponseCreativesItemVariantsItemCreativeManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] + assets: Required[builtins.dict[builtins.str, Any]] + component_assets: NotRequired[builtins.dict[builtins.str, Any]] + brand: NotRequired[_ExternalCoreBrandRef] + rights: NotRequired[builtins.list[_ExternalCoreRightsConstraint]] + industry_identifiers: NotRequired[builtins.list[_ExternalCoreIndustryIdentifier]] + provenance: NotRequired[_ExternalCoreProvenance] + ext: NotRequired[builtins.dict[builtins.str, Any]] + +class _BuildCreativeResponseCreativesItemVariantsItemEval(TypedDict, total=False): + features: NotRequired[builtins.list[_ExternalCreativeCreativeFeatureResult]] + ranked_against: NotRequired[builtins.int] + calls_used: NotRequired[builtins.int] + seconds_used: NotRequired[builtins.float] ext: NotRequired[builtins.dict[builtins.str, Any]] class _ExternalPricingOptionsPriceGuidance(TypedDict, total=False): @@ -10864,6 +12864,18 @@ class _ComplyTestControllerRequestParamsReachWindowPeriod(TypedDict, total=False interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] +class _ComplyTestControllerRequestParamsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ComplyTestControllerRequestParamsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreVendorMetricValueQualifier(TypedDict, total=False): viewability_standard: NotRequired[Literal['mrc', 'groupm']] completion_source: NotRequired[Literal['seller_attested', 'vendor_attested']] @@ -10871,6 +12883,13 @@ class _ExternalCoreVendorMetricValueQualifier(TypedDict, total=False): attribution_window: NotRequired[_ExternalCoreDuration] lift_dimension: NotRequired[Literal['awareness', 'consideration', 'favorability', 'purchase_intent', 'ad_recall']] +class _Qualifier(TypedDict, total=False): + viewability_standard: NotRequired[Literal['mrc', 'groupm']] + completion_source: NotRequired[Literal['seller_attested', 'vendor_attested']] + attribution_methodology: NotRequired[Literal['deterministic_purchase', 'probabilistic', 'panel_based', 'modeled']] + attribution_window: NotRequired[_ExternalCoreDuration] + lift_dimension: NotRequired[Literal['awareness', 'consideration', 'favorability', 'purchase_intent', 'ad_recall']] + class _ExternalCreativeAuditObservationDetailsClaimedValue(TypedDict, total=False): human_oversight: Required[Literal['edited', 'directed']] disclosure_required: Required[Literal[False]] @@ -11148,6 +13167,12 @@ class _ExternalCoreNotificationConfigAuthentication(TypedDict, total=False): schemes: Required[builtins.list[Literal['Bearer', 'HMAC-SHA256']]] credentials: NotRequired[builtins.str] +class _ExternalCoreReportingDeliveryConfigStateSetup(TypedDict, total=False): + action: Required[Literal['grant_access', 'activate_recipient', 'authorize_provider', 'repair_access']] + message: Required[builtins.str] + url: NotRequired[builtins.str] + expires_at: NotRequired[builtins.str] + class _CreateMediaBuyResponseBudgetAllocationVariant2OptimizationGoalsItemVariant1TargetFrequency(TypedDict, total=False): min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -11243,13 +13268,6 @@ class _ExternalCorePackageCommittedMetricsItemVariant2Qualifier(TypedDict, total attribution_window: NotRequired[_ExternalCoreDuration] lift_dimension: NotRequired[Literal['awareness', 'consideration', 'favorability', 'purchase_intent', 'ad_recall']] -class _ExternalCoreCreativeLocalePolicy(TypedDict, total=False): - accepted_language_ranges: Required[builtins.list[builtins.str]] - -class _ExternalCorePlatformExtensionRef(TypedDict, total=False): - uri: Required[builtins.str] - digest: Required[builtins.str] - class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -11390,6 +13408,10 @@ class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant4(TypedDict, ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] +class _ExternalCorePackageFormatsToProvideItemVariant1PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -11526,6 +13548,10 @@ class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant4(TypedDict, backup_image_max_size_kb: NotRequired[builtins.int] ssl_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant2PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -11548,6 +13574,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant1(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -11577,6 +13604,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant2(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -11606,6 +13634,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant3(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -11635,6 +13664,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant4(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -11642,328 +13672,57 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant4(TypedDict, backup_image_max_size_kb: NotRequired[builtins.int] om_sdk_required: NotRequired[builtins.bool] -class _ExternalFormatsCanonicalImageCarousel(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalImageCarouselSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - card_aspect_ratio: NotRequired[builtins.str] - min_cards: NotRequired[builtins.int] - max_cards: NotRequired[builtins.int] - allowed_card_media_asset_types: NotRequired[builtins.list[Literal['image', 'video']]] - allowed_card_asset_types: NotRequired[builtins.list[Literal['image', 'video']]] - card_image_max_file_size_kb: NotRequired[builtins.int] - card_video_max_file_size_kb: NotRequired[builtins.int] - card_video_max_duration_ms: NotRequired[builtins.int] - primary_text_max_chars: NotRequired[builtins.int] - card_headline_max_chars: NotRequired[builtins.int] - card_description_max_chars: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant3PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalVideoHosted(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalVideoHostedSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - orientation: NotRequired[Literal['vertical', 'horizontal', 'square']] - aspect_ratio: NotRequired[builtins.str] - min_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - duration_ms_range: NotRequired[builtins.list[builtins.int | None]] - duration_ms_exact: NotRequired[builtins.int] - video_codecs: NotRequired[builtins.list[Literal['h264', 'h265', 'vp8', 'vp9', 'av1', 'prores']]] - audio_codecs: NotRequired[builtins.list[Literal['aac', 'mp3', 'opus', 'pcm']]] - containers: NotRequired[builtins.list[Literal['mp4', 'webm', 'mov']]] - min_bitrate_kbps: NotRequired[builtins.int] - max_bitrate_kbps: NotRequired[builtins.int] - max_file_size_mb: NotRequired[builtins.int] - frame_rates: NotRequired[builtins.list[builtins.float]] - captions: NotRequired[Literal['required', 'recommended', 'not_required']] - om_sdk_required: NotRequired[builtins.bool] - headline_max_chars: NotRequired[builtins.int] - primary_text_max_chars: NotRequired[builtins.int] - brand_name_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - companion_banner_widths: NotRequired[builtins.list[builtins.int]] - companion_banner_heights: NotRequired[builtins.list[builtins.int]] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] +class _ExternalCorePackageFormatsToProvideItemVariant4PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalVideoVast(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalVideoVastSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - orientation: NotRequired[Literal['vertical', 'horizontal', 'square']] - aspect_ratio: NotRequired[builtins.str] - vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] - vpaid_enabled: NotRequired[builtins.bool] - vpaid_version: NotRequired[Literal['1.0', '2.0']] - simid_supported: NotRequired[builtins.bool] - duration_ms_range: NotRequired[builtins.list[builtins.int]] - duration_ms_exact: NotRequired[builtins.int] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - creative_type: NotRequired[Literal['linear', 'nonlinear', 'either']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - motion_level: NotRequired[Literal['static', 'limited_motion', 'full_motion']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] - linear_required: NotRequired[builtins.bool] - skippable_after_ms: NotRequired[builtins.int] - max_wrapper_depth: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant5PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalAudioHosted(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAudioHostedSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - duration_ms_range: NotRequired[builtins.list[builtins.int | None]] - duration_ms_exact: NotRequired[builtins.int] - audio_codecs: NotRequired[builtins.list[Literal['mp3', 'aac', 'wav', 'opus', 'flac']]] - audio_sample_rates: NotRequired[builtins.list[builtins.int]] - audio_channels: NotRequired[builtins.list[Literal['mono', 'stereo']]] - min_bitrate_kbps: NotRequired[builtins.int] - max_bitrate_kbps: NotRequired[builtins.int] - max_file_size_mb: NotRequired[builtins.float] - loudness_lufs: NotRequired[builtins.float] - loudness_tolerance_db: NotRequired[builtins.float] - true_peak_dbfs: NotRequired[builtins.float] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - companion_image_required: NotRequired[builtins.bool] - companion_image_aspect_ratio: NotRequired[builtins.str] - companion_image_max_file_size_kb: NotRequired[builtins.int] - brand_name_max_chars: NotRequired[builtins.int] +class _ExternalCorePackageFormatsToProvideItemVariant6PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalAudioDaast(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAudioDaastSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - daast_version: NotRequired[Literal['1.0', '1.1']] - duration_ms_range: NotRequired[builtins.list[builtins.int]] - duration_ms_exact: NotRequired[builtins.int] - linear_required: NotRequired[builtins.bool] - max_wrapper_depth: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] - companion_image_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant7PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalSponsoredPlacement(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalSponsoredPlacementSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - supported_catalog_types: NotRequired[builtins.list[Literal['offering', 'product', 'inventory', 'store', 'promotion', 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app']]] - min_items: NotRequired[builtins.int] - max_items: NotRequired[builtins.int] - fanout_mode: NotRequired[Literal['per_item', 'multi_item_in_creative', 'single_item']] - required_catalog_fields: NotRequired[builtins.list[builtins.str]] - supported_id_types: NotRequired[builtins.list[Literal['asin', 'sku', 'gtin', 'offering_id', 'store_id', 'hotel_id', 'flight_id', 'vehicle_id', 'listing_id', 'program_id', 'destination_id', 'app_id', 'job_id']]] - hero_asset_supported: NotRequired[builtins.bool] - item_production_model: NotRequired[Literal['buyer_uploaded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] +class _ExternalCorePackageFormatsToProvideItemVariant8PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalNativeInFeed(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalNativeInFeedSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - menu_placement: NotRequired[Literal['tile', 'headline_banner']] - focus_behavior: NotRequired[Literal['none', 'autoplay_muted', 'autoplay_sound']] - motion_level: NotRequired[Literal['static', 'limited_motion', 'full_motion']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] - title_max_chars: NotRequired[builtins.int] - body_text_max_chars: NotRequired[builtins.int] - cta_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - main_image_sizes: NotRequired[builtins.list[_ExternalFormatsCanonicalNativeInFeedMainImageSizesItem]] - icon_size: NotRequired[_ExternalFormatsCanonicalNativeInFeedIconSize] - max_image_file_size_kb: NotRequired[builtins.int] - image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp']]] - ssl_required: NotRequired[builtins.bool] - asset_source: NotRequired[Literal['buyer_uploaded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] +class _ExternalCorePackageFormatsToProvideItemVariant9PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalResponsiveCreative(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalResponsiveCreativeSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - headlines_min: NotRequired[builtins.int] - headlines_max: NotRequired[builtins.int] - headline_max_chars: NotRequired[builtins.int] - long_headlines_min: NotRequired[builtins.int] - long_headlines_max: NotRequired[builtins.int] - long_headline_max_chars: NotRequired[builtins.int] - descriptions_min: NotRequired[builtins.int] - descriptions_max: NotRequired[builtins.int] - description_max_chars: NotRequired[builtins.int] - images_landscape_min: NotRequired[builtins.int] - images_landscape_max: NotRequired[builtins.int] - images_landscape_aspect_ratio: NotRequired[builtins.str] - images_square_min: NotRequired[builtins.int] - images_square_max: NotRequired[builtins.int] - images_vertical_min: NotRequired[builtins.int] - images_vertical_max: NotRequired[builtins.int] - videos_min: NotRequired[builtins.int] - videos_max: NotRequired[builtins.int] - video_min_duration_ms: NotRequired[builtins.int] - video_max_duration_ms: NotRequired[builtins.int] - logo_min: NotRequired[builtins.int] - logo_max: NotRequired[builtins.int] - logo_aspect_ratios: NotRequired[builtins.list[builtins.str]] - business_name_max_chars: NotRequired[builtins.int] - asset_image_max_file_size_kb: NotRequired[builtins.int] - supports_catalog_input: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant10PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalAgentPlacement(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalAgentPlacementSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - output_modality: NotRequired[Literal['text', 'audio', 'card']] - max_mention_length_chars: NotRequired[builtins.int] - max_mention_duration_ms: NotRequired[builtins.int] - supports_offering_reference: NotRequired[builtins.bool] - supports_landing_page_url: NotRequired[builtins.bool] - tone_constraints: NotRequired[builtins.list[builtins.str]] - disclosure_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant11PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplay(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplaySlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - supply_mode: NotRequired[Literal['components', 'rendered_canvases', 'layered_source']] - states: Required[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItem]] - initial_state_id: Required[builtins.str] - reveal: NotRequired[Literal['none', 'clip_window', 'scroll_parallax']] - transitions: NotRequired[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant1 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant2 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant3 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant4 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant5 | _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant6]] - clickthrough: NotRequired[Literal['required', 'optional', 'none']] - user_controls: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayUserControls] - canvas_constraints: NotRequired[builtins.list[_ExternalCoreCanvasConstraint]] - duration_ms_range: NotRequired[builtins.list[builtins.int | None]] - duration_ms_exact: NotRequired[builtins.int] - aspect_ratio: NotRequired[builtins.str] - containers: NotRequired[builtins.list[Literal['mp4', 'webm', 'mov']]] - video_playback: NotRequired[Literal['none', 'auto_muted', 'user_initiated']] - max_initial_load_kb: NotRequired[builtins.int] - max_subload_kb: NotRequired[builtins.int] - polite_load: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsToProvideItemVariant12PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] -class _ExternalFormatsCanonicalCoordinatedPlacements(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsSlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - components: Required[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsComponentsItem]] - shared_slots: NotRequired[builtins.list[_ExternalFormatsCanonicalCoordinatedPlacementsSharedSlotsItem]] +class _ExternalCorePackageFormatsToProvideItemVariant13PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsToProvideItemVariant14PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsToProvideItemVariant15PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] @@ -12105,6 +13864,10 @@ class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant4(TypedDict, to ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] +class _ExternalCorePackageFormatsPendingItemVariant1PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -12241,6 +14004,10 @@ class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant4(TypedDict, to backup_image_max_size_kb: NotRequired[builtins.int] ssl_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsPendingItemVariant2PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -12263,6 +14030,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant1(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -12292,6 +14060,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant2(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -12321,6 +14090,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant3(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -12350,6 +14120,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant4(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -12357,6 +14128,58 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant4(TypedDict, to backup_image_max_size_kb: NotRequired[builtins.int] om_sdk_required: NotRequired[builtins.bool] +class _ExternalCorePackageFormatsPendingItemVariant3PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant4PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant5PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant6PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant7PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant8PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant9PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant10PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant11PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant12PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant13PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant14PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _ExternalCorePackageFormatsPendingItemVariant15PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _ExternalCorePackageOptimizationGoalsItemVariant1TargetFrequency(TypedDict, total=False): min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -12463,6 +14286,18 @@ class _ExternalCoreAttestationCapabilitiesAcceptedVerifiersItem(TypedDict, total proof_formats: NotRequired[builtins.list[builtins.str]] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreReportingDeliveryOffering(TypedDict, total=False): + offering_id: Required[builtins.str] + feed_purpose: Required[Literal['pacing', 'analytics', 'billing']] + report_definition_id: Required[builtins.str] + report_definition_uri: Required[builtins.str] + report_definition_sha256: Required[builtins.str] + reporting_profile: Required[_ExternalCoreReportingDeliveryOfferingReportingProfile] + schedule: Required[_ExternalCoreReportingScheduleOffering] + supported_finality: Required[builtins.list[Literal['snapshot', 'official']]] + reconciliation_mode: Required[Literal['delivery_only', 'consumer_receipt']] + method: Required[_ExternalCoreReportingDeliveryOfferingMethod] + class _GetAdcpCapabilitiesResponseMediaBuyFeaturesBiddingPolicy(TypedDict, total=False): media_buy: NotRequired[_ScopeCapability] package: NotRequired[_ScopeCapability] @@ -12471,7 +14306,8 @@ class _GetAdcpCapabilitiesResponseMediaBuyExecutionTrustedMatch(TypedDict, total surfaces: NotRequired[builtins.list[Literal['website', 'mobile_app', 'ctv_app', 'desktop_app', 'dooh', 'podcast', 'radio', 'linear_tv', 'streaming_audio', 'ai_assistant']]] class _GetAdcpCapabilitiesResponseMediaBuyExecutionCreativeSpecs(TypedDict, total=False): - vast_versions: NotRequired[builtins.list[builtins.str]] + vast_versions: NotRequired[builtins.list[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']]] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] mraid_versions: NotRequired[builtins.list[builtins.str]] vpaid: NotRequired[builtins.bool] simid: NotRequired[builtins.bool] @@ -12496,6 +14332,34 @@ class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargeting(TypedDict, total=Fa collection_list_exclude: NotRequired[builtins.bool] geo_proximity: NotRequired[_GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingGeoProximity] +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant1(TypedDict, total=False): + pattern: Required[Literal['sync_audiences']] + +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant2(TypedDict, total=False): + pattern: Required[Literal['tmp_identity_match']] + buyer_agent: Required[_GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant2BuyerAgent] + +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant3(TypedDict, total=False): + pattern: Required[Literal['file_transfer']] + transport: Required[Literal['s3', 'gcs', 'azure_blob']] + directions: NotRequired[builtins.list[Literal['buyer_to_seller', 'seller_to_buyer']]] + vendor: Required[_ExternalCoreBrandRef] + +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant4(TypedDict, total=False): + pattern: Required[Literal['dataset_query']] + vendor: Required[_ExternalCoreBrandRef] + consumer_identities: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant4ConsumerIdentitiesItem]] + +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant5(TypedDict, total=False): + pattern: Required[Literal['clean_room']] + vendor: Required[_ExternalCoreBrandRef] + +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant6(TypedDict, total=False): + pattern: Required[Literal['platform_distribution']] + vendor: Required[_ExternalCoreBrandRef] + destination_ref: NotRequired[builtins.str] + bind_expiry_days: NotRequired[builtins.int] + class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingMatchingLatencyHours(TypedDict, total=False): min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -12521,9 +14385,11 @@ class _GetAdcpCapabilitiesResponseSponsoredIntelligenceEndpointTransportsItem(Ty type: Required[Literal['mcp', 'a2a']] url: Required[builtins.str] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1(TypedDict, total=False): +class _ExternalCoreCreativeOperationFormatDeclaration(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -12534,231 +14400,7 @@ class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1(Typ format_shape: NotRequired[builtins.str] v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['image']] - params: Required[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['html5']] - params: Required[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['display_tag']] - params: Required[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3 | _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant4(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['image_carousel']] - params: Required[_ExternalFormatsCanonicalImageCarousel] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant5(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['video_hosted']] - params: Required[_ExternalFormatsCanonicalVideoHosted] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant6(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['video_vast']] - params: Required[_ExternalFormatsCanonicalVideoVast] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant7(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['audio_hosted']] - params: Required[_ExternalFormatsCanonicalAudioHosted] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant8(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['audio_daast']] - params: Required[_ExternalFormatsCanonicalAudioDaast] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant9(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['sponsored_placement']] - params: Required[_ExternalFormatsCanonicalSponsoredPlacement] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant10(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['native_in_feed']] - params: Required[_ExternalFormatsCanonicalNativeInFeed] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant11(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['responsive_creative']] - params: Required[_ExternalFormatsCanonicalResponsiveCreative] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant12(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['agent_placement']] - params: Required[_ExternalFormatsCanonicalAgentPlacement] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant13(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['seller_rendered_stateful_display']] - params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant14(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['coordinated_placements']] - params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant15(TypedDict, total=False): - format_option_id: NotRequired[builtins.str] - publisher_domain: NotRequired[builtins.str] - display_name: NotRequired[builtins.str] - sample_render_url: NotRequired[builtins.str] - applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] - seller_preference: NotRequired[Literal['preferred', 'accepted', 'discouraged']] - locale_policy: NotRequired[_ExternalCoreCreativeLocalePolicy] - canonical_formats_only: NotRequired[builtins.bool] - experimental: NotRequired[builtins.bool] - format_shape: NotRequired[builtins.str] - v1_format_ref: NotRequired[builtins.list[_ExternalCoreFormatId]] - format_schema: NotRequired[_ExternalCorePlatformExtensionRef] - format_kind: Required[Literal['custom']] + format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] params: Required[builtins.dict[builtins.str, Any]] class _GetAdcpCapabilitiesResponseCreativePreviewRoutesItem(TypedDict, total=False): @@ -12813,12 +14455,27 @@ class _ExternalCoreDeliveryMetricsDoohMetrics(TypedDict, total=False): calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsDoohMetricsVenueBreakdownItem]] +class _ExternalCoreDeliveryMetricsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreDeliveryMetricsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreDeliveryMetricsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreDeliveryMetricsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreDeliveryMetricsByActionSourceItem(TypedDict, total=False): @@ -12863,12 +14520,27 @@ class _ExternalCoreCreativeVariantDoohMetrics(TypedDict, total=False): calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreCreativeVariantDoohMetricsVenueBreakdownItem]] +class _ExternalCoreCreativeVariantOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreCreativeVariantOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreCreativeVariantOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreCreativeVariantViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreCreativeVariantViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreCreativeVariantViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreCreativeVariantByActionSourceItem(TypedDict, total=False): @@ -12881,6 +14553,7 @@ class _ExternalCoreCreativeVariantManifestVariant1(TypedDict, total=False): format_id: Required[_ExternalCoreFormatId] format_kind: NotRequired[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalCoreCreativeVariantManifestVariant1FormatOptionRefVariant1 | _ExternalCoreCreativeVariantManifestVariant1FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -12893,6 +14566,7 @@ class _ExternalCoreCreativeVariantManifestVariant2(TypedDict, total=False): format_id: NotRequired[_ExternalCoreFormatId] format_kind: Required[Literal['image', 'html5', 'display_tag', 'image_carousel', 'video_hosted', 'video_vast', 'audio_hosted', 'audio_daast', 'sponsored_placement', 'native_in_feed', 'responsive_creative', 'agent_placement', 'seller_rendered_stateful_display', 'coordinated_placements', 'custom']] format_option_ref: NotRequired[_ExternalCoreCreativeVariantManifestVariant2FormatOptionRefVariant1 | _ExternalCoreCreativeVariantManifestVariant2FormatOptionRefVariant2] + representation_selection: NotRequired[_ExternalCoreRepresentationSelection] assets: Required[builtins.dict[builtins.str, Any]] component_assets: NotRequired[builtins.dict[builtins.str, Any]] brand: NotRequired[_ExternalCoreBrandRef] @@ -12961,12 +14635,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsDoohMetrics(TypedD calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsByActionSourceItem(TypedDict, total=False): @@ -13011,12 +14700,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemDoohMetrics calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByActionSourceItem(TypedDict, total=False): @@ -13027,7 +14731,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByActionSou class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemMissingMetricsItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemMissingMetricsItemVariant1Qualifier] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemMissingMetricsItemVariant2(TypedDict, total=False): @@ -13057,6 +14761,7 @@ class _ExternalCoreCatalogItemDeliveryMetrics(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13066,6 +14771,7 @@ class _ExternalCoreCatalogItemDeliveryMetrics(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreCatalogItemDeliveryMetricsQuartileData | _ExternalCoreCatalogItemDeliveryMetricsQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreCatalogItemDeliveryMetricsDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreCatalogItemDeliveryMetricsOohMetrics] viewability: NotRequired[_ExternalCoreCatalogItemDeliveryMetricsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13104,6 +14810,7 @@ class _ExternalCoreCreativeDeliveryMetrics(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13113,6 +14820,7 @@ class _ExternalCoreCreativeDeliveryMetrics(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreCreativeDeliveryMetricsQuartileData | _ExternalCoreCreativeDeliveryMetricsQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreCreativeDeliveryMetricsDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreCreativeDeliveryMetricsOohMetrics] viewability: NotRequired[_ExternalCoreCreativeDeliveryMetricsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13151,6 +14859,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatIte conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13160,6 +14869,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatIte quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13197,6 +14907,7 @@ class _ExternalCoreKeywordDeliveryMetrics(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13206,6 +14917,7 @@ class _ExternalCoreKeywordDeliveryMetrics(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreKeywordDeliveryMetricsQuartileData | _ExternalCoreKeywordDeliveryMetricsQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreKeywordDeliveryMetricsDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreKeywordDeliveryMetricsOohMetrics] viewability: NotRequired[_ExternalCoreKeywordDeliveryMetricsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13244,6 +14956,7 @@ class _ExternalCoreGeoDeliveryMetrics(TypedDict, total=False): conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13253,6 +14966,7 @@ class _ExternalCoreGeoDeliveryMetrics(TypedDict, total=False): quartile_data: NotRequired[_ExternalCoreGeoDeliveryMetricsQuartileData | _ExternalCoreGeoDeliveryMetricsQuartileData2] time_based_views: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsTimeBasedViewsItem]] dooh_metrics: NotRequired[_ExternalCoreGeoDeliveryMetricsDoohMetrics] + ooh_metrics: NotRequired[_ExternalCoreGeoDeliveryMetricsOohMetrics] viewability: NotRequired[_ExternalCoreGeoDeliveryMetricsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13294,6 +15008,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTyp conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13303,6 +15018,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTyp quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13340,6 +15056,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePla conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13349,6 +15066,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePla quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13386,6 +15104,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceI conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13395,6 +15114,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceI quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13434,6 +15154,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemograph conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13443,6 +15164,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemograph quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13458,7 +15180,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemograph by_action_source: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemByActionSourceItem]] vendor_metric_values: NotRequired[builtins.list[_ExternalCoreVendorMetricValue]] demographic: Required[builtins.str] - demographic_system: Required[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: Required[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] age: NotRequired[_ExternalCoreDemographicAgeRange] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItem(TypedDict, total=False): @@ -13482,6 +15204,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacement conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13491,6 +15214,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacement quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13530,6 +15254,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItem( conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13539,6 +15264,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItem( quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13590,6 +15316,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotals(TypedD conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13599,6 +15326,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotals(TypedD quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13635,6 +15363,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItem conversion_lift: NotRequired[builtins.float] brand_search_lift: NotRequired[builtins.float] plays: NotRequired[builtins.float] + measurement_source: NotRequired[builtins.str] by_event_type: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemByEventTypeItem]] grps: NotRequired[builtins.float] reach: NotRequired[builtins.float] @@ -13644,6 +15373,7 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItem quartile_data: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemQuartileData | _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemQuartileData2] time_based_views: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemTimeBasedViewsItem]] dooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemDoohMetrics] + ooh_metrics: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetrics] viewability: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewability] engagements: NotRequired[builtins.float] follows: NotRequired[builtins.float] @@ -13671,7 +15401,7 @@ class _GetMediaBuysResponseMediaBuysItemAcceptedProposalForecast(TypedDict, tota forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -13771,6 +15501,9 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemCreativeApprovalsItem(TypedD class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13783,10 +15516,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13799,10 +15541,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['html5']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13815,10 +15566,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['display_tag']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13831,10 +15591,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant4 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image_carousel']] params: Required[_ExternalFormatsCanonicalImageCarousel] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant4PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13847,10 +15616,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant5 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_hosted']] params: Required[_ExternalFormatsCanonicalVideoHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant5PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13863,10 +15641,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant6 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_vast']] params: Required[_ExternalFormatsCanonicalVideoVast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant6PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13879,10 +15666,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant7 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_hosted']] params: Required[_ExternalFormatsCanonicalAudioHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant7PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13895,10 +15691,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant8 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_daast']] params: Required[_ExternalFormatsCanonicalAudioDaast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant8PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13911,10 +15716,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant9 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['sponsored_placement']] params: Required[_ExternalFormatsCanonicalSponsoredPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant9PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13927,10 +15741,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['native_in_feed']] params: Required[_ExternalFormatsCanonicalNativeInFeed] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant10PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13943,10 +15766,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['responsive_creative']] params: Required[_ExternalFormatsCanonicalResponsiveCreative] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant11PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13959,10 +15791,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['agent_placement']] params: Required[_ExternalFormatsCanonicalAgentPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant12PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13975,10 +15816,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['seller_rendered_stateful_display']] params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant13PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -13991,10 +15841,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['coordinated_placements']] params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant14PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14007,10 +15866,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['custom']] params: Required[builtins.dict[builtins.str, Any]] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant15PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14023,10 +15891,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14039,10 +15916,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['html5']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14055,10 +15941,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['display_tag']] params: Required[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant1 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant2 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant3 | _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant4] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14071,10 +15966,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant4(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['image_carousel']] params: Required[_ExternalFormatsCanonicalImageCarousel] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant4PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14087,10 +15991,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant5(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_hosted']] params: Required[_ExternalFormatsCanonicalVideoHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant5PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14103,10 +16016,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant6(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['video_vast']] params: Required[_ExternalFormatsCanonicalVideoVast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant6PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14119,10 +16041,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant7(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_hosted']] params: Required[_ExternalFormatsCanonicalAudioHosted] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant7PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14135,10 +16066,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant8(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['audio_daast']] params: Required[_ExternalFormatsCanonicalAudioDaast] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant8PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14151,10 +16091,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant9(T format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['sponsored_placement']] params: Required[_ExternalFormatsCanonicalSponsoredPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant9PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14167,10 +16116,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant10( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['native_in_feed']] params: Required[_ExternalFormatsCanonicalNativeInFeed] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant10PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14183,10 +16141,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant11( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['responsive_creative']] params: Required[_ExternalFormatsCanonicalResponsiveCreative] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant11PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14199,10 +16166,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant12( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['agent_placement']] params: Required[_ExternalFormatsCanonicalAgentPlacement] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant12PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14215,10 +16191,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant13( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['seller_rendered_stateful_display']] params: Required[_ExternalFormatsCanonicalSellerRenderedStatefulDisplay] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant13PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14231,10 +16216,19 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant14( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['coordinated_placements']] params: Required[_ExternalFormatsCanonicalCoordinatedPlacements] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant14PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14247,6 +16241,12 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant15( format_schema: NotRequired[_ExternalCorePlatformExtensionRef] format_kind: Required[Literal['custom']] params: Required[builtins.dict[builtins.str, Any]] + product_id: NotRequired[builtins.str] + placement_refs: NotRequired[builtins.list[_GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant15PlacementRefsItem]] + execution_vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + execution_daast_version: NotRequired[Literal['1.0', '1.1']] + tracker_execution_contract_digest: NotRequired[builtins.str] + product_snapshot_digest: NotRequired[builtins.str] class _GetMediaBuysResponseMediaBuysItemPackagesItemSnapshot(TypedDict, total=False): as_of: Required[builtins.str] @@ -14629,6 +16629,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant1(TypedDict, tot min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -14658,6 +16659,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant2(TypedDict, tot min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -14687,6 +16689,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant3(TypedDict, tot min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -14716,6 +16719,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant4(TypedDict, tot min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -14726,6 +16730,9 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant4(TypedDict, tot class _ExternalCorePlacementFormatOptionsItemVariant1(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14742,6 +16749,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant1(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant2(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14758,6 +16768,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant2(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant3(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14774,6 +16787,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant3(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant4(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14790,6 +16806,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant4(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant5(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14806,6 +16825,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant5(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant6(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14822,6 +16844,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant6(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant7(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14838,6 +16863,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant7(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant8(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14854,6 +16882,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant8(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant9(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14870,6 +16901,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant9(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant10(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14886,6 +16920,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant10(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant11(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14902,6 +16939,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant11(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant12(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14918,6 +16958,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant12(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant13(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14934,6 +16977,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant13(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant14(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14950,6 +16996,9 @@ class _ExternalCorePlacementFormatOptionsItemVariant14(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant15(TypedDict, total=False): format_option_id: NotRequired[builtins.str] publisher_domain: NotRequired[builtins.str] + tracker_execution_contract: NotRequired[_ExternalCoreTrackerExecutionContract] + macro_resolution_capabilities: NotRequired[builtins.list[_ExternalCoreMacroResolutionCapability]] + technical_requirements_complete: NotRequired[builtins.bool] display_name: NotRequired[builtins.str] sample_render_url: NotRequired[builtins.str] applies_to_channels: NotRequired[builtins.list[Literal['display', 'olv', 'social', 'search', 'ctv', 'linear_tv', 'radio', 'streaming_audio', 'podcast', 'dooh', 'ooh', 'print', 'cinema', 'email', 'gaming', 'retail_media', 'influencer', 'affiliate', 'product_placement', 'sponsored_intelligence']]] @@ -14967,7 +17016,7 @@ class _ExternalCoreProductPricingOptionsItemVariant5Parameters(TypedDict, total= view_threshold: Required[builtins.float | _ExternalCoreProductPricingOptionsItemVariant5ParametersViewThresholdVariant2] class _ExternalCoreProductPricingOptionsItemVariant6Parameters(TypedDict, total=False): - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: Required[builtins.str] min_points: NotRequired[builtins.float] @@ -15017,11 +17066,11 @@ class _ExternalCoreGeoBreakdownSupport(TypedDict, total=False): class _ExternalCoreDemographicReportingCapability(TypedDict, total=False): age: NotRequired[_ExternalCoreDemographicReportingCapabilityAge] - demographic_systems: NotRequired[builtins.list[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']]] + demographic_systems: NotRequired[builtins.list[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']]] may_suppress_small_cells: Required[builtins.bool] class _ExternalCoreSpotReportingCapability(TypedDict, total=False): - available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] + available_metrics: Required[builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']]] class _ExternalCoreMeasurementWindow(TypedDict, total=False): window_id: Required[builtins.str] @@ -15309,11 +17358,70 @@ class _ExternalCoreProductTrustedMatchProvidersItem(TypedDict, total=False): countries: NotRequired[builtins.list[builtins.str]] uid_types: NotRequired[builtins.list[Literal['rampid', 'rampid_derived', 'id5', 'uid2', 'euid', 'pairid', 'maid', 'hashed_email', 'publisher_first_party', 'world_id_nullifier', 'other']]] +class _ExternalCoreProductAudienceActivationMethodsItemVariant1(TypedDict, total=False): + pattern: Required[Literal['sync_audiences']] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant2(TypedDict, total=False): + pattern: Required[Literal['tmp_identity_match']] + buyer_agent: Required[_ExternalCoreProductAudienceActivationMethodsItemVariant2BuyerAgent] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant3(TypedDict, total=False): + pattern: Required[Literal['file_transfer']] + transport: Required[Literal['s3', 'gcs', 'azure_blob']] + directions: NotRequired[builtins.list[Literal['buyer_to_seller', 'seller_to_buyer']]] + vendor: Required[_ExternalCoreBrandRef] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant4(TypedDict, total=False): + pattern: Required[Literal['dataset_query']] + vendor: Required[_ExternalCoreBrandRef] + consumer_identities: NotRequired[builtins.list[_ExternalCoreProductAudienceActivationMethodsItemVariant4ConsumerIdentitiesItem]] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant5(TypedDict, total=False): + pattern: Required[Literal['clean_room']] + vendor: Required[_ExternalCoreBrandRef] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant6(TypedDict, total=False): + pattern: Required[Literal['platform_distribution']] + vendor: Required[_ExternalCoreBrandRef] + destination_ref: NotRequired[builtins.str] + bind_expiry_days: NotRequired[builtins.int] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant1(TypedDict, total=False): + pattern: Required[Literal['sync_audiences']] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant2(TypedDict, total=False): + pattern: Required[Literal['tmp_identity_match']] + buyer_agent: Required[_ExternalCoreProductAudienceActivationPreferredMethodVariant2BuyerAgent] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant3(TypedDict, total=False): + pattern: Required[Literal['file_transfer']] + transport: Required[Literal['s3', 'gcs', 'azure_blob']] + directions: NotRequired[builtins.list[Literal['buyer_to_seller', 'seller_to_buyer']]] + vendor: Required[_ExternalCoreBrandRef] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant4(TypedDict, total=False): + pattern: Required[Literal['dataset_query']] + vendor: Required[_ExternalCoreBrandRef] + consumer_identities: NotRequired[builtins.list[_ExternalCoreProductAudienceActivationPreferredMethodVariant4ConsumerIdentitiesItem]] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant5(TypedDict, total=False): + pattern: Required[Literal['clean_room']] + vendor: Required[_ExternalCoreBrandRef] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant6(TypedDict, total=False): + pattern: Required[Literal['platform_distribution']] + vendor: Required[_ExternalCoreBrandRef] + destination_ref: NotRequired[builtins.str] + bind_expiry_days: NotRequired[builtins.int] + class _ExternalCoreProductFiltersTrustedMatchProvidersItem(TypedDict, total=False): agent_url: Required[builtins.str] context_match: NotRequired[builtins.bool] identity_match: NotRequired[builtins.bool] +class _ExternalCoreProductFiltersAudienceActivationMethodsItemVariant2BuyerAgent(TypedDict, total=False): + agent_url: Required[builtins.str] + class _ExternalCoreMediaBuyFeaturesBiddingPolicy(TypedDict, total=False): media_buy: NotRequired[_ScopeCapability] package: NotRequired[_ScopeCapability] @@ -15582,6 +17690,23 @@ class _ExternalCoreProposalBudgetAllocationVariant2OptimizationGoalsItemVariant3 target: NotRequired[_ExternalCoreProposalBudgetAllocationVariant2OptimizationGoalsItemVariant3TargetVariant1 | _ExternalCoreProposalBudgetAllocationVariant2OptimizationGoalsItemVariant3TargetVariant2] priority: NotRequired[builtins.int] +class _ExternalCoreReportingVerificationPhysicalChecksumsItem(TypedDict, total=False): + object_ref: Required[builtins.str] + algorithm: Required[Literal['sha256', 'sha512']] + value: Required[builtins.str] + +class _ExternalCoreReportingVerificationNativeCommitEvidence(TypedDict, total=False): + native_version_ref: Required[builtins.str] + observed_through: Required[Literal['representative_consumer', 'destination']] + +class _GetReportingStatusResponseAdcpErrorIssuesItemDiscriminatorItem(TypedDict, total=False): + property_name: Required[builtins.str] + value: Required[builtins.str | builtins.float | builtins.bool | None] + +class _GetReportingStatusResponseAdcpError2IssuesItemDiscriminatorItem(TypedDict, total=False): + property_name: Required[builtins.str] + value: Required[builtins.str | builtins.float | builtins.bool | None] + class _GetSignalsResponseSignalsItemTaxonomyValuesItem(TypedDict, total=False): id: Required[builtins.str] path: NotRequired[builtins.str] @@ -15769,9 +17894,12 @@ class _ExternalCoreRequirementsJavascriptAssetRequirements(TypedDict, total=Fals class _ExternalCoreRequirementsVastAssetRequirements(TypedDict, total=False): vast_version: NotRequired[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']] + vast_versions: NotRequired[builtins.list[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']]] + media_file_requirements: NotRequired[_ExternalCoreVastMediaFileRequirements] class _ExternalCoreRequirementsDaastAssetRequirements(TypedDict, total=False): - daast_version: NotRequired[Literal['1.0']] + daast_version: NotRequired[Literal['1.0', '1.1']] + daast_versions: NotRequired[builtins.list[Literal['1.0', '1.1']]] class _ExternalCoreRequirementsUrlAssetRequirements(TypedDict, total=False): role: NotRequired[Literal['clickthrough', 'landing_page', 'impression_tracker', 'click_tracker', 'viewability_tracker', 'third_party_tracker']] @@ -16217,6 +18345,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant1(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16246,6 +18375,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant2(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16275,6 +18405,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant3(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16304,6 +18435,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant4(TypedDict, to min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16745,6 +18877,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant1(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16774,6 +18907,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant2(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16803,6 +18937,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant3(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -16832,6 +18967,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant4(TypedDict, min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -17004,7 +19140,7 @@ class _RefineProposalsResponseResultsItemVariant3ProposalForecast(TypedDict, tot forecast_range_unit: NotRequired[Literal['spend', 'availability', 'reach_freq', 'weekly', 'daily', 'clicks', 'conversions', 'package']] method: Required[Literal['estimate', 'modeled', 'guaranteed']] currency: Required[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] demographic: NotRequired[builtins.str] measurement_source: NotRequired[builtins.str] reach_unit: NotRequired[Literal['individuals', 'households', 'devices', 'accounts', 'cookies', 'custom']] @@ -17053,6 +19189,29 @@ class _SiSendMessageResponseHandoffIntentPrice(TypedDict, total=False): amount: NotRequired[builtins.float] currency: NotRequired[builtins.str] +class _ExternalCoreReportingDeliveryConfigScope(TypedDict, total=False): + all_media_buys: NotRequired[Literal[True]] + media_buy_ids: NotRequired[builtins.list[builtins.str]] + +class _ExternalCoreReportingDeliveryConfigMethodVariant1(TypedDict, total=False): + pattern: Required[Literal['file_transfer']] + transport: Required[builtins.str] + orchestration: Required[Literal['producer_managed', 'consumer_managed']] + destination: Required[_ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant1 | _ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant2] + format: Required[Literal['jsonl', 'csv', 'parquet', 'avro', 'orc']] + +class _ExternalCoreReportingDeliveryConfigMethodVariant2(TypedDict, total=False): + pattern: Required[Literal['dataset_share']] + transport: Required[builtins.str] + orchestration: Required[Literal['producer_managed', 'consumer_managed']] + destination: Required[_ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant1 | _ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2] + +class _ExternalCoreReportingDeliveryConfigMethodVariant3(TypedDict, total=False): + pattern: Required[Literal['warehouse_materialization']] + transport: Required[builtins.str] + orchestration: Required[Literal['producer_managed', 'consumer_managed']] + destination: Required[_ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant1 | _ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant2] + class _SyncAccountsRequestAccountsItemVariant1NotificationConfigsItemAuthentication(TypedDict, total=False): schemes: Required[builtins.list[Literal['Bearer', 'HMAC-SHA256']]] credentials: NotRequired[builtins.str] @@ -17100,6 +19259,10 @@ class _ExternalCoreCreativeLocalizationLocaleFallbacksItem(TypedDict, total=Fals language_range: Required[builtins.str] locale_variant_id: Required[builtins.str] +class _ExternalCoreMacroEncoding(TypedDict, total=False): + kind: Required[Literal['none', 'rfc3986', 'iab_vast_uri']] + depth: Required[builtins.int] + class _ExternalCoreEventSourceHealthDetail(TypedDict, total=False): score: Required[builtins.float] max_score: Required[builtins.float] @@ -17576,7 +19739,7 @@ class _ExternalMediaBuyCommercialTermsBudgetAllocationVariant2OptimizationGoalsI class _ExternalMediaBuyCommercialTermsReportingCommitmentsItemMetricsItemVariant1(TypedDict, total=False): scope: Required[Literal['standard']] - metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] + metric_id: Required[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] qualifier: NotRequired[_ExternalCoreCanonicalMetricQualifier] effective_at: NotRequired[builtins.str] @@ -17721,16 +19884,623 @@ class _ExternalCoreProvenanceEmbeddedProvenanceItemVerifyAgent(TypedDict, total= agent_url: Required[builtins.str] feature_id: NotRequired[builtins.str] -class _ExternalCoreProvenanceWatermarksItemVerifyAgent(TypedDict, total=False): - agent_url: Required[builtins.str] - feature_id: NotRequired[builtins.str] +class _ExternalCoreProvenanceWatermarksItemVerifyAgent(TypedDict, total=False): + agent_url: Required[builtins.str] + feature_id: NotRequired[builtins.str] + +class _ExternalCoreProvenanceDisclosureJurisdictionsItem(TypedDict, total=False): + country: Required[builtins.str] + region: NotRequired[builtins.str] + regulation: Required[builtins.str] + label_text: NotRequired[builtins.str] + render_guidance: NotRequired[_ExternalCoreProvenanceDisclosureJurisdictionsItemRenderGuidance] + +class _ExternalCoreTrackerExecutionContractHonoredItemVariant1(TypedDict, total=False): + selector_id: Required[builtins.str] + asset_type: Required[Literal['pixel_tracker']] + event: Required[Literal['impression', 'viewable_mrc_50', 'viewable_mrc_100', 'viewable_video_50', 'audible_video_complete', 'click', 'custom']] + method: Required[Literal['img']] + custom_event_name: NotRequired[builtins.str] + execution_actor: Required[Literal['seller', 'request_executor']] + firing_paths: Required[builtins.list[Literal['client', 'server']]] + +class _ExternalCoreTrackerExecutionContractHonoredItemVariant2(TypedDict, total=False): + vast_event: Required[Literal['creativeView', 'loaded', 'start', 'firstQuartile', 'midpoint', 'thirdQuartile', 'complete', 'mute', 'unmute', 'pause', 'resume', 'rewind', 'skip', 'playerExpand', 'playerCollapse', 'fullscreen', 'exitFullscreen', 'progress', 'acceptInvitation', 'adExpand', 'adCollapse', 'minimize', 'overlayViewDuration', 'otherAdInteraction', 'interactiveStart', 'close', 'closeLinear']] + target: Required[Literal['linear', 'non_linear', 'companion']] + offset: NotRequired[builtins.str] + vast_versions: Required[builtins.list[Literal['2.0', '3.0', '4.0', '4.1', '4.2', '4.3']]] + selector_id: Required[builtins.str] + asset_type: Required[Literal['vast_tracker']] + execution_actor: Required[Literal['seller', 'request_executor']] + firing_paths: Required[builtins.list[Literal['client', 'server']]] + +class _ExternalCoreTrackerExecutionContractHonoredItemVariant3(TypedDict, total=False): + daast_event: Required[Literal['creativeView', 'start', 'firstQuartile', 'midpoint', 'thirdQuartile', 'complete', 'mute', 'unmute', 'pause', 'resume', 'rewind', 'skip', 'progress', 'close']] + target: Required[Literal['linear', 'companion']] + offset: NotRequired[builtins.str] + daast_versions: Required[builtins.list[Literal['1.0', '1.1']]] + selector_id: Required[builtins.str] + asset_type: Required[Literal['daast_tracker']] + execution_actor: Required[Literal['seller', 'request_executor']] + firing_paths: Required[builtins.list[Literal['client', 'server']]] + +class _ExternalCoreMacroTranslationTarget(TypedDict, total=False): + token: Required[builtins.str] + dialect: Required[Literal['adcp', 'iab_vast', 'iab_daast', 'vendor', 'unknown']] + dialect_namespace: NotRequired[builtins.str] + dialect_revision: NotRequired[builtins.str] + dialect_semantic: Required[builtins.str] + mapping_status: Required[Literal['verified_universal', 'dialect_defined', 'unresolved']] + universal_semantic: NotRequired[Literal['MEDIA_BUY_ID', 'PACKAGE_ID', 'CREATIVE_ID', 'CACHEBUSTER', 'TIMESTAMP', 'CLICK_URL', 'GDPR', 'GDPR_CONSENT', 'US_PRIVACY', 'GPP_STRING', 'GPP_SID', 'IP_ADDRESS', 'LIMIT_AD_TRACKING', 'DEVICE_TYPE', 'OS', 'OS_VERSION', 'DEVICE_MAKE', 'DEVICE_MODEL', 'USER_AGENT', 'APP_BUNDLE', 'APP_NAME', 'COUNTRY', 'REGION', 'CITY', 'ZIP', 'DMA', 'LAT', 'LONG', 'DEVICE_ID', 'DEVICE_ID_TYPE', 'DOMAIN', 'PAGE_URL', 'REFERRER', 'KEYWORDS', 'PLACEMENT_ID', 'FOLD_POSITION', 'AD_WIDTH', 'AD_HEIGHT', 'VIDEO_ID', 'VIDEO_TITLE', 'VIDEO_DURATION', 'VIDEO_CATEGORY', 'CONTENT_GENRE', 'CONTENT_RATING', 'PLAYER_WIDTH', 'PLAYER_HEIGHT', 'POD_POSITION', 'POD_SIZE', 'AD_BREAK_ID', 'STATION_ID', 'COLLECTION_NAME', 'INSTALLMENT_ID', 'AUDIO_DURATION', 'TMPX', 'IMPRESSION_ID', 'AXEM', 'CATALOG_ID', 'SKU', 'GTIN', 'OFFERING_ID', 'JOB_ID', 'HOTEL_ID', 'FLIGHT_ID', 'VEHICLE_ID', 'LISTING_ID', 'STORE_ID', 'PROGRAM_ID', 'DESTINATION_ID', 'CREATIVE_VARIANT_ID', 'APP_ITEM_ID', 'ITEM_NAME', 'ITEM_DESCRIPTION', 'ITEM_TAGLINE', 'ITEM_PRICE', 'ITEM_PRICE_CURRENCY']] + next_operation: Required[Literal['resolve_value']] + performed_by: Required[Literal['buyer', 'creative_agent', 'seller', 'request_executor', 'source_ad_server']] + encoding: Required[_ExternalCoreMacroEncoding] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreDownstreamConnectionRequirement(TypedDict, total=False): + provider: NotRequired[builtins.str] + connection_type: Required[Literal['advertiser_account', 'publisher_identity', 'post_authorization']] + required_for: NotRequired[builtins.list[builtins.str]] + scope: NotRequired[Literal['account', 'identity', 'post', 'unknown']] + status: NotRequired[Literal['connected', 'missing', 'pending', 'expired', 'revoked', 'not_required', 'unknown']] + connection_id: NotRequired[builtins.str] + resource_ref: NotRequired[_ExternalCoreDownstreamConnectionRequirementResourceRef] + authorization_url: NotRequired[builtins.str] + authorization_instructions: NotRequired[builtins.str] + expires_at: NotRequired[builtins.str] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant1SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant2SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant3SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant1ParamsVariant4SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant1SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant2SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant3SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant2ParamsVariant4SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant1SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant2SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant3SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4SlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreRepresentationDestinationFormatOptionVariant3ParamsVariant4SizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalFormatsCanonicalImageCarouselSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalVideoHostedSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalVideoVastSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalCoreVastMediaFileRequirements(TypedDict, total=False): + delivery_methods: NotRequired[builtins.list[Literal['progressive', 'streaming']]] + mime_types: NotRequired[builtins.list[builtins.str]] + containers: NotRequired[builtins.list[builtins.str]] + codecs: NotRequired[builtins.list[builtins.str]] + min_width: NotRequired[builtins.int] + max_width: NotRequired[builtins.int] + min_height: NotRequired[builtins.int] + max_height: NotRequired[builtins.int] + min_bitrate_kbps: NotRequired[builtins.int] + max_bitrate_kbps: NotRequired[builtins.int] + max_file_size_bytes: NotRequired[builtins.int] + +class _ExternalFormatsCanonicalAudioHostedSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalAudioDaastSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSponsoredPlacementSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalNativeInFeedSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalNativeInFeedMainImageSizesItem(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalFormatsCanonicalNativeInFeedIconSize(TypedDict, total=False): + width: Required[builtins.int] + height: Required[builtins.int] + +class _ExternalFormatsCanonicalResponsiveCreativeSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalAgentPlacementSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplaySlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItem(TypedDict, total=False): + state_id: Required[builtins.str] + anchoring: Required[Literal['inline', 'sticky_top', 'sticky_bottom', 'overlay', 'fullscreen_overlay', 'underlay']] + slot_bindings: NotRequired[builtins.list[builtins.str]] + motion: NotRequired[Literal['static', 'animated']] + max_animation_s: NotRequired[builtins.float] + breakpoints: Required[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItemBreakpointsItem]] + close_affordance: Required[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant1(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['timer']] + input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] + media_event: NotRequired[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['instant', 'animated']] + delay_ms: Required[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: NotRequired[builtins.float] + scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: NotRequired[builtins.float] + scroll_end_percent: NotRequired[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant2(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['in_view_timer']] + input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] + media_event: NotRequired[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['instant', 'animated']] + delay_ms: Required[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: NotRequired[builtins.float] + scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: NotRequired[builtins.float] + scroll_end_percent: NotRequired[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant3(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['scroll_threshold']] + input: Required[Literal['scroll']] + media_event: NotRequired[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['instant', 'animated']] + delay_ms: NotRequired[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: Required[builtins.float] + scroll_reference: Required[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: NotRequired[builtins.float] + scroll_end_percent: NotRequired[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant4(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['scroll_progress']] + input: Required[Literal['scroll']] + media_event: NotRequired[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['scroll_linked']] + delay_ms: NotRequired[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: NotRequired[builtins.float] + scroll_reference: Required[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: Required[builtins.float] + scroll_end_percent: Required[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant5(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['user_action']] + input: Required[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] + media_event: NotRequired[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['instant', 'animated']] + delay_ms: NotRequired[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: NotRequired[builtins.float] + scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: NotRequired[builtins.float] + scroll_end_percent: NotRequired[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant6(TypedDict, total=False): + transition_id: Required[builtins.str] + from_state_id: Required[builtins.str] + to_state_id: Required[builtins.str] + trigger: Required[Literal['media_event']] + input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] + media_event: Required[Literal['video_start', 'video_complete']] + direction: NotRequired[Literal['down', 'up']] + transition_mode: Required[Literal['instant', 'animated']] + delay_ms: NotRequired[builtins.int] + duration_ms: NotRequired[builtins.int] + scroll_threshold_percent: NotRequired[builtins.float] + scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] + scroll_start_percent: NotRequired[builtins.float] + scroll_end_percent: NotRequired[builtins.float] + preserve_playback: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayUserControls(TypedDict, total=False): + dismissible: Required[builtins.bool] + user_collapsible: Required[builtins.bool] + +class _ExternalCoreCanvasConstraint(TypedDict, total=False): + constraint: Required[Literal['safe_area', 'reserved_region', 'decoration_only_edge', 'no_text_or_logos']] + state_id: NotRequired[builtins.str] + breakpoint_id: NotRequired[builtins.str] + region: Required[_ExternalCoreCanvasConstraintRegion] + +class _ExternalFormatsCanonicalCoordinatedPlacementsSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + max_chars: NotRequired[builtins.int] + max_size_kb: NotRequired[builtins.int] + pixel_ratios: NotRequired[builtins.list[builtins.float]] + required_pixel_ratios: NotRequired[builtins.list[builtins.float]] + logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] + description: NotRequired[builtins.str] + consumed_for_production: NotRequired[builtins.bool] + +class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItem(TypedDict, total=False): + component_id: Required[builtins.str] + placement_ref: Required[_ExternalCorePlacementRef] + required: Required[builtins.bool] + sequence: NotRequired[builtins.int] + serving_policy: NotRequired[Literal['seller_served_only', 'third_party_allowed']] + canvas_constraints: NotRequired[builtins.list[_ExternalCoreCanvasConstraint]] + format_option_ref: NotRequired[_ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant1 | _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant2] + format_kind: NotRequired[builtins.str] + params: NotRequired[builtins.dict[builtins.str, Any]] -class _ExternalCoreProvenanceDisclosureJurisdictionsItem(TypedDict, total=False): - country: Required[builtins.str] - region: NotRequired[builtins.str] - regulation: Required[builtins.str] - label_text: NotRequired[builtins.str] - render_guidance: NotRequired[_ExternalCoreProvenanceDisclosureJurisdictionsItemRenderGuidance] +class _ExternalFormatsCanonicalCoordinatedPlacementsSharedSlotsItem(TypedDict, total=False): + asset_group_id: Required[builtins.str] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + required: NotRequired[builtins.bool] + min: NotRequired[builtins.int] + max: NotRequired[builtins.int] + consumed_by: Required[builtins.list[builtins.str]] class _BuildCreativeResponsePreviewPreviewsItemRendersItemVariant1Dimensions(TypedDict, total=False): width: Required[builtins.float] @@ -17971,7 +20741,7 @@ class _ExternalCoreDemographicTargetingResolutionExecutionVariant3(TypedDict, to class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -17984,25 +20754,13 @@ class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant1SlotsItem(Ty description: NotRequired[builtins.str] consumed_for_production: NotRequired[builtins.bool] -class _ExternalCoreDownstreamConnectionRequirement(TypedDict, total=False): - provider: NotRequired[builtins.str] - connection_type: Required[Literal['advertiser_account', 'publisher_identity', 'post_authorization']] - required_for: NotRequired[builtins.list[builtins.str]] - scope: NotRequired[Literal['account', 'identity', 'post', 'unknown']] - status: NotRequired[Literal['connected', 'missing', 'pending', 'expired', 'revoked', 'not_required', 'unknown']] - connection_id: NotRequired[builtins.str] - resource_ref: NotRequired[_ExternalCoreDownstreamConnectionRequirementResourceRef] - authorization_url: NotRequired[builtins.str] - authorization_instructions: NotRequired[builtins.str] - expires_at: NotRequired[builtins.str] - class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant1SizesItem(TypedDict, total=False): width: Required[builtins.int] height: Required[builtins.int] class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18021,7 +20779,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant2SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18040,7 +20798,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant3SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18059,7 +20817,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant1ParamsVariant4SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18078,7 +20836,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant1SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18097,7 +20855,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant2SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18116,7 +20874,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant3SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18135,7 +20893,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant2ParamsVariant4SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18154,7 +20912,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant1SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18173,7 +20931,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant2SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18192,7 +20950,7 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant3SizesItem(Ty class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18209,322 +20967,9 @@ class _ExternalCorePackageFormatsToProvideItemVariant3ParamsVariant4SizesItem(Ty width: Required[builtins.int] height: Required[builtins.int] -class _ExternalFormatsCanonicalImageCarouselSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalVideoHostedSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalVideoVastSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalAudioHostedSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalAudioDaastSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSponsoredPlacementSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalNativeInFeedSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalNativeInFeedMainImageSizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _ExternalFormatsCanonicalNativeInFeedIconSize(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _ExternalFormatsCanonicalResponsiveCreativeSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalAgentPlacementSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplaySlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItem(TypedDict, total=False): - state_id: Required[builtins.str] - anchoring: Required[Literal['inline', 'sticky_top', 'sticky_bottom', 'overlay', 'fullscreen_overlay', 'underlay']] - slot_bindings: NotRequired[builtins.list[builtins.str]] - motion: NotRequired[Literal['static', 'animated']] - max_animation_s: NotRequired[builtins.float] - breakpoints: Required[builtins.list[_ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItemBreakpointsItem]] - close_affordance: Required[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant1(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['timer']] - input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] - media_event: NotRequired[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['instant', 'animated']] - delay_ms: Required[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: NotRequired[builtins.float] - scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: NotRequired[builtins.float] - scroll_end_percent: NotRequired[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant2(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['in_view_timer']] - input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] - media_event: NotRequired[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['instant', 'animated']] - delay_ms: Required[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: NotRequired[builtins.float] - scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: NotRequired[builtins.float] - scroll_end_percent: NotRequired[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant3(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['scroll_threshold']] - input: Required[Literal['scroll']] - media_event: NotRequired[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['instant', 'animated']] - delay_ms: NotRequired[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: Required[builtins.float] - scroll_reference: Required[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: NotRequired[builtins.float] - scroll_end_percent: NotRequired[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant4(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['scroll_progress']] - input: Required[Literal['scroll']] - media_event: NotRequired[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['scroll_linked']] - delay_ms: NotRequired[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: NotRequired[builtins.float] - scroll_reference: Required[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: Required[builtins.float] - scroll_end_percent: Required[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant5(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['user_action']] - input: Required[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] - media_event: NotRequired[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['instant', 'animated']] - delay_ms: NotRequired[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: NotRequired[builtins.float] - scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: NotRequired[builtins.float] - scroll_end_percent: NotRequired[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayTransitionsItemVariant6(TypedDict, total=False): - transition_id: Required[builtins.str] - from_state_id: Required[builtins.str] - to_state_id: Required[builtins.str] - trigger: Required[Literal['media_event']] - input: NotRequired[Literal['tap', 'hover', 'swipe_up', 'swipe_down', 'swipe_left', 'swipe_right', 'scroll', 'expand_control', 'collapse_control']] - media_event: Required[Literal['video_start', 'video_complete']] - direction: NotRequired[Literal['down', 'up']] - transition_mode: Required[Literal['instant', 'animated']] - delay_ms: NotRequired[builtins.int] - duration_ms: NotRequired[builtins.int] - scroll_threshold_percent: NotRequired[builtins.float] - scroll_reference: NotRequired[Literal['document_progress', 'containing_scroller_progress']] - scroll_start_percent: NotRequired[builtins.float] - scroll_end_percent: NotRequired[builtins.float] - preserve_playback: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayUserControls(TypedDict, total=False): - dismissible: Required[builtins.bool] - user_collapsible: Required[builtins.bool] - -class _ExternalCoreCanvasConstraint(TypedDict, total=False): - constraint: Required[Literal['safe_area', 'reserved_region', 'decoration_only_edge', 'no_text_or_logos']] - state_id: NotRequired[builtins.str] - breakpoint_id: NotRequired[builtins.str] - region: Required[_ExternalCoreCanvasConstraintRegion] - -class _ExternalFormatsCanonicalCoordinatedPlacementsSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItem(TypedDict, total=False): - component_id: Required[builtins.str] - placement_ref: Required[_ExternalCorePlacementRef] - required: Required[builtins.bool] - sequence: NotRequired[builtins.int] - serving_policy: NotRequired[Literal['seller_served_only', 'third_party_allowed']] - canvas_constraints: NotRequired[builtins.list[_ExternalCoreCanvasConstraint]] - format_option_ref: NotRequired[_ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant1 | _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant2] - format_kind: NotRequired[builtins.str] - params: NotRequired[builtins.dict[builtins.str, Any]] - -class _ExternalFormatsCanonicalCoordinatedPlacementsSharedSlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - consumed_by: Required[builtins.list[builtins.str]] - class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18543,7 +20988,7 @@ class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant1SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18562,7 +21007,7 @@ class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant2SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18581,7 +21026,7 @@ class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant3SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18600,7 +21045,7 @@ class _ExternalCorePackageFormatsPendingItemVariant1ParamsVariant4SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18619,7 +21064,7 @@ class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant1SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18638,7 +21083,7 @@ class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant2SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18657,7 +21102,7 @@ class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant3SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18676,7 +21121,7 @@ class _ExternalCorePackageFormatsPendingItemVariant2ParamsVariant4SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18695,7 +21140,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant1SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18714,7 +21159,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant2SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18733,7 +21178,7 @@ class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant3SizesItem(Type class _ExternalCorePackageFormatsPendingItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -18782,6 +21227,40 @@ class _ExternalCoreAttestationCapabilitiesAcceptedIssuersItemResolversItem(Typed url: Required[builtins.str] authentication: Required[Literal['none', 'evaluator_managed']] +class _ExternalCoreReportingDeliveryOfferingReportingProfile(TypedDict, total=False): + id: Required[builtins.str] + version: Required[builtins.str] + schema_uri: Required[builtins.str] + schema_sha256: Required[builtins.str] + schema_dialect: Required[Literal['https://json-schema.org/draft/2020-12/schema']] + schema_ref_policy: Required[Literal['local_fragment_only']] + grain: Required[builtins.str] + primary_keys: Required[builtins.list[builtins.str]] + canonicalization_id: Required[builtins.str] + canonicalization_contract_version: Required[Literal['1.0']] + canonicalization_media_type: Required[Literal['application/vnd.adcp.reporting-canonicalization+json']] + canonicalization_uri: Required[builtins.str] + canonicalization_sha256: Required[builtins.str] + +class _ExternalCoreReportingScheduleOffering(TypedDict, total=False): + period_duration: Required[builtins.str] + alignment: Required[Literal['utc', 'account_timezone', 'billing_cycle']] + period_anchor_policy: NotRequired[Literal['fixed', 'configurable']] + period_anchor: NotRequired[builtins.str] + period_timezone: NotRequired[builtins.str] + delivery_sla: Required[builtins.str] + +class _ExternalCoreReportingDeliveryOfferingMethod(TypedDict, total=False): + pattern: Required[Literal['file_transfer', 'dataset_share', 'warehouse_materialization']] + transport: Required[builtins.str] + orchestration: Required[Literal['producer_managed', 'consumer_managed']] + destination_modes: Required[builtins.list[Literal['provision', 'existing']]] + provider: NotRequired[_ExternalCoreReportingDeliveryOfferingMethodProvider] + format: NotRequired[Literal['jsonl', 'csv', 'parquet', 'avro', 'orc']] + access_mode: NotRequired[builtins.str] + producer_identity: NotRequired[_ExternalCoreReportingDeliveryOfferingMethodProducerIdentity] + reader_compatibility: NotRequired[builtins.list[builtins.str]] + class _ScopeCapability(TypedDict, total=False): fixed: NotRequired[_PolicyProfile] seller_optimized: NotRequired[_PolicyProfile] @@ -18806,434 +21285,50 @@ class _ExternalCorePostalAreaSupport(TypedDict, total=False): ZA: NotRequired[builtins.list[Literal['postal_code']]] us_zip: NotRequired[builtins.bool] us_zip_plus_four: NotRequired[builtins.bool] - gb_outward: NotRequired[builtins.bool] - gb_full: NotRequired[builtins.bool] - ca_fsa: NotRequired[builtins.bool] - ca_full: NotRequired[builtins.bool] - de_plz: NotRequired[builtins.bool] - fr_code_postal: NotRequired[builtins.bool] - au_postcode: NotRequired[builtins.bool] - ch_plz: NotRequired[builtins.bool] - at_plz: NotRequired[builtins.bool] - -class _ExternalCoreGeoPlaceSupport(TypedDict, total=False): - countries: Required[builtins.dict[builtins.str, builtins.list[Literal['airport', 'borough', 'city', 'city_region', 'commune', 'county', 'district', 'municipality', 'neighborhood', 'post_town', 'prefecture', 'province', 'quarter', 'state', 'territory', 'ward'] | builtins.str]]] - catalog: Required[_ExternalCoreGeoPlaceCatalogCapability] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingAgeRestriction(TypedDict, total=False): - supported: NotRequired[builtins.bool] - verification_methods: NotRequired[builtins.list[Literal['facial_age_estimation', 'id_document', 'digital_id', 'credit_card', 'world_id']]] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingDemographics(TypedDict, total=False): - supported: Required[builtins.bool] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingLanguageVariant2(TypedDict, total=False): - supported: NotRequired[builtins.bool] - supported_languages: NotRequired[builtins.list[builtins.str]] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingKeywordTargets(TypedDict, total=False): - supported_match_types: Required[builtins.list[Literal['broad', 'phrase', 'exact']]] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingNegativeKeywords(TypedDict, total=False): - supported_match_types: Required[builtins.list[Literal['broad', 'phrase', 'exact']]] - -class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingGeoProximity(TypedDict, total=False): - radius: NotRequired[builtins.bool] - travel_time: NotRequired[builtins.bool] - geometry: NotRequired[builtins.bool] - transport_modes: NotRequired[builtins.list[Literal['walking', 'cycling', 'driving', 'public_transport']]] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - motion_level: NotRequired[Literal['static', 'limited_motion']] - width: Required[builtins.int] - height: Required[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1SizesItem]] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - aspect_ratio: NotRequired[builtins.str] - max_file_size_kb: NotRequired[builtins.int] - image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] - ssl_required: NotRequired[builtins.bool] - headline_max_chars: NotRequired[builtins.int] - body_text_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - motion_level: NotRequired[Literal['static', 'limited_motion']] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: Required[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2SizesItem]] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - aspect_ratio: NotRequired[builtins.str] - max_file_size_kb: NotRequired[builtins.int] - image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] - ssl_required: NotRequired[builtins.bool] - headline_max_chars: NotRequired[builtins.int] - body_text_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - motion_level: NotRequired[Literal['static', 'limited_motion']] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3SizesItem]] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - aspect_ratio: NotRequired[builtins.str] - max_file_size_kb: NotRequired[builtins.int] - image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] - ssl_required: NotRequired[builtins.bool] - headline_max_chars: NotRequired[builtins.int] - body_text_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] + gb_outward: NotRequired[builtins.bool] + gb_full: NotRequired[builtins.bool] + ca_fsa: NotRequired[builtins.bool] + ca_full: NotRequired[builtins.bool] + de_plz: NotRequired[builtins.bool] + fr_code_postal: NotRequired[builtins.bool] + au_postcode: NotRequired[builtins.bool] + ch_plz: NotRequired[builtins.bool] + at_plz: NotRequired[builtins.bool] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - motion_level: NotRequired[Literal['static', 'limited_motion']] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4SizesItem]] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - aspect_ratio: NotRequired[builtins.str] - max_file_size_kb: NotRequired[builtins.int] - image_formats: NotRequired[builtins.list[Literal['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']]] - ssl_required: NotRequired[builtins.bool] - headline_max_chars: NotRequired[builtins.int] - body_text_max_chars: NotRequired[builtins.int] - cta_values: NotRequired[builtins.list[builtins.str]] - asset_source: NotRequired[Literal['buyer_uploaded', 'publisher_host_recorded', 'seller_pre_rendered_from_brief', 'seller_human_designed', 'agent_synthesized', 'publisher_owned_reference']] - buyer_asset_acceptance: NotRequired[Literal['accepted', 'rejected']] - ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] - activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] +class _ExternalCoreGeoPlaceSupport(TypedDict, total=False): + countries: Required[builtins.dict[builtins.str, builtins.list[Literal['airport', 'borough', 'city', 'city_region', 'commune', 'county', 'district', 'municipality', 'neighborhood', 'post_town', 'prefecture', 'province', 'quarter', 'state', 'territory', 'ward'] | builtins.str]]] + catalog: Required[_ExternalCoreGeoPlaceCatalogCapability] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: Required[builtins.int] - height: Required[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - max_initial_load_kb: NotRequired[builtins.int] - max_polite_load_kb: NotRequired[builtins.int] - host_initiated_subload: NotRequired[builtins.bool] - max_animation_duration_ms: NotRequired[builtins.int] - max_cpu_load_percent: NotRequired[builtins.int] - mraid_required: NotRequired[builtins.bool] - mraid_version: NotRequired[Literal['2.0', '3.0']] - om_sdk_required: NotRequired[builtins.bool] - clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingAgeRestriction(TypedDict, total=False): + supported: NotRequired[builtins.bool] + verification_methods: NotRequired[builtins.list[Literal['facial_age_estimation', 'id_document', 'digital_id', 'credit_card', 'world_id']]] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: Required[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - max_initial_load_kb: NotRequired[builtins.int] - max_polite_load_kb: NotRequired[builtins.int] - host_initiated_subload: NotRequired[builtins.bool] - max_animation_duration_ms: NotRequired[builtins.int] - max_cpu_load_percent: NotRequired[builtins.int] - mraid_required: NotRequired[builtins.bool] - mraid_version: NotRequired[Literal['2.0', '3.0']] - om_sdk_required: NotRequired[builtins.bool] - clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingDemographics(TypedDict, total=False): + supported: Required[builtins.bool] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - max_initial_load_kb: NotRequired[builtins.int] - max_polite_load_kb: NotRequired[builtins.int] - host_initiated_subload: NotRequired[builtins.bool] - max_animation_duration_ms: NotRequired[builtins.int] - max_cpu_load_percent: NotRequired[builtins.int] - mraid_required: NotRequired[builtins.bool] - mraid_version: NotRequired[Literal['2.0', '3.0']] - om_sdk_required: NotRequired[builtins.bool] - clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingLanguageVariant2(TypedDict, total=False): + supported: NotRequired[builtins.bool] + supported_languages: NotRequired[builtins.list[builtins.str]] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - max_initial_load_kb: NotRequired[builtins.int] - max_polite_load_kb: NotRequired[builtins.int] - host_initiated_subload: NotRequired[builtins.bool] - max_animation_duration_ms: NotRequired[builtins.int] - max_cpu_load_percent: NotRequired[builtins.int] - mraid_required: NotRequired[builtins.bool] - mraid_version: NotRequired[Literal['2.0', '3.0']] - om_sdk_required: NotRequired[builtins.bool] - clicktag_macro: NotRequired[Literal['clickTag', 'clickTAG']] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - ssl_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingKeywordTargets(TypedDict, total=False): + supported_match_types: Required[builtins.list[Literal['broad', 'phrase', 'exact']]] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: Required[builtins.int] - height: Required[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] - ssl_required: NotRequired[builtins.bool] - max_redirect_depth: NotRequired[builtins.int] - max_response_time_ms: NotRequired[builtins.int] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - om_sdk_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingNegativeKeywords(TypedDict, total=False): + supported_match_types: Required[builtins.list[Literal['broad', 'phrase', 'exact']]] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: Required[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] - ssl_required: NotRequired[builtins.bool] - max_redirect_depth: NotRequired[builtins.int] - max_response_time_ms: NotRequired[builtins.int] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - om_sdk_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyExecutionTargetingGeoProximity(TypedDict, total=False): + radius: NotRequired[builtins.bool] + travel_time: NotRequired[builtins.bool] + geometry: NotRequired[builtins.bool] + transport_modes: NotRequired[builtins.list[Literal['walking', 'cycling', 'driving', 'public_transport']]] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] - ssl_required: NotRequired[builtins.bool] - max_redirect_depth: NotRequired[builtins.int] - max_response_time_ms: NotRequired[builtins.int] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - om_sdk_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant2BuyerAgent(TypedDict, total=False): + agent_url: Required[builtins.str] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4(TypedDict, total=False): - experimental: NotRequired[builtins.bool] - deprecated: NotRequired[builtins.bool] - v1_translatable: NotRequired[builtins.bool] - since_version: NotRequired[builtins.str] - migration_target_version: NotRequired[builtins.str] - composition_model: NotRequired[Literal['deterministic', 'algorithmic']] - provenance_required: NotRequired[builtins.bool] - platform_extensions: NotRequired[builtins.list[_ExternalCorePlatformExtensionRef]] - synthesis_nondeterministic: NotRequired[builtins.bool] - slots: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4SlotsItem]] - required_connections: NotRequired[builtins.list[_ExternalCoreDownstreamConnectionRequirement]] - reference_mutability: NotRequired[Literal['immutable_snapshot', 'mutable_requires_reapproval', 'mutable_auto_recheck']] - production_window_business_days: NotRequired[builtins.int] - width: NotRequired[builtins.int] - height: NotRequired[builtins.int] - sizes: NotRequired[builtins.list[_GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4SizesItem]] - min_width: NotRequired[builtins.int] - max_width: NotRequired[builtins.int] - min_height: NotRequired[builtins.int] - max_height: NotRequired[builtins.int] - supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] - ssl_required: NotRequired[builtins.bool] - max_redirect_depth: NotRequired[builtins.int] - max_response_time_ms: NotRequired[builtins.int] - backup_image_required: NotRequired[builtins.bool] - backup_image_max_size_kb: NotRequired[builtins.int] - om_sdk_required: NotRequired[builtins.bool] +class _GetAdcpCapabilitiesResponseMediaBuyAudienceTargetingSupportedActivationMethodsItemVariant4ConsumerIdentitiesItem(TypedDict, total=False): + cloud: NotRequired[Literal['aws', 'azure', 'gcp']] + region: NotRequired[builtins.str] + identity: Required[builtins.str] class _ExternalCoreDeliveryMetricsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] @@ -19247,6 +21342,28 @@ class _ExternalCoreDeliveryMetricsDoohMetricsVenueBreakdownItem(TypedDict, total loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreDeliveryMetricsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreDeliveryMetricsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreDeliveryMetricsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreDeliveryMetricsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreDeliveryMetricsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreCreativeVariantReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -19259,6 +21376,28 @@ class _ExternalCoreCreativeVariantDoohMetricsVenueBreakdownItem(TypedDict, total loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreCreativeVariantOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreCreativeVariantOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreCreativeVariantOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreCreativeVariantViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreCreativeVariantViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreCreativeVariantManifestVariant1FormatOptionRefVariant1(TypedDict, total=False): scope: Required[Literal['publisher']] publisher_domain: Required[builtins.str] @@ -19295,6 +21434,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsDoohMetricsVenueBr loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -19307,6 +21468,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemDoohMetrics loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemMissingMetricsItemVariant1Qualifier(TypedDict, total=False): viewability_standard: NotRequired[Literal['mrc', 'groupm']] completion_source: NotRequired[Literal['seller_attested', 'vendor_attested']] @@ -19357,12 +21540,27 @@ class _ExternalCoreCatalogItemDeliveryMetricsDoohMetrics(TypedDict, total=False) calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsDoohMetricsVenueBreakdownItem]] +class _ExternalCoreCatalogItemDeliveryMetricsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreCatalogItemDeliveryMetricsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreCatalogItemDeliveryMetricsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreCatalogItemDeliveryMetricsByActionSourceItem(TypedDict, total=False): @@ -19407,12 +21605,27 @@ class _ExternalCoreCreativeDeliveryMetricsDoohMetrics(TypedDict, total=False): calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsDoohMetricsVenueBreakdownItem]] +class _ExternalCoreCreativeDeliveryMetricsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreCreativeDeliveryMetricsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreCreativeDeliveryMetricsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreCreativeDeliveryMetricsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreCreativeDeliveryMetricsByActionSourceItem(TypedDict, total=False): @@ -19457,12 +21670,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatIte calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemByActionSourceItem(TypedDict, total=False): @@ -19507,12 +21735,27 @@ class _ExternalCoreKeywordDeliveryMetricsDoohMetrics(TypedDict, total=False): calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsDoohMetricsVenueBreakdownItem]] +class _ExternalCoreKeywordDeliveryMetricsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreKeywordDeliveryMetricsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreKeywordDeliveryMetricsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreKeywordDeliveryMetricsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreKeywordDeliveryMetricsByActionSourceItem(TypedDict, total=False): @@ -19557,12 +21800,27 @@ class _ExternalCoreGeoDeliveryMetricsDoohMetrics(TypedDict, total=False): calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsDoohMetricsVenueBreakdownItem]] +class _ExternalCoreGeoDeliveryMetricsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _ExternalCoreGeoDeliveryMetricsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_ExternalCoreGeoDeliveryMetricsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_ExternalCoreGeoDeliveryMetricsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _ExternalCoreGeoDeliveryMetricsByActionSourceItem(TypedDict, total=False): @@ -19607,12 +21865,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTyp calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemByActionSourceItem(TypedDict, total=False): @@ -19657,12 +21930,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePla calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemByActionSourceItem(TypedDict, total=False): @@ -19707,12 +21995,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceI calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemByActionSourceItem(TypedDict, total=False): @@ -19757,12 +22060,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemograph calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemByActionSourceItem(TypedDict, total=False): @@ -19807,12 +22125,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacement calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemByActionSourceItem(TypedDict, total=False): @@ -19857,12 +22190,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemD calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemByActionSourceItem(TypedDict, total=False): @@ -19907,12 +22255,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsDoohMet calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsByActionSourceItem(TypedDict, total=False): @@ -19957,12 +22320,27 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItem calculation_notes: NotRequired[builtins.str] venue_breakdown: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemDoohMetricsVenueBreakdownItem]] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetrics(TypedDict, total=False): + panels: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPanelsItem]] + posting_period_start: NotRequired[builtins.str] + posting_period_end: NotRequired[builtins.str] + average_posted_date: NotRequired[builtins.str] + materials_timely: NotRequired[builtins.bool] + share_of_voice_contracted: NotRequired[builtins.float] + illuminated_hours: NotRequired[builtins.float] + estimated_impressions: NotRequired[builtins.int] + estimation_basis: NotRequired[Literal['currency_measured', 'seller_modeled']] + postings: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPostingsItem]] + calculation_notes: NotRequired[builtins.str] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewability(TypedDict, total=False): vendor: NotRequired[_ExternalCoreBrandRef] measurable_impressions: NotRequired[builtins.float] viewable_impressions: NotRequired[builtins.float] viewable_rate: NotRequired[builtins.float] viewed_seconds: NotRequired[builtins.float] + viewed_seconds_percentiles: NotRequired[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewabilityViewedSecondsPercentiles] + viewed_seconds_histogram: NotRequired[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewabilityViewedSecondsHistogramItem]] standard: NotRequired[Literal['mrc', 'groupm']] class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemByActionSourceItem(TypedDict, total=False): @@ -20212,6 +22590,10 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -20348,6 +22730,10 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 backup_image_max_size_kb: NotRequired[builtins.int] ssl_required: NotRequired[builtins.bool] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -20370,6 +22756,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20399,6 +22786,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20428,6 +22816,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20457,6 +22846,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20464,6 +22854,58 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 backup_image_max_size_kb: NotRequired[builtins.int] om_sdk_required: NotRequired[builtins.bool] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant4PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant5PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant6PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant7PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant8PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant9PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant10PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant11PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant12PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant13PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant14PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant15PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -20604,6 +23046,10 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1Pa ctv_ad_experience: NotRequired[Literal['menu', 'pause', 'screensaver', 'overlay', 'squeezeback', 'in_scene']] activation_methods: NotRequired[builtins.list[Literal['qr_code', 'deep_link', 'push_notification', 'email', 'tune_in', 'text_message']]] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -20740,6 +23186,10 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2Pa backup_image_max_size_kb: NotRequired[builtins.int] ssl_required: NotRequired[builtins.bool] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant1(TypedDict, total=False): experimental: NotRequired[builtins.bool] deprecated: NotRequired[builtins.bool] @@ -20762,6 +23212,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20791,6 +23242,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20820,6 +23272,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20849,6 +23302,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -20856,6 +23310,58 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa backup_image_max_size_kb: NotRequired[builtins.int] om_sdk_required: NotRequired[builtins.bool] +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant4PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant5PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant6PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant7PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant8PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant9PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant10PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant11PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant12PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant13PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant14PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + +class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant15PlacementRefsItem(TypedDict, total=False): + publisher_domain: Required[builtins.str] + placement_id: Required[builtins.str] + class _GetPlanAuditLogsResponsePlansItemSummaryDriftMetricsThresholds(TypedDict, total=False): escalation_rate_max: NotRequired[builtins.float] escalation_rate_min: NotRequired[builtins.float] @@ -20891,7 +23397,7 @@ class _ExternalCoreAttestationEvaluation(TypedDict, total=False): class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -20910,7 +23416,7 @@ class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant1SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -20929,7 +23435,7 @@ class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant2SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -20948,7 +23454,7 @@ class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant3SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -20967,7 +23473,7 @@ class _ExternalCoreProductFormatOptionsItemVariant1ParamsVariant4SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -20986,7 +23492,7 @@ class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant1SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21005,7 +23511,7 @@ class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant2SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21024,7 +23530,7 @@ class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant3SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21043,7 +23549,7 @@ class _ExternalCoreProductFormatOptionsItemVariant2ParamsVariant4SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21062,7 +23568,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant1SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21081,7 +23587,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant2SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21100,7 +23606,7 @@ class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant3SizesItem(Typed class _ExternalCoreProductFormatOptionsItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21415,6 +23921,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant1(TypedDict, t min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -21444,6 +23951,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant2(TypedDict, t min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -21473,6 +23981,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant3(TypedDict, t min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -21502,6 +24011,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant4(TypedDict, t min_height: NotRequired[builtins.int] max_height: NotRequired[builtins.int] supported_tag_types: NotRequired[builtins.list[Literal['iframe', 'javascript', '1x1_redirect']]] + supported_delivery_types: NotRequired[builtins.list[Literal['tag_url', 'inline_markup', 'paired_redirect']]] ssl_required: NotRequired[builtins.bool] max_redirect_depth: NotRequired[builtins.int] max_response_time_ms: NotRequired[builtins.int] @@ -21756,7 +24266,8 @@ class _ExternalCoreProductCardReferenceAssetAssetVariant3(TypedDict, total=False class _ExternalCoreProductCardReferenceAssetAssetVariant4(TypedDict, total=False): asset_type: Required[Literal['url']] url: Required[builtins.str] - url_type: NotRequired[Literal['clickthrough', 'tracker_pixel', 'tracker_script']] + url_type: NotRequired[Literal['clickthrough', 'ad_request', 'tracker_pixel', 'tracker_script']] + macro_declarations: NotRequired[builtins.list[_ExternalCoreProductCardReferenceAssetAssetVariant4MacroDeclarationsItem]] description: NotRequired[builtins.str] state_id: NotRequired[builtins.str] provenance: NotRequired[_ExternalCoreProvenance] @@ -21766,6 +24277,22 @@ class _ExternalCoreMaterialDeadline(TypedDict, total=False): due_at: Required[builtins.str] label: NotRequired[builtins.str] +class _ExternalCoreProductAudienceActivationMethodsItemVariant2BuyerAgent(TypedDict, total=False): + agent_url: Required[builtins.str] + +class _ExternalCoreProductAudienceActivationMethodsItemVariant4ConsumerIdentitiesItem(TypedDict, total=False): + cloud: NotRequired[Literal['aws', 'azure', 'gcp']] + region: NotRequired[builtins.str] + identity: Required[builtins.str] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant2BuyerAgent(TypedDict, total=False): + agent_url: Required[builtins.str] + +class _ExternalCoreProductAudienceActivationPreferredMethodVariant4ConsumerIdentitiesItem(TypedDict, total=False): + cloud: NotRequired[Literal['aws', 'azure', 'gcp']] + region: NotRequired[builtins.str] + identity: Required[builtins.str] + class _ExternalCorePackageSignalTargetingGroupSignalsItemVariant1(TypedDict, total=False): signal_ref: Required[_ExternalCorePackageSignalTargetingGroupSignalsItemVariant1SignalRefVariant1 | _ExternalCorePackageSignalTargetingGroupSignalsItemVariant1SignalRefVariant2 | _ExternalCorePackageSignalTargetingGroupSignalsItemVariant1SignalRefVariant3] value_type: Required[Literal['binary']] @@ -21929,7 +24456,7 @@ class _ExternalCoreRequirementsCatalogRequirementsFieldBindingsItemVariant3(Type class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21948,7 +24475,7 @@ class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant1SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21967,7 +24494,7 @@ class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant2SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -21986,7 +24513,7 @@ class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant3SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22005,7 +24532,7 @@ class _ExternalCoreFormatCanonicalParametersVariant1ParamsVariant4SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22024,7 +24551,7 @@ class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant1SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22043,7 +24570,7 @@ class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant2SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22062,7 +24589,7 @@ class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant3SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22081,7 +24608,7 @@ class _ExternalCoreFormatCanonicalParametersVariant2ParamsVariant4SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22100,7 +24627,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant1SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22119,7 +24646,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant2SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22138,7 +24665,7 @@ class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant3SizesItem(Type class _ExternalCoreFormatCanonicalParametersVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22229,7 +24756,7 @@ class _ExternalCoreBiddingPolicyCapability(TypedDict, total=False): class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22248,7 +24775,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant1SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22267,7 +24794,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant2SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22286,7 +24813,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant3SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22305,7 +24832,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant1ParamsVariant4SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22324,7 +24851,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant1SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22343,7 +24870,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant2SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22362,7 +24889,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant3SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22381,7 +24908,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant2ParamsVariant4SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22400,7 +24927,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant1SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22419,7 +24946,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant2SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22438,7 +24965,7 @@ class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant3SizesItem(Ty class _ExternalCoreTransformerInputFormatsItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -22521,6 +25048,36 @@ class _PreviewCreativeResponseResultsItemVariant2ResponsePreviewsItemInput(Typed macros: NotRequired[builtins.dict[builtins.str, builtins.str]] context_description: NotRequired[builtins.str] +class _ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant1(TypedDict, total=False): + mode: Required[Literal['existing']] + destination_ref: Required[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant2(TypedDict, total=False): + mode: Required[Literal['provision']] + provider: Required[_ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant2Provider] + location: Required[builtins.str] + access_mode: NotRequired[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant1(TypedDict, total=False): + mode: Required[Literal['existing']] + destination_ref: Required[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2(TypedDict, total=False): + mode: Required[Literal['provision']] + provider: Required[_ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2Provider] + access_mode: Required[builtins.str] + recipient: Required[_ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2Recipient] + +class _ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant1(TypedDict, total=False): + mode: Required[Literal['existing']] + destination_ref: Required[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant2(TypedDict, total=False): + mode: Required[Literal['provision']] + provider: Required[_ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant2Provider] + location: Required[builtins.str] + access_mode: NotRequired[builtins.str] + class _ExternalCoreCatalogItemAvailabilityErrorIssuesItemDiscriminatorItem(TypedDict, total=False): property_name: Required[builtins.str] value: Required[builtins.str | builtins.float | builtins.bool | None] @@ -22861,6 +25418,41 @@ class _ExternalCoreProvenanceDisclosureJurisdictionsItemRenderGuidance(TypedDict positions: NotRequired[builtins.list[Literal['prominent', 'footer', 'audio', 'subtitle', 'overlay', 'end_card', 'pre_roll', 'companion']]] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreDownstreamConnectionRequirementResourceRef(TypedDict, total=False): + platform_account_id: NotRequired[builtins.str] + identity_id: NotRequired[builtins.str] + handle: NotRequired[builtins.str] + profile_url: NotRequired[builtins.str] + post_id: NotRequired[builtins.str] + post_url: NotRequired[builtins.str] + +class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItemBreakpointsItem(TypedDict, total=False): + breakpoint_id: Required[builtins.str] + width: NotRequired[builtins.int] + width_range: NotRequired[builtins.list[builtins.int]] + width_mode: NotRequired[Literal['full_bleed', 'gutter_residual']] + height: NotRequired[builtins.int] + height_range: NotRequired[builtins.list[builtins.int]] + viewport_height_percent: NotRequired[builtins.float] + canvas_aspect_ratio: NotRequired[builtins.str] + +class _ExternalCoreCanvasConstraintRegion(TypedDict, total=False): + x: Required[builtins.float] + y: Required[builtins.float] + width: Required[builtins.float] + height: Required[builtins.float] + unit: NotRequired[Literal['px', 'percent']] + +class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant1(TypedDict, total=False): + scope: Required[Literal['publisher']] + publisher_domain: Required[builtins.str] + format_option_id: Required[builtins.str] + +class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant2(TypedDict, total=False): + scope: Required[Literal['product']] + format_option_id: Required[builtins.str] + publisher_domain: NotRequired[Never] + class _ExternalCorePlannedDeliveryBudgetAllocationVariant2OptimizationGoalsItemVariant1TargetFrequencyWindow(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -22948,40 +25540,14 @@ class _ExternalCoreDemographicTargetingResolutionExecutionVariant3SignalRefsItem signal_source_url: Required[builtins.str] signal_id: Required[builtins.str] -class _ExternalCoreDownstreamConnectionRequirementResourceRef(TypedDict, total=False): - platform_account_id: NotRequired[builtins.str] - identity_id: NotRequired[builtins.str] - handle: NotRequired[builtins.str] - profile_url: NotRequired[builtins.str] - post_id: NotRequired[builtins.str] - post_url: NotRequired[builtins.str] - -class _ExternalFormatsCanonicalSellerRenderedStatefulDisplayStatesItemBreakpointsItem(TypedDict, total=False): - breakpoint_id: Required[builtins.str] - width: NotRequired[builtins.int] - width_range: NotRequired[builtins.list[builtins.int]] - width_mode: NotRequired[Literal['full_bleed', 'gutter_residual']] - height: NotRequired[builtins.int] - height_range: NotRequired[builtins.list[builtins.int]] - viewport_height_percent: NotRequired[builtins.float] - canvas_aspect_ratio: NotRequired[builtins.str] - -class _ExternalCoreCanvasConstraintRegion(TypedDict, total=False): - x: Required[builtins.float] - y: Required[builtins.float] - width: Required[builtins.float] - height: Required[builtins.float] - unit: NotRequired[Literal['px', 'percent']] - -class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant1(TypedDict, total=False): - scope: Required[Literal['publisher']] - publisher_domain: Required[builtins.str] - format_option_id: Required[builtins.str] +class _ExternalCoreReportingDeliveryOfferingMethodProvider(TypedDict, total=False): + domain: Required[builtins.str] -class _ExternalFormatsCanonicalCoordinatedPlacementsComponentsItemFormatOptionRefVariant2(TypedDict, total=False): - scope: Required[Literal['product']] - format_option_id: Required[builtins.str] - publisher_domain: NotRequired[Never] +class _ExternalCoreReportingDeliveryOfferingMethodProducerIdentity(TypedDict, total=False): + provider: Required[_ExternalCoreReportingDeliveryOfferingMethodProducerIdentityProvider] + identity: Required[builtins.str] + cloud: NotRequired[Literal['aws', 'azure', 'gcp']] + region: NotRequired[builtins.str] class _PolicyProfile(TypedDict, total=False): modes: NotRequired[builtins.list[Literal['automatic', 'bid_amount', 'max_bid', 'cost_per', 'roas']]] @@ -22995,233 +25561,28 @@ class _ExternalCoreGeoPlaceCatalogCapability(TypedDict, total=False): supported_versions: Required[builtins.list[builtins.str]] resolver: Required[_ExternalCoreGeoPlaceResolver] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant1SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant2SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant3SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant1ParamsVariant4SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant1SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant2SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant3SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant2ParamsVariant4SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant1SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] - -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant2SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] +class _ExternalCoreDeliveryMetricsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] +class _ExternalCorePlacementEvidence(TypedDict, total=False): + url: Required[builtins.str] + captured_at: NotRequired[builtins.str] + latitude: NotRequired[builtins.float] + longitude: NotRequired[builtins.float] + notes: NotRequired[builtins.str] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant3SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] +class _ExternalCoreCreativeVariantOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4SlotsItem(TypedDict, total=False): - asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] - required: NotRequired[builtins.bool] - min: NotRequired[builtins.int] - max: NotRequired[builtins.int] - max_chars: NotRequired[builtins.int] - max_size_kb: NotRequired[builtins.int] - pixel_ratios: NotRequired[builtins.list[builtins.float]] - required_pixel_ratios: NotRequired[builtins.list[builtins.float]] - logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - required_logo_slots: NotRequired[builtins.list[Literal['logo_card_light', 'logo_card_dark', 'profile_mark', 'favicon', 'app_icon', 'social_profile_mark', 'nav_header', 'footer', 'email_header', 'watermark', 'ad_end_card', 'co_brand_lockup', 'marketplace_listing']]] - description: NotRequired[builtins.str] - consumed_for_production: NotRequired[builtins.bool] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemTotalsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] -class _GetAdcpCapabilitiesResponseCreativeSupportedFormatsItemFormatVariant3ParamsVariant4SizesItem(TypedDict, total=False): - width: Required[builtins.int] - height: Required[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] class _ExternalCoreCatalogItemDeliveryMetricsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] @@ -23235,6 +25596,28 @@ class _ExternalCoreCatalogItemDeliveryMetricsDoohMetricsVenueBreakdownItem(Typed loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreCatalogItemDeliveryMetricsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreCatalogItemDeliveryMetricsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreCatalogItemDeliveryMetricsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreCatalogItemDeliveryMetricsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreCatalogItemDeliveryMetricsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreCreativeDeliveryMetricsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23247,6 +25630,28 @@ class _ExternalCoreCreativeDeliveryMetricsDoohMetricsVenueBreakdownItem(TypedDic loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreCreativeDeliveryMetricsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreCreativeDeliveryMetricsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreCreativeDeliveryMetricsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreCreativeDeliveryMetricsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreCreativeDeliveryMetricsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23259,6 +25664,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatIte loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreKeywordDeliveryMetricsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23271,6 +25698,28 @@ class _ExternalCoreKeywordDeliveryMetricsDoohMetricsVenueBreakdownItem(TypedDict loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreKeywordDeliveryMetricsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreKeywordDeliveryMetricsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreKeywordDeliveryMetricsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreKeywordDeliveryMetricsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreKeywordDeliveryMetricsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _ExternalCoreGeoDeliveryMetricsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23283,6 +25732,28 @@ class _ExternalCoreGeoDeliveryMetricsDoohMetricsVenueBreakdownItem(TypedDict, to loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _ExternalCoreGeoDeliveryMetricsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_ExternalCoreGeoDeliveryMetricsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _ExternalCoreGeoDeliveryMetricsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _ExternalCoreGeoDeliveryMetricsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _ExternalCoreGeoDeliveryMetricsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23295,6 +25766,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTyp loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23307,6 +25800,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePla loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23319,6 +25834,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceI loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23331,6 +25868,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemograph loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23343,6 +25902,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacement loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23355,6 +25936,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemD loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23367,6 +25970,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsDoohMet loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemReachWindowPeriod(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23379,6 +26004,28 @@ class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItem loop_plays: NotRequired[builtins.int] screens_used: NotRequired[builtins.int] +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPanelsItem(TypedDict, total=False): + identifiers: Required[builtins.list[_GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPanelsItemIdentifiersItem]] + name: NotRequired[builtins.str] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPostingsItem(TypedDict, total=False): + panel_id: Required[builtins.str] + event_type: NotRequired[Literal['posted', 'rotated', 'repaired', 'removed']] + occurred_at: Required[builtins.str] + evidence: NotRequired[_ExternalCorePlacementEvidence] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewabilityViewedSecondsPercentiles(TypedDict, total=False): + p25: Required[builtins.float] + p50: Required[builtins.float] + p75: Required[builtins.float] + p90: Required[builtins.float] + p95: Required[builtins.float] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemViewabilityViewedSecondsHistogramItem(TypedDict, total=False): + lower_bound_seconds: Required[builtins.float] + upper_bound_seconds: NotRequired[builtins.float] + impressions: Required[builtins.int] + class _GetMediaBuysResponseMediaBuysItemBudgetAllocationVariant2OptimizationGoalsItemVariant1TargetFrequencyWindow(TypedDict, total=False): interval: Required[builtins.int] unit: Required[Literal['seconds', 'minutes', 'hours', 'days', 'campaign']] @@ -23405,7 +26052,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemOptimizationGoalsItemVariant class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23424,7 +26071,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23443,7 +26090,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23462,7 +26109,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23481,7 +26128,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant1 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23500,7 +26147,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23519,7 +26166,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23538,7 +26185,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23557,7 +26204,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant2 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23576,7 +26223,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23595,7 +26242,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23614,7 +26261,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23633,7 +26280,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsToProvideItemVariant3 class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23652,7 +26299,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23671,7 +26318,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23690,7 +26337,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23709,7 +26356,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant1Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23728,7 +26375,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23747,7 +26394,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23766,7 +26413,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23785,7 +26432,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant2Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23804,7 +26451,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23823,7 +26470,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23842,7 +26489,7 @@ class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3Pa class _GetMediaBuysResponseMediaBuysItemPackagesItemFormatsPendingItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23866,7 +26513,7 @@ class _ExternalCoreAttestationEvaluationActionBinding(TypedDict, total=False): class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23885,7 +26532,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant1SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23904,7 +26551,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant2SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23923,7 +26570,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant3SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23942,7 +26589,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant1ParamsVariant4SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23961,7 +26608,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant1SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23980,7 +26627,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant2SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -23999,7 +26646,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant3SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -24018,7 +26665,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant2ParamsVariant4SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant1SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -24037,7 +26684,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant1SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant2SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -24056,7 +26703,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant2SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant3SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -24075,7 +26722,7 @@ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant3SizesItem(Typ class _ExternalCorePlacementFormatOptionsItemVariant3ParamsVariant4SlotsItem(TypedDict, total=False): asset_group_id: Required[builtins.str] - asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] + asset_type: Required[Literal['image', 'video', 'audio', 'text', 'markdown', 'url', 'html', 'css', 'javascript', 'vast', 'daast', 'display_tag', 'webhook', 'brief', 'catalog', 'published_post', 'zip', 'card', 'object', 'pixel_tracker', 'vast_tracker', 'daast_tracker']] required: NotRequired[builtins.bool] min: NotRequired[builtins.int] max: NotRequired[builtins.int] @@ -24105,7 +26752,24 @@ class _ExternalCoreForecastPointViewabilityViewableRate(TypedDict, total=False): class _ExternalCoreDemographicReportingCapabilityAgeIntervalsItem(TypedDict, total=False): age: Required[_ExternalCoreDemographicAgeRange] demographic: NotRequired[builtins.str] - demographic_system: NotRequired[Literal['nielsen', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + demographic_system: NotRequired[Literal['nielsen', 'nielsen_audio', 'barb', 'agf', 'oztam', 'mediametrie', 'custom']] + +class _ExternalCoreProductCardReferenceAssetAssetVariant4MacroDeclarationsItem(TypedDict, total=False): + declaration_id: Required[builtins.str] + token: Required[builtins.str] + dialect: Required[Literal['adcp', 'iab_vast', 'iab_daast', 'vendor', 'unknown']] + dialect_namespace: NotRequired[builtins.str] + dialect_revision: NotRequired[builtins.str] + dialect_semantic: Required[builtins.str] + mapping_status: Required[Literal['verified_universal', 'dialect_defined', 'unresolved']] + universal_semantic: NotRequired[Literal['MEDIA_BUY_ID', 'PACKAGE_ID', 'CREATIVE_ID', 'CACHEBUSTER', 'TIMESTAMP', 'CLICK_URL', 'GDPR', 'GDPR_CONSENT', 'US_PRIVACY', 'GPP_STRING', 'GPP_SID', 'IP_ADDRESS', 'LIMIT_AD_TRACKING', 'DEVICE_TYPE', 'OS', 'OS_VERSION', 'DEVICE_MAKE', 'DEVICE_MODEL', 'USER_AGENT', 'APP_BUNDLE', 'APP_NAME', 'COUNTRY', 'REGION', 'CITY', 'ZIP', 'DMA', 'LAT', 'LONG', 'DEVICE_ID', 'DEVICE_ID_TYPE', 'DOMAIN', 'PAGE_URL', 'REFERRER', 'KEYWORDS', 'PLACEMENT_ID', 'FOLD_POSITION', 'AD_WIDTH', 'AD_HEIGHT', 'VIDEO_ID', 'VIDEO_TITLE', 'VIDEO_DURATION', 'VIDEO_CATEGORY', 'CONTENT_GENRE', 'CONTENT_RATING', 'PLAYER_WIDTH', 'PLAYER_HEIGHT', 'POD_POSITION', 'POD_SIZE', 'AD_BREAK_ID', 'STATION_ID', 'COLLECTION_NAME', 'INSTALLMENT_ID', 'AUDIO_DURATION', 'TMPX', 'IMPRESSION_ID', 'AXEM', 'CATALOG_ID', 'SKU', 'GTIN', 'OFFERING_ID', 'JOB_ID', 'HOTEL_ID', 'FLIGHT_ID', 'VEHICLE_ID', 'LISTING_ID', 'STORE_ID', 'PROGRAM_ID', 'DESTINATION_ID', 'CREATIVE_VARIANT_ID', 'APP_ITEM_ID', 'ITEM_NAME', 'ITEM_DESCRIPTION', 'ITEM_TAGLINE', 'ITEM_PRICE', 'ITEM_PRICE_CURRENCY']] + operation: Required[Literal['translate_to_native', 'resolve_value', 'preserve']] + performed_by: NotRequired[Literal['buyer', 'creative_agent', 'seller', 'request_executor', 'source_ad_server']] + translation_target: NotRequired[_ExternalCoreMacroTranslationTarget] + location: Required[_ExternalCoreProductCardReferenceAssetAssetVariant4MacroDeclarationsItemLocation] + encoding: Required[_ExternalCoreMacroEncoding] + required: Required[builtins.bool] + unavailable_behavior: Required[Literal['preserve', 'omit_parameter', 'dialect_sentinel', 'reject']] class _ExternalCorePackageSignalTargetingGroupSignalsItemVariant1SignalRefVariant1(TypedDict, total=False): scope: Required[Literal['product']] @@ -24270,6 +26934,20 @@ class _PreviewCreativeResponseResultsItemVariant2ResponsePreviewsItemRendersItem supports_fullscreen: NotRequired[builtins.bool] csp_policy: NotRequired[builtins.str] +class _ExternalCoreReportingDeliveryConfigMethodVariant1DestinationVariant2Provider(TypedDict, total=False): + domain: Required[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2Provider(TypedDict, total=False): + domain: Required[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant2DestinationVariant2Recipient(TypedDict, total=False): + identity: Required[builtins.str] + cloud: NotRequired[Literal['aws', 'azure', 'gcp']] + region: NotRequired[builtins.str] + +class _ExternalCoreReportingDeliveryConfigMethodVariant3DestinationVariant2Provider(TypedDict, total=False): + domain: Required[builtins.str] + class _TasksGetRequestAccountVariant2BrandBrandKitOverrideLogoProvenance(TypedDict, total=False): digital_source_type: NotRequired[Literal['digital_capture', 'digital_creation', 'trained_algorithmic_media', 'composite_with_trained_algorithmic_media', 'algorithmic_media', 'composite_capture', 'composite_synthetic', 'human_edits', 'data_driven_media']] synthetic_depiction: NotRequired[builtins.bool] @@ -24300,6 +26978,9 @@ class _TasksListRequestAccountVariant2BrandBrandKitOverrideLogoProvenance(TypedD verification: NotRequired[builtins.list[_TasksListRequestAccountVariant2BrandBrandKitOverrideLogoProvenanceVerificationItem]] ext: NotRequired[builtins.dict[builtins.str, Any]] +class _ExternalCoreReportingDeliveryOfferingMethodProducerIdentityProvider(TypedDict, total=False): + domain: Required[builtins.str] + class _PolicyProfileSupportedCombinationsItemVariant1(TypedDict, total=False): kind: Required[Literal['max_bid_with_cost_per']] cost_per_strengths: Required[builtins.list[Literal['cap', 'target']]] @@ -24313,6 +26994,63 @@ class _ExternalCoreGeoPlaceResolver(TypedDict, total=False): auth: Required[Literal['none', 'seller_credentials']] protocol: Required[Literal['adcp_geo_place_resolver_v1']] +class _ExternalCoreCatalogItemDeliveryMetricsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _ExternalCoreCreativeDeliveryMetricsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByFormatItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _ExternalCoreKeywordDeliveryMetricsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _ExternalCoreGeoDeliveryMetricsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDeviceTypeItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDevicePlatformItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByAudienceItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByDemographicItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemByPlacementItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemByPackageItemBySpotItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemTotalsOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _GetMediaBuyDeliveryResponseMediaBuyDeliveriesItemWindowsItemByPackageItemOohMetricsPanelsItemIdentifiersItem(TypedDict, total=False): + id: Required[builtins.str] + id_type: Required[Literal['geopath', 'route_frame', 'plant_face', 'other']] + +class _ExternalCoreProductCardReferenceAssetAssetVariant4MacroDeclarationsItemLocation(TypedDict, total=False): + field: Required[Literal['url']] + occurrence: Required[builtins.int] + context: Required[Literal['url_query_value', 'url_path_segment', 'opaque']] + class _TasksGetRequestAccountVariant2BrandBrandKitOverrideLogoProvenanceAiTool(TypedDict, total=False): name: Required[builtins.str] version: NotRequired[builtins.str] @@ -24898,6 +27636,9 @@ class BuildCreativeRequest(VersionedSchemaModel): governance_context: builtins.str | None message: builtins.str | None creative_manifest: _BuildCreativeRequestCreativeManifestVariant1 | _BuildCreativeRequestCreativeManifestVariant2 | None + creative_representation_set: _ExternalCoreCreativeRepresentationSet | None + representation_destination: _ExternalCoreRepresentationDestination | None + representation_selection_strategy: Literal['representation_order', 'highest_compatible_vast'] | None creative_id: builtins.str | None concept_id: builtins.str | None media_buy_id: builtins.str | None @@ -24945,6 +27686,9 @@ class BuildCreativeRequest(VersionedSchemaModel): governance_context: builtins.str = ..., message: builtins.str = ..., creative_manifest: _BuildCreativeRequestCreativeManifestVariant1 | _BuildCreativeRequestCreativeManifestVariant2 = ..., + creative_representation_set: _ExternalCoreCreativeRepresentationSet = ..., + representation_destination: _ExternalCoreRepresentationDestination = ..., + representation_selection_strategy: Literal['representation_order', 'highest_compatible_vast'] = ..., creative_id: builtins.str = ..., concept_id: builtins.str = ..., media_buy_id: builtins.str = ..., @@ -27859,7 +30603,7 @@ class GetMediaBuyDeliveryRequest(VersionedSchemaModel): start_date: builtins.str | None end_date: builtins.str | None include_package_daily_breakdown: builtins.bool - requested_metrics: builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] | None + requested_metrics: builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] | None time_granularity: Literal['hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'post_campaign'] | None include_window_breakdown: builtins.bool attribution_window: _GetMediaBuyDeliveryRequestAttributionWindow | None @@ -27882,7 +30626,7 @@ class GetMediaBuyDeliveryRequest(VersionedSchemaModel): start_date: builtins.str = ..., end_date: builtins.str = ..., include_package_daily_breakdown: builtins.bool = ..., - requested_metrics: builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] = ..., + requested_metrics: builtins.list[Literal['impressions', 'spend', 'clicks', 'ctr', 'views', 'completed_views', 'completion_rate', 'conversions', 'conversion_value', 'commissionable_value', 'roas', 'cost_per_acquisition', 'new_to_brand_rate', 'leads', 'reach', 'frequency', 'grps', 'engagements', 'engagement_rate', 'follows', 'saves', 'profile_visits', 'viewability', 'viewable_rate', 'viewable_impressions', 'measurable_impressions', 'viewed_seconds', 'viewed_seconds_percentiles', 'viewed_seconds_histogram', 'quartile_data', 'quartile_25', 'quartile_50', 'quartile_75', 'quartile_100', 'time_based_views', 'dooh_metrics', 'ooh_metrics', 'cost_per_click', 'cost_per_completed_view', 'cpm', 'downloads', 'units_sold', 'new_to_brand_units', 'plays', 'incremental_sales_lift', 'brand_lift', 'foot_traffic', 'conversion_lift', 'brand_search_lift']] = ..., time_granularity: Literal['hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'post_campaign'] = ..., include_window_breakdown: builtins.bool = ..., attribution_window: _GetMediaBuyDeliveryRequestAttributionWindow = ..., @@ -28387,6 +31131,269 @@ class GetPropertyListResponse(VersionedSchemaModel): ext: builtins.dict[builtins.str, Any] = ..., ) -> None: ... +class GetReportingStatusRequest(VersionedSchemaModel): + adcp_version: builtins.str | None + adcp_major_version: builtins.int | None + account: builtins.dict[builtins.str, Any] + view: Literal['summary', 'periods', 'revision'] + media_buy_ids: builtins.list[builtins.str] | None + delivery_config_ids: builtins.list[builtins.str] | None + feed_purposes: builtins.list[Literal['pacing', 'analytics', 'billing']] | None + period: _GetReportingStatusRequestPeriod | None + health: builtins.list[Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete']] | None + finality: builtins.list[Literal['snapshot', 'official']] | None + reporting_revision_id: builtins.str | None + pagination: _ExternalCorePaginationRequest | None + context: builtins.dict[builtins.str, Any] | None + ext: builtins.dict[builtins.str, Any] | None + + @overload + def __init__(self, root: builtins.dict[builtins.str, Any], /) -> None: ... + + @overload + def __init__( + self, + *, + account: builtins.dict[builtins.str, Any], + view: Literal['summary', 'periods', 'revision'], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + media_buy_ids: builtins.list[builtins.str] = ..., + delivery_config_ids: builtins.list[builtins.str] = ..., + feed_purposes: builtins.list[Literal['pacing', 'analytics', 'billing']] = ..., + period: _GetReportingStatusRequestPeriod = ..., + health: builtins.list[Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete']] = ..., + finality: builtins.list[Literal['snapshot', 'official']] = ..., + reporting_revision_id: builtins.str = ..., + pagination: _ExternalCorePaginationRequest = ..., + context: builtins.dict[builtins.str, Any] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + +class GetReportingStatusResponse(VersionedSchemaModel): + adcp_version: builtins.str | None + adcp_major_version: builtins.int | None + context_id: builtins.str | None + context: builtins.dict[builtins.str, Any] | None + task_id: builtins.str | None + status: Literal['completed'] | Literal['failed'] + message: builtins.str | Literal['Reporting status resource is unavailable.'] | None + timestamp: builtins.str | None + replayed: builtins.bool | None + adcp_error: _ExternalCoreError | _GetReportingStatusResponseAdcpError | _GetReportingStatusResponseAdcpError2 | None + push_notification_config: _ExternalCorePushNotificationConfig | None + governance_context: builtins.str | None + payload: builtins.dict[builtins.str, Any] | None + view: Literal['summary'] | Literal['periods'] | Literal['revision'] | Literal['summary', 'periods', 'revision'] + ledger_snapshot_id: builtins.str | None + ledger_as_of: builtins.str | None + account_id: builtins.str | None + scope: _GetReportingStatusResponseScope | None + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'] | None + data_through: builtins.str | None + next_expected_at: builtins.str | None + obligation_counts: _GetReportingStatusResponseObligationCounts | None + issues: builtins.list[_ExternalCoreReportingStatusIssue] | None + periods: builtins.list[_ExternalCoreReportingObligation] | None + revisions: builtins.list[_ExternalCoreReportingRevision] | None + pagination: _ExternalCorePaginationResponse | _GetReportingStatusResponsePagination | None + revision: _ExternalCoreReportingRevision | None + materializations: builtins.list[_ExternalCoreReportingMaterialization] | None + receipts: builtins.list[_ExternalCoreReportingReceipt] | None + errors: builtins.list[_ExternalCoreError] | builtins.list[_GetReportingStatusResponseErrorsItem] | None + ext: builtins.dict[builtins.str, Any] | None + failure_kind: Literal['lookup_unavailable'] | Literal['operational'] | None + + @overload + def __init__(self, root: builtins.dict[builtins.str, Any], /) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['completed'], + view: Literal['summary'], + ledger_snapshot_id: builtins.str, + ledger_as_of: builtins.str, + account_id: builtins.str, + scope: _GetReportingStatusResponseScope, + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'], + data_through: builtins.str | None, + obligation_counts: _GetReportingStatusResponseObligationCounts, + issues: builtins.list[_ExternalCoreReportingStatusIssue], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: builtins.str = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _ExternalCoreError = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + next_expected_at: builtins.str = ..., + periods: builtins.list[_ExternalCoreReportingObligation] = ..., + revisions: builtins.list[_ExternalCoreReportingRevision] = ..., + pagination: _ExternalCorePaginationResponse = ..., + revision: _ExternalCoreReportingRevision = ..., + materializations: builtins.list[_ExternalCoreReportingMaterialization] = ..., + receipts: builtins.list[_ExternalCoreReportingReceipt] = ..., + errors: builtins.list[_ExternalCoreError] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['completed'], + view: Literal['periods'], + ledger_snapshot_id: builtins.str, + ledger_as_of: builtins.str, + account_id: builtins.str, + scope: _GetReportingStatusResponseScope, + periods: builtins.list[_ExternalCoreReportingObligation], + revisions: builtins.list[_ExternalCoreReportingRevision], + pagination: _GetReportingStatusResponsePagination, + materializations: builtins.list[_ExternalCoreReportingMaterialization], + receipts: builtins.list[_ExternalCoreReportingReceipt], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: builtins.str = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _ExternalCoreError = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'] = ..., + data_through: builtins.str | None = ..., + next_expected_at: builtins.str = ..., + obligation_counts: _GetReportingStatusResponseObligationCounts = ..., + issues: builtins.list[_ExternalCoreReportingStatusIssue] = ..., + revision: _ExternalCoreReportingRevision = ..., + errors: builtins.list[_ExternalCoreError] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['completed'], + view: Literal['revision'], + ledger_snapshot_id: builtins.str, + ledger_as_of: builtins.str, + account_id: builtins.str, + pagination: _GetReportingStatusResponsePagination, + revision: _ExternalCoreReportingRevision, + materializations: builtins.list[_ExternalCoreReportingMaterialization], + receipts: builtins.list[_ExternalCoreReportingReceipt], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: builtins.str = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _ExternalCoreError = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + scope: _GetReportingStatusResponseScope = ..., + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'] = ..., + data_through: builtins.str | None = ..., + next_expected_at: builtins.str = ..., + obligation_counts: _GetReportingStatusResponseObligationCounts = ..., + issues: builtins.list[_ExternalCoreReportingStatusIssue] = ..., + periods: builtins.list[_ExternalCoreReportingObligation] = ..., + revisions: builtins.list[_ExternalCoreReportingRevision] = ..., + errors: builtins.list[_ExternalCoreError] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['failed'], + view: Literal['summary', 'periods', 'revision'], + errors: builtins.list[_GetReportingStatusResponseErrorsItem], + failure_kind: Literal['lookup_unavailable'], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: Literal['Reporting status resource is unavailable.'] = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _GetReportingStatusResponseAdcpError = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + ledger_snapshot_id: builtins.str = ..., + ledger_as_of: builtins.str = ..., + account_id: builtins.str = ..., + scope: _GetReportingStatusResponseScope = ..., + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'] = ..., + data_through: builtins.str | None = ..., + next_expected_at: builtins.str = ..., + obligation_counts: _GetReportingStatusResponseObligationCounts = ..., + issues: builtins.list[_ExternalCoreReportingStatusIssue] = ..., + periods: builtins.list[_ExternalCoreReportingObligation] = ..., + revisions: builtins.list[_ExternalCoreReportingRevision] = ..., + pagination: _ExternalCorePaginationResponse = ..., + revision: _ExternalCoreReportingRevision = ..., + materializations: builtins.list[_ExternalCoreReportingMaterialization] = ..., + receipts: builtins.list[_ExternalCoreReportingReceipt] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['failed'], + view: Literal['summary', 'periods', 'revision'], + errors: builtins.list[_ExternalCoreError], + failure_kind: Literal['operational'], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: builtins.str = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _GetReportingStatusResponseAdcpError2 = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + ledger_snapshot_id: builtins.str = ..., + ledger_as_of: builtins.str = ..., + account_id: builtins.str = ..., + scope: _GetReportingStatusResponseScope = ..., + health: Literal['healthy', 'waiting', 'delayed', 'action_required', 'complete'] = ..., + data_through: builtins.str | None = ..., + next_expected_at: builtins.str = ..., + obligation_counts: _GetReportingStatusResponseObligationCounts = ..., + issues: builtins.list[_ExternalCoreReportingStatusIssue] = ..., + periods: builtins.list[_ExternalCoreReportingObligation] = ..., + revisions: builtins.list[_ExternalCoreReportingRevision] = ..., + pagination: _ExternalCorePaginationResponse = ..., + revision: _ExternalCoreReportingRevision = ..., + materializations: builtins.list[_ExternalCoreReportingMaterialization] = ..., + receipts: builtins.list[_ExternalCoreReportingReceipt] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + class GetRightsRequest(VersionedSchemaModel): adcp_version: builtins.str | None adcp_major_version: builtins.int | None @@ -28680,7 +31687,7 @@ class GetTaskStatusResponse(VersionedSchemaModel): push_notification_config: _ExternalCorePushNotificationConfig | None governance_context: builtins.str | None payload: builtins.dict[builtins.str, Any] | None - task_type: Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs'] + task_type: Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs', 'sync_reporting_receipts'] protocol: Literal['media-buy', 'signals', 'governance', 'creative', 'brand', 'sponsored-intelligence', 'measurement'] created_at: builtins.str updated_at: builtins.str @@ -28701,7 +31708,7 @@ class GetTaskStatusResponse(VersionedSchemaModel): *, task_id: builtins.str, status: Literal['submitted', 'working', 'input-required', 'completed', 'canceled', 'failed', 'rejected', 'auth-required', 'unknown'], - task_type: Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs'], + task_type: Literal['create_media_buy', 'update_media_buy', 'buy_products', 'accept_proposal', 'control_media_buy', 'media_buy_delivery', 'sync_creatives', 'build_creative', 'preview_creative', 'activate_signal', 'get_products', 'request_proposals', 'refine_proposals', 'decline_proposals', 'get_signals', 'create_property_list', 'update_property_list', 'get_property_list', 'list_property_lists', 'delete_property_list', 'sync_accounts', 'get_account_financials', 'get_creative_delivery', 'sync_event_sources', 'sync_audiences', 'sync_catalogs', 'log_event', 'get_brand_identity', 'search_brands', 'get_rights', 'acquire_rights', 'update_rights', 'sync_agent_notification_configs', 'sync_reporting_receipts'], protocol: Literal['media-buy', 'signals', 'governance', 'creative', 'brand', 'sponsored-intelligence', 'measurement'], created_at: builtins.str, updated_at: builtins.str, @@ -32051,6 +35058,72 @@ class SyncPlansResponse(VersionedSchemaModel): ext: builtins.dict[builtins.str, Any] = ..., ) -> None: ... +class SyncReportingReceiptsRequest(VersionedSchemaModel): + adcp_version: builtins.str | None + adcp_major_version: builtins.int | None + account: builtins.dict[builtins.str, Any] + idempotency_key: builtins.str + receipts: builtins.list[_SyncReportingReceiptsRequestReceiptsItem] + context: builtins.dict[builtins.str, Any] | None + ext: builtins.dict[builtins.str, Any] | None + + @overload + def __init__(self, root: builtins.dict[builtins.str, Any], /) -> None: ... + + @overload + def __init__( + self, + *, + account: builtins.dict[builtins.str, Any], + idempotency_key: builtins.str, + receipts: builtins.list[_SyncReportingReceiptsRequestReceiptsItem], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context: builtins.dict[builtins.str, Any] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + +class SyncReportingReceiptsResponse(VersionedSchemaModel): + adcp_version: builtins.str | None + adcp_major_version: builtins.int | None + context_id: builtins.str | None + context: builtins.dict[builtins.str, Any] | None + task_id: builtins.str | None + status: Literal['completed'] + message: builtins.str | None + timestamp: builtins.str | None + replayed: builtins.bool | None + adcp_error: _ExternalCoreError | None + push_notification_config: _ExternalCorePushNotificationConfig | None + governance_context: builtins.str | None + payload: builtins.dict[builtins.str, Any] | None + results: builtins.list[_SyncReportingReceiptsResponseResultsItemVariant1 | _SyncReportingReceiptsResponseResultsItemVariant2 | _SyncReportingReceiptsResponseResultsItemVariant3] + ext: builtins.dict[builtins.str, Any] | None + + @overload + def __init__(self, root: builtins.dict[builtins.str, Any], /) -> None: ... + + @overload + def __init__( + self, + *, + status: Literal['completed'], + results: builtins.list[_SyncReportingReceiptsResponseResultsItemVariant1 | _SyncReportingReceiptsResponseResultsItemVariant2 | _SyncReportingReceiptsResponseResultsItemVariant3], + adcp_version: builtins.str = ..., + adcp_major_version: builtins.int = ..., + context_id: builtins.str = ..., + context: builtins.dict[builtins.str, Any] = ..., + task_id: builtins.str = ..., + message: builtins.str = ..., + timestamp: builtins.str = ..., + replayed: builtins.bool = ..., + adcp_error: _ExternalCoreError = ..., + push_notification_config: _ExternalCorePushNotificationConfig = ..., + governance_context: builtins.str = ..., + payload: builtins.dict[builtins.str, Any] = ..., + ext: builtins.dict[builtins.str, Any] = ..., + ) -> None: ... + class TasksGetRequest(VersionedSchemaModel): adcp_version: builtins.str | None adcp_major_version: builtins.int | None @@ -33254,4 +36327,4 @@ class VerifyBrandClaimsResponse(VersionedSchemaModel): ext: builtins.dict[builtins.str, Any] = ..., ) -> None: ... -__all__ = ['AcceptProposalInputRequiredResponse', 'AcceptProposalRequest', 'AcceptProposalSubmittedResponse', 'AcceptProposalResponse', 'AcceptProposalWorkingResponse', 'AcquireRightsRequest', 'AcquireRightsResponse', 'ActivateSignalRequest', 'ActivateSignalResponse', 'BuildCreativeInputRequiredResponse', 'BuildCreativeRequest', 'BuildCreativeSubmittedResponse', 'BuildCreativeResponse', 'BuildCreativeWorkingResponse', 'BuyProductsInputRequiredResponse', 'BuyProductsRequest', 'BuyProductsSubmittedResponse', 'BuyProductsResponse', 'BuyProductsWorkingResponse', 'CalibrateContentRequest', 'CalibrateContentResponse', 'CheckGovernanceRequest', 'CheckGovernanceResponse', 'ComplyTestControllerRequest', 'ComplyTestControllerResponse', 'ContextMatchRequest', 'ContextMatchResponse', 'ControlMediaBuyInputRequiredResponse', 'ControlMediaBuyRequest', 'ControlMediaBuySubmittedResponse', 'ControlMediaBuyResponse', 'ControlMediaBuyWorkingResponse', 'CreateCollectionListRequest', 'CreateCollectionListResponse', 'CreateContentStandardsRequest', 'CreateContentStandardsResponse', 'CreateMediaBuyInputRequiredResponse', 'CreateMediaBuyRequest', 'CreateMediaBuySubmittedResponse', 'CreateMediaBuyResponse', 'CreateMediaBuyWorkingResponse', 'CreatePropertyListRequest', 'CreatePropertyListResponse', 'CreativeApprovalRequest', 'CreativeApprovalResponse', 'DeclineProposalsInputRequiredResponse', 'DeclineProposalsRequest', 'DeclineProposalsSubmittedResponse', 'DeclineProposalsResponse', 'DeclineProposalsWorkingResponse', 'DeleteCollectionListRequest', 'DeleteCollectionListResponse', 'DeletePropertyListRequest', 'DeletePropertyListResponse', 'GetAccountFinancialsRequest', 'GetAccountFinancialsResponse', 'GetAdcpCapabilitiesRequest', 'GetAdcpCapabilitiesResponse', 'GetBrandIdentityRequest', 'GetBrandIdentityResponse', 'GetCollectionListRequest', 'GetCollectionListResponse', 'GetContentStandardsRequest', 'GetContentStandardsResponse', 'GetCreativeDeliveryRequest', 'GetCreativeDeliveryResponse', 'GetCreativeFeaturesRequest', 'GetCreativeFeaturesResponse', 'GetMediaBuyArtifactsRequest', 'GetMediaBuyArtifactsResponse', 'GetMediaBuyDeliveryRequest', 'GetMediaBuyDeliveryResponse', 'GetMediaBuysRequest', 'GetMediaBuysResponse', 'GetPlanAuditLogsRequest', 'GetPlanAuditLogsResponse', 'GetProductsInputRequiredResponse', 'GetProductsRequest', 'GetProductsSubmittedResponse', 'GetProductsResponse', 'GetProductsWorkingResponse', 'GetPropertyListRequest', 'GetPropertyListResponse', 'GetRightsRequest', 'GetRightsResponse', 'GetSignalsRequest', 'GetSignalsSubmittedResponse', 'GetSignalsResponse', 'GetSignalsWorkingResponse', 'GetTaskStatusRequest', 'GetTaskStatusResponse', 'IdentityMatchRequest', 'IdentityMatchResponse', 'ListAccountsRequest', 'ListAccountsResponse', 'ListCollectionListsRequest', 'ListCollectionListsResponse', 'ListContentStandardsRequest', 'ListContentStandardsResponse', 'ListCreativeFormatsRequest', 'ListCreativeFormatsResponse', 'ListCreativesRequest', 'ListCreativesResponse', 'ListProductsRequest', 'ListProductsResponse', 'ListPropertyListsRequest', 'ListPropertyListsResponse', 'ListTasksRequest', 'ListTasksResponse', 'ListTransformersRequest', 'ListTransformersResponse', 'LogEventRequest', 'LogEventResponse', 'MediaBuyCommitmentResponse', 'PackageRequest', 'PreviewCreativeRequest', 'PreviewCreativeResponse', 'ProvidePerformanceFeedbackRequest', 'ProvidePerformanceFeedbackResponse', 'ProviderContextMatchResponse', 'ProviderIdentityMatchResponse', 'RefineProposalsInputRequiredResponse', 'RefineProposalsRequest', 'RefineProposalsSubmittedResponse', 'RefineProposalsResponse', 'RefineProposalsWorkingResponse', 'ReportPlanAdjustmentRequest', 'ReportPlanAdjustmentResponse', 'ReportPlanOutcomeRequest', 'ReportPlanOutcomeResponse', 'ReportUsageRequest', 'ReportUsageResponse', 'RequestProposalsInputRequiredResponse', 'RequestProposalsRequest', 'RequestProposalsSubmittedResponse', 'RequestProposalsResponse', 'RequestProposalsWorkingResponse', 'SearchBrandsRequest', 'SearchBrandsResponse', 'SiGetOfferingRequest', 'SiGetOfferingResponse', 'SiInitiateSessionRequest', 'SiInitiateSessionResponse', 'SiSendMessageRequest', 'SiSendMessageResponse', 'SiTerminateSessionRequest', 'SiTerminateSessionResponse', 'StaleResponse', 'SyncAccountsRequest', 'SyncAccountsResponse', 'SyncAgentNotificationConfigsRequest', 'SyncAgentNotificationConfigsResponse', 'SyncAudiencesRequest', 'SyncAudiencesResponse', 'SyncCatalogsInputRequiredResponse', 'SyncCatalogsRequest', 'SyncCatalogsSubmittedResponse', 'SyncCatalogsResponse', 'SyncCatalogsWorkingResponse', 'SyncCreativesInputRequiredResponse', 'SyncCreativesRequest', 'SyncCreativesSubmittedResponse', 'SyncCreativesResponse', 'SyncCreativesWorkingResponse', 'SyncEventSourcesRequest', 'SyncEventSourcesResponse', 'SyncGovernanceRequest', 'SyncGovernanceResponse', 'SyncPlansRequest', 'SyncPlansResponse', 'TasksGetRequest', 'TasksGetResponse', 'TasksListRequest', 'TasksListResponse', 'UpdateCollectionListRequest', 'UpdateCollectionListResponse', 'UpdateContentStandardsRequest', 'UpdateContentStandardsResponse', 'UpdateMediaBuyInputRequiredResponse', 'UpdateMediaBuyRequest', 'UpdateMediaBuySubmittedResponse', 'UpdateMediaBuyResponse', 'UpdateMediaBuyWorkingResponse', 'UpdatePropertyListRequest', 'UpdatePropertyListResponse', 'UpdateRightsRequest', 'UpdateRightsResponse', 'ValidateContentDeliveryRequest', 'ValidateContentDeliveryResponse', 'ValidateInputRequest', 'ValidateInputResponse', 'ValidatePropertyDeliveryRequest', 'ValidatePropertyDeliveryResponse', 'VerifyBrandClaimRequest', 'VerifyBrandClaimResponse', 'VerifyBrandClaimsRequest', 'VerifyBrandClaimsResponse'] +__all__ = ['AcceptProposalInputRequiredResponse', 'AcceptProposalRequest', 'AcceptProposalSubmittedResponse', 'AcceptProposalResponse', 'AcceptProposalWorkingResponse', 'AcquireRightsRequest', 'AcquireRightsResponse', 'ActivateSignalRequest', 'ActivateSignalResponse', 'BuildCreativeInputRequiredResponse', 'BuildCreativeRequest', 'BuildCreativeSubmittedResponse', 'BuildCreativeResponse', 'BuildCreativeWorkingResponse', 'BuyProductsInputRequiredResponse', 'BuyProductsRequest', 'BuyProductsSubmittedResponse', 'BuyProductsResponse', 'BuyProductsWorkingResponse', 'CalibrateContentRequest', 'CalibrateContentResponse', 'CheckGovernanceRequest', 'CheckGovernanceResponse', 'ComplyTestControllerRequest', 'ComplyTestControllerResponse', 'ContextMatchRequest', 'ContextMatchResponse', 'ControlMediaBuyInputRequiredResponse', 'ControlMediaBuyRequest', 'ControlMediaBuySubmittedResponse', 'ControlMediaBuyResponse', 'ControlMediaBuyWorkingResponse', 'CreateCollectionListRequest', 'CreateCollectionListResponse', 'CreateContentStandardsRequest', 'CreateContentStandardsResponse', 'CreateMediaBuyInputRequiredResponse', 'CreateMediaBuyRequest', 'CreateMediaBuySubmittedResponse', 'CreateMediaBuyResponse', 'CreateMediaBuyWorkingResponse', 'CreatePropertyListRequest', 'CreatePropertyListResponse', 'CreativeApprovalRequest', 'CreativeApprovalResponse', 'DeclineProposalsInputRequiredResponse', 'DeclineProposalsRequest', 'DeclineProposalsSubmittedResponse', 'DeclineProposalsResponse', 'DeclineProposalsWorkingResponse', 'DeleteCollectionListRequest', 'DeleteCollectionListResponse', 'DeletePropertyListRequest', 'DeletePropertyListResponse', 'GetAccountFinancialsRequest', 'GetAccountFinancialsResponse', 'GetAdcpCapabilitiesRequest', 'GetAdcpCapabilitiesResponse', 'GetBrandIdentityRequest', 'GetBrandIdentityResponse', 'GetCollectionListRequest', 'GetCollectionListResponse', 'GetContentStandardsRequest', 'GetContentStandardsResponse', 'GetCreativeDeliveryRequest', 'GetCreativeDeliveryResponse', 'GetCreativeFeaturesRequest', 'GetCreativeFeaturesResponse', 'GetMediaBuyArtifactsRequest', 'GetMediaBuyArtifactsResponse', 'GetMediaBuyDeliveryRequest', 'GetMediaBuyDeliveryResponse', 'GetMediaBuysRequest', 'GetMediaBuysResponse', 'GetPlanAuditLogsRequest', 'GetPlanAuditLogsResponse', 'GetProductsInputRequiredResponse', 'GetProductsRequest', 'GetProductsSubmittedResponse', 'GetProductsResponse', 'GetProductsWorkingResponse', 'GetPropertyListRequest', 'GetPropertyListResponse', 'GetReportingStatusRequest', 'GetReportingStatusResponse', 'GetRightsRequest', 'GetRightsResponse', 'GetSignalsRequest', 'GetSignalsSubmittedResponse', 'GetSignalsResponse', 'GetSignalsWorkingResponse', 'GetTaskStatusRequest', 'GetTaskStatusResponse', 'IdentityMatchRequest', 'IdentityMatchResponse', 'ListAccountsRequest', 'ListAccountsResponse', 'ListCollectionListsRequest', 'ListCollectionListsResponse', 'ListContentStandardsRequest', 'ListContentStandardsResponse', 'ListCreativeFormatsRequest', 'ListCreativeFormatsResponse', 'ListCreativesRequest', 'ListCreativesResponse', 'ListProductsRequest', 'ListProductsResponse', 'ListPropertyListsRequest', 'ListPropertyListsResponse', 'ListTasksRequest', 'ListTasksResponse', 'ListTransformersRequest', 'ListTransformersResponse', 'LogEventRequest', 'LogEventResponse', 'MediaBuyCommitmentResponse', 'PackageRequest', 'PreviewCreativeRequest', 'PreviewCreativeResponse', 'ProvidePerformanceFeedbackRequest', 'ProvidePerformanceFeedbackResponse', 'ProviderContextMatchResponse', 'ProviderIdentityMatchResponse', 'RefineProposalsInputRequiredResponse', 'RefineProposalsRequest', 'RefineProposalsSubmittedResponse', 'RefineProposalsResponse', 'RefineProposalsWorkingResponse', 'ReportPlanAdjustmentRequest', 'ReportPlanAdjustmentResponse', 'ReportPlanOutcomeRequest', 'ReportPlanOutcomeResponse', 'ReportUsageRequest', 'ReportUsageResponse', 'RequestProposalsInputRequiredResponse', 'RequestProposalsRequest', 'RequestProposalsSubmittedResponse', 'RequestProposalsResponse', 'RequestProposalsWorkingResponse', 'SearchBrandsRequest', 'SearchBrandsResponse', 'SiGetOfferingRequest', 'SiGetOfferingResponse', 'SiInitiateSessionRequest', 'SiInitiateSessionResponse', 'SiSendMessageRequest', 'SiSendMessageResponse', 'SiTerminateSessionRequest', 'SiTerminateSessionResponse', 'StaleResponse', 'SyncAccountsRequest', 'SyncAccountsResponse', 'SyncAgentNotificationConfigsRequest', 'SyncAgentNotificationConfigsResponse', 'SyncAudiencesRequest', 'SyncAudiencesResponse', 'SyncCatalogsInputRequiredResponse', 'SyncCatalogsRequest', 'SyncCatalogsSubmittedResponse', 'SyncCatalogsResponse', 'SyncCatalogsWorkingResponse', 'SyncCreativesInputRequiredResponse', 'SyncCreativesRequest', 'SyncCreativesSubmittedResponse', 'SyncCreativesResponse', 'SyncCreativesWorkingResponse', 'SyncEventSourcesRequest', 'SyncEventSourcesResponse', 'SyncGovernanceRequest', 'SyncGovernanceResponse', 'SyncPlansRequest', 'SyncPlansResponse', 'SyncReportingReceiptsRequest', 'SyncReportingReceiptsResponse', 'TasksGetRequest', 'TasksGetResponse', 'TasksListRequest', 'TasksListResponse', 'UpdateCollectionListRequest', 'UpdateCollectionListResponse', 'UpdateContentStandardsRequest', 'UpdateContentStandardsResponse', 'UpdateMediaBuyInputRequiredResponse', 'UpdateMediaBuyRequest', 'UpdateMediaBuySubmittedResponse', 'UpdateMediaBuyResponse', 'UpdateMediaBuyWorkingResponse', 'UpdatePropertyListRequest', 'UpdatePropertyListResponse', 'UpdateRightsRequest', 'UpdateRightsResponse', 'ValidateContentDeliveryRequest', 'ValidateContentDeliveryResponse', 'ValidateInputRequest', 'ValidateInputResponse', 'ValidatePropertyDeliveryRequest', 'ValidatePropertyDeliveryResponse', 'VerifyBrandClaimRequest', 'VerifyBrandClaimResponse', 'VerifyBrandClaimsRequest', 'VerifyBrandClaimsResponse'] diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py index 990d63216..15c88e758 100644 --- a/tests/test_reporting_reconciliation.py +++ b/tests/test_reporting_reconciliation.py @@ -5,6 +5,7 @@ import pytest +from adcp.decisioning.capabilities import MediaBuy from adcp.reporting import ( ExpectedReportingPeriod, ReportingInspectionContext, @@ -14,6 +15,7 @@ load_reporting_ledger, reconcile_reporting, ) +from adcp.types import ReportingDeliveryCapabilities from adcp.types.core import TaskResult, TaskStatus from adcp.types.generated_poc.core.reporting_canonical_content_digest import ( ReportingCanonicalContentDigest, @@ -50,11 +52,68 @@ "algorithm": "sha256", "value": "a" * 64, "canonicalization_id": "rows-v1", + "canonicalization_uri": "https://schemas.example/canonicalization/rows-v1.json", "canonicalization_sha256": "b" * 64, } + + +def test_capability_uses_public_reporting_delivery_model() -> None: + reporting = ReportingDeliveryCapabilities.model_validate( + { + "supported": True, + "offerings": [ + { + "offering_id": "billing-daily", + "feed_purpose": "billing", + "report_definition_id": "billing-v1", + "report_definition_uri": "https://schemas.example/reporting/billing-v1.json", + "report_definition_sha256": "d" * 64, + "reporting_profile": { + "id": "billing-v1", + "version": "1", + "schema_uri": "https://schemas.example/reporting/billing-v1.json", + "schema_sha256": "c" * 64, + "grain": "media_buy_day", + "primary_keys": ["media_buy_id", "date"], + "canonicalization_id": "rows-v1", + "canonicalization_uri": "https://schemas.example/canonicalization/rows-v1.json", + "canonicalization_sha256": "b" * 64, + }, + "schedule": { + "period_duration": "P1D", + "alignment": "utc", + "delivery_sla": "PT6H", + }, + "supported_finality": ["official"], + "reconciliation_mode": "consumer_receipt", + "method": { + "pattern": "file_transfer", + "transport": "s3", + "orchestration": "producer_managed", + "destination_modes": ["existing"], + "provider": {"domain": "aws.amazon.com"}, + "format": "jsonl", + }, + } + ], + "automated_recovery_window_seconds": 86400, + "status_retention_days": 400, + "resource_retention_days": 90, + "supports_webhook_activity": True, + "authorization_revocation_seconds": 3600, + } + ) + + capabilities = MediaBuy(reporting_delivery=reporting) + + assert capabilities.reporting_delivery is reporting + + REVISION = { "reporting_revision_id": "revision-august-official", "report_definition_id": "billing-v1", + "report_definition_uri": "https://schemas.example/reporting/billing-v1.json", + "report_definition_sha256": "d" * 64, "reporting_profile": "billing-v1", "schema_version": "1", "schema_uri": "https://schemas.example/billing-v1.json", @@ -85,6 +144,7 @@ def _obligation(identifier: str = "obligation-billing") -> dict[str, object]: "reporting_profile": "billing-v1", "account_id": "account-1", "media_buy_ids": ["buy-1", "buy-2"], + "scope_resolved_at": PERIOD["end"], "period": PERIOD, "expected_at": "2026-09-02T00:00:00Z", "schedule": { From 765d1d3bc1ac4bf4f16c7854a0d405be2cdb3845 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 07:40:29 +0200 Subject: [PATCH 08/12] fix(reporting): regenerate reconciliation on active schema bundle --- SCHEMA_DELTAS.md | 35 +- .../account/sync-accounts-request.json | 42 +- .../account/sync-accounts-response.json | 45 +- schemas/cache/3.2.0-beta.6/core/account.json | 35 +- .../core/notification-config.json | 9 +- .../reporting-canonical-content-digest.json | 40 - .../core/reporting-delivery-capabilities.json | 77 - .../core/reporting-delivery-config-state.json | 191 --- .../core/reporting-delivery-config.json | 156 -- .../core/reporting-delivery-method.json | 129 -- .../core/reporting-delivery-offering.json | 371 ----- .../reporting-delivery-ready-webhook.json | 113 -- .../core/reporting-file-entry.json | 42 - .../core/reporting-file-manifest.json | 121 -- .../core/reporting-materialization.json | 300 ---- .../core/reporting-obligation.json | 354 ---- .../3.2.0-beta.6/core/reporting-receipt.json | 196 --- .../core/reporting-report-definition.json | 297 ---- .../3.2.0-beta.6/core/reporting-resource.json | 119 -- .../3.2.0-beta.6/core/reporting-revision.json | 277 ---- .../core/reporting-schedule-offering.json | 127 -- .../3.2.0-beta.6/core/reporting-schedule.json | 84 - .../core/reporting-status-issue.json | 109 -- .../core/reporting-verification.json | 164 -- .../3.2.0-beta.6/core/x-entity-types.json | 28 - .../3.2.0-beta.6/enums/notification-type.json | 8 +- .../cache/3.2.0-beta.6/enums/task-type.json | 6 +- schemas/cache/3.2.0-beta.6/index.json | 1254 +++++++------- .../get-reporting-status-request.json | 230 --- .../get-reporting-status-response.json | 758 --------- .../sync-reporting-receipts-response.json | 127 -- .../get-adcp-capabilities-response.json | 65 - .../account/sync-accounts-request.json | 104 +- .../account/sync-accounts-response.json | 63 +- schemas/cache/3.2.0-beta.9/core/account.json | 46 +- .../core/agent-configuration-state.json | 28 + .../core/agent-notification-config-state.json | 53 + .../core/agent-notification-config.json | 9 +- .../agent-reporting-destination-state.json | 101 ++ .../core/agent-reporting-destination.json | 116 ++ .../core/agent-webhook-challenge.json | 7 +- .../core/capabilities-changed-webhook.json | 9 +- .../3.2.0-beta.9/core/delivery-provider.json | 16 + .../3.2.0-beta.9/core/delivery-recipient.json | 29 + .../core/notification-config.json | 42 +- .../reporting-canonical-content-digest.json | 17 + .../reporting-canonicalization-contract.json | 71 +- .../core/reporting-capabilities.json | 70 +- .../core/reporting-control-total.json | 14 +- .../3.2.0-beta.9/core/reporting-coverage.json | 42 + .../reporting-dataset-share-destination.json | 89 +- .../core/reporting-delivery-capabilities.json | 27 + .../core/reporting-delivery-config-state.json | 61 + .../core/reporting-delivery-config.json | 50 + .../core/reporting-delivery-method.json | 47 + .../core/reporting-delivery-offering.json | 93 ++ .../reporting-delivery-ready-webhook.json | 30 + .../core/reporting-file-compression.json | 10 +- .../core/reporting-file-entry.json | 21 + .../core/reporting-file-manifest.json | 47 + .../core/reporting-materialization.json | 75 + .../core/reporting-obligation.json | 96 ++ .../3.2.0-beta.9/core/reporting-receipt.json | 59 + .../core/reporting-reconciliation-mode.json | 8 +- .../core/reporting-report-definition.json | 108 ++ .../3.2.0-beta.9/core/reporting-resource.json | 34 + .../3.2.0-beta.9/core/reporting-revision.json | 74 + .../core/reporting-schedule-offering.json | 37 + .../3.2.0-beta.9/core/reporting-schedule.json | 27 + .../core/reporting-status-issue.json | 26 + .../reporting-verification-profile-set.json | 13 + .../core/reporting-verification-profile.json | 9 +- .../core/reporting-verification.json | 68 + .../core/reporting-write-destination.json | 62 +- .../3.2.0-beta.9/core/x-entity-types.json | 51 +- .../3.2.0-beta.9/enums/notification-type.json | 29 +- .../enums/reporting-finality.json | 8 +- .../enums/reporting-health.json | 11 +- .../cache/3.2.0-beta.9/enums/task-type.json | 11 +- schemas/cache/3.2.0-beta.9/index.json | 1329 ++++++++------- .../get-reporting-status-request.json | 52 + .../get-reporting-status-response.json | 218 +++ .../sync-reporting-receipts-request.json | 55 +- .../sync-reporting-receipts-response.json | 69 + .../get-adcp-capabilities-response.json | 1470 ++++++----------- .../sync-agent-configuration-request.json | 138 ++ .../sync-agent-configuration-response.json | 154 ++ scripts/consolidate_exports.py | 4 + scripts/generate_types.py | 31 +- scripts/post_generate_fixes.py | 30 +- src/adcp/reporting.py | 25 + src/adcp/types/_ergonomic.py | 4 +- src/adcp/types/_generated.py | 410 ++++- .../account/sync_accounts_request.py | 6 +- .../get_adcp_capabilities_response.py | 106 +- src/adcp/types/generated_poc/core/account.py | 13 +- .../generated_poc/core/assets/card_asset.py | 5 +- .../core/canonical_media_buy_action.py | 10 +- .../generated_poc/core/mcp_webhook_payload.py | 4 +- .../generated_poc/core/notification_config.py | 5 +- .../core/reporting_capabilities.py | 14 +- .../generated_poc/core/reporting_coverage.py | 102 ++ .../core/reporting_delivery_config.py | 13 +- .../core/reporting_delivery_config_state.py | 10 +- .../core/reporting_delivery_offering.py | 24 +- .../core/reporting_obligation.py | 15 +- .../generated_poc/core/reporting_revision.py | 10 +- .../core/reporting_status_issue.py | 9 +- .../reporting_verification_profile_set.py | 15 +- .../generated_poc/core/x_entity_types.py | 11 +- .../generated_poc/enums/notification_type.py | 3 +- .../extensions/extension_meta.py | 10 +- .../governance/sync_plans_response.py | 6 +- .../media_buy/get_products_request.py | 8 +- .../get_reporting_status_response.py | 16 +- .../sync_reporting_receipts_request.py | 4 +- .../get_adcp_capabilities_response.py | 126 +- .../si_sponsored_context_receipt.py | 6 +- src/adcp/validation/schema_loader.py | 44 +- tests/test_code_generation.py | 24 + tests/test_reporting_reconciliation.py | 58 + tests/test_schema_loader_per_version.py | 16 + 122 files changed, 5148 insertions(+), 7561 deletions(-) delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-materialization.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-obligation.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-receipt.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-resource.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-revision.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-schedule.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json delete mode 100644 schemas/cache/3.2.0-beta.6/core/reporting-verification.json delete mode 100644 schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json delete mode 100644 schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json delete mode 100644 schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json create mode 100644 schemas/cache/3.2.0-beta.9/core/agent-configuration-state.json create mode 100644 schemas/cache/3.2.0-beta.9/core/agent-notification-config-state.json create mode 100644 schemas/cache/3.2.0-beta.9/core/agent-reporting-destination-state.json create mode 100644 schemas/cache/3.2.0-beta.9/core/agent-reporting-destination.json create mode 100644 schemas/cache/3.2.0-beta.9/core/delivery-provider.json create mode 100644 schemas/cache/3.2.0-beta.9/core/delivery-recipient.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-canonical-content-digest.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-canonicalization-contract.json (55%) rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-control-total.json (88%) create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-coverage.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-dataset-share-destination.json (54%) create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-capabilities.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-config-state.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-config.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-method.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-offering.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-delivery-ready-webhook.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-file-compression.json (70%) create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-file-entry.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-file-manifest.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-materialization.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-obligation.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-receipt.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-reconciliation-mode.json (70%) create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-report-definition.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-resource.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-revision.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-schedule-offering.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-schedule.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-status-issue.json create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-verification-profile-set.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-verification-profile.json (64%) create mode 100644 schemas/cache/3.2.0-beta.9/core/reporting-verification.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/core/reporting-write-destination.json (52%) rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/enums/reporting-finality.json (87%) rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/enums/reporting-health.json (89%) create mode 100644 schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-request.json create mode 100644 schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-response.json rename schemas/cache/{3.2.0-beta.6 => 3.2.0-beta.9}/media-buy/sync-reporting-receipts-request.json (54%) create mode 100644 schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-response.json create mode 100644 schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-request.json create mode 100644 schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-response.json create mode 100644 src/adcp/types/generated_poc/core/reporting_coverage.py diff --git a/SCHEMA_DELTAS.md b/SCHEMA_DELTAS.md index 768c45bbb..de02a2db6 100644 --- a/SCHEMA_DELTAS.md +++ b/SCHEMA_DELTAS.md @@ -1,6 +1,37 @@ # Generated-types delta +## Files added + +- `core/agent_configuration_state.py` — AgentConfigurationState +- `core/agent_notification_config_state.py` — AgentNotificationConfigState, Authentication +- `core/agent_reporting_destination.py` — AcceptedFormat, AgentReportingDestination, AgentReportingDestination1, AgentReportingDestination2, AgentReportingDestination3, Pattern +- `core/agent_reporting_destination_state.py` — Action, AgentReportingDestinationState, Setup, State +- `core/delivery_provider.py` — DeliveryProvider +- `core/delivery_recipient.py` — Cloud, DeliveryRecipient +- `core/reporting_verification_profile_set.py` — ReportingVerificationProfileSet, ReportingVerificationProfileSetEnum +- `protocol/sync_agent_configuration_request.py` — Configuration, SyncAgentConfigurationRequest +- `protocol/sync_agent_configuration_response.py` — Action, Action26, Result, Result11, Result9, SyncAgentConfigurationResponse + ## Field changes -- `core/reporting_receipt.py` - - `ReportingReceipt`: `+observed_native_version_ref` +- `a2ui/si_catalog.py` + - **classes added**: Action21 + - **classes removed**: Action20 +- `bundled/protocol/get_adcp_capabilities_response.py` + - **classes added**: Authentication5 + - **classes removed**: Authentication4 +- `core/canonical_media_buy_action.py` + - **classes added**: Action4 + - **classes removed**: Action2 + - `Action3`: `+add_packages`, `+cancel`, `+decrease_budget`, `+extend_flight`, `+increase_budget`, `+reallocate_budget`, `+remove_packages`, `+shorten_flight`, `+update_bidding`, `+update_budget_allocation`, `+update_flight_dates`, `+update_frequency_caps`, `+update_pacing`, `+update_targeting` `-remove_creative`, `-replace_creative`, `-update_creative_assignments` +- `enums/task_type.py` + - `TaskType`: `+sync_agent_configuration` +- `media_buy/get_products_request.py` + - **classes added**: Action8 + - **classes removed**: Action7 +- `media_buy/product_refinement.py` + - **classes added**: Action10 + - **classes removed**: Action9 +- `protocol/get_adcp_capabilities_response.py` + - **classes added**: AgentConfiguration, RegistrationTask, SupportedSection + - `Adcp`: `+agent_configuration` diff --git a/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json b/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json index d3499253c..28682a18a 100644 --- a/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json +++ b/schemas/cache/3.2.0-beta.6/account/sync-accounts-request.json @@ -6,7 +6,7 @@ "type": "object", "allOf": [ { - "$ref": "../core/version-envelope.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/version-envelope.json" } ], "x-mutates-state": true, @@ -26,7 +26,7 @@ "description": "An advertiser account entry \u2014 either provisions/upserts a new account (natural key) or updates an existing one (AccountRef key).", "properties": { "account": { - "$ref": "../core/account-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-ref.json", "description": "Settings-update key. When present, this entry targets an existing account by `account_id` (seller-owned account namespace) or natural key (buyer-declared account settings-update against a previously-provisioned account). Mutually exclusive with the flat `brand` + `operator` + `billing` provisioning trio. When `account` is present, the seller MUST NOT create a new account \u2014 entries that would otherwise trigger provisioning are rejected with `UNSUPPORTED_PROVISIONING`." }, "revision": { @@ -35,15 +35,15 @@ "description": "Expected current account revision for optimistic concurrency in settings-update mode. Required whenever operator_identity is present; optional for existing non-identity settings updates. The seller MUST compare it atomically with the write, reject a mismatch with CONFLICT, and leave the account unchanged. Obtain it from list_accounts or the most recent sync_accounts result. Reads, dry runs, validation failures, and exact idempotency replays do not increment revision; every persisted settings or identity-change state transition does. MUST be absent in provisioning mode." }, "operator_identity": { - "$ref": "../core/operator-identity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-identity.json", "description": "Complete desired operator identity for settings-update mode. Omit this field to leave operator identity unchanged. When present, omission of operator_unit within the object removes the existing unit. Changing only operator_unit.name updates display metadata; changing operator_unit.id or adding/removing a unit rekeys the same account within the current operator. Changing operator requests an inter-entity handoff and MUST enter pending_approval until the seller verifies the current account authority, verified brand authorization, destination-operator acceptance, and any operator-scoped billing and grant transition. The seller MUST preserve account_id and account-scoped historical resources, MUST reject collisions without merging, and MUST apply no identity change if continuity cannot be preserved. MUST be accompanied by revision and MUST be absent in provisioning mode." }, "destination_billing_entity": { - "$ref": "../core/business-entity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", "description": "Complete staged billing identity for the requested destination operator during an operator-domain handoff on an account whose billing party is operator. This value is write-only while approval is pending and MUST NOT replace or be echoed as the account's canonical billing_entity until the handoff applies atomically. Required by the protocol when an operator-billed account changes operator; otherwise MUST be absent. Requires operator_identity and revision and MUST be absent in provisioning mode." }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", "description": "Brand reference identifying the advertiser. Required for **provisioning mode**; MUST be absent in settings-update mode. Only the BrandKey projection \u2014 `domain`, `brand_id`, and the canonicalized `countries[]` set \u2014 participates in account identity. Mutable or per-call BrandRef fields such as `industries`, `data_subject_contestation`, and `brand_kit_override` MUST NOT affect lookup, idempotency, or account creation. New 3.2 producers SHOULD send only the BrandKey fields; the broader BrandRef remains accepted on this existing 3.x task for compatibility." }, "operator": { @@ -52,7 +52,7 @@ "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "operator_unit": { - "$ref": "../core/operator-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", "description": "Optional operator-owned business unit, agency seat, or platform account for provisioning mode. operator_unit.id participates in the natural key; name is mapping/display metadata. MUST be absent in settings-update mode." }, "currency": { @@ -66,15 +66,15 @@ "description": "Immutable operational timezone selected for an account_fixed advertiser object. Required in provisioning mode when get_adcp_capabilities.account.timezone declares account_selection: buyer_selected, and the value MUST be one of supported_timezones. Omit for seller_fixed or seller_assigned modes. When supplied, it participates in the natural key. MUST be absent in settings-update mode." }, "billing": { - "$ref": "../enums/billing-party.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", "description": "Who the seller invoices for this buyer\u2013storefront account relationship. Required for **provisioning mode**; MUST be absent in settings-update mode (the invoiced party is fixed at provisioning time and cannot be changed via settings-update). This field does not select a payment rail, clearing intermediary, or per-media-buy settlement route." }, "billing_entity": { - "$ref": "../core/business-entity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/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. Permitted in both modes \u2014 sellers MAY accept refinements in settings-update mode (e.g., updated bank details)." }, "payment_terms": { - "$ref": "../enums/payment-terms.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", "description": "Payment terms for this account. The seller must either accept these terms or reject the account \u2014 terms are never silently remapped. When omitted, the seller applies its default terms. Permitted in both modes." }, "sandbox": { @@ -82,30 +82,16 @@ "description": "When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to buyer-declared accounts (require_operator_auth: false) in provisioning mode. For account-id namespaces, sandbox accounts are pre-existing test accounts discovered via list_accounts or supplied out-of-band." }, "preferred_reporting_protocol": { - "$ref": "../enums/cloud-storage-protocol.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/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'." }, - "reporting_delivery_configs": { - "type": "array", - "x-status": "experimental", - "description": "Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. Each generation binds the exact report_definition_id advertised by its offering. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller-scoped immutable destination-generation reference, including one registered through sync_agent_configuration. The account configuration independently authorizes disclosure for this feed and scope, so possession of a reusable reference is never account authority. Unknown, unauthorized, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", - "items": { - "$ref": "../core/reporting-delivery-config.json" - }, - "maxItems": 16, - "x-adcp-validation": { - "unique_config_generation": "Reject the account entry when two items share delivery_config_id and delivery_config_version.", - "immutable_generation": "A previously observed tuple must retain identical feed/profile/scope/finality/schedule/method/destination content. Only active and revocation_effective_at are mutable lifecycle intent.", - "authorization": "Verify authenticated-caller authority for the account, requested reporting scope, recipient, and destination before applying." - } - }, "notification_configs": { "type": "array", "description": "Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, optional `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, wholesale feed change payloads, and future account-anchored resource events after those event types are added to `notification-config.json`). Indicator and assignment registrations are prospective: activation does not replay current conditions, so buyers establish a complete baseline through `get_media_buys` by enumerating known IDs or requesting every status and exhausting pagination, without an indicator filter. Durable account lifecycle transitions such as later `payment_required`, `suspended`, `closed`, or recovery to `active` use `account.status_changed` on this surface; the one-shot `sync_accounts.push_notification_config` channel remains scoped to the async result of the original provisioning task. Declarative replace semantics: when this field is present, the buyer sends the full desired array and the seller replaces the account's current set with that array, keyed by account-scoped `subscriber_id`. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Re-sending an existing `subscriber_id` for the account replaces that subscriber's config rather than creating a duplicate; persisted entries whose `subscriber_id` does not appear in the sent array are removed, so the seller MUST NOT merge the new array with persisted state. Paused entries (`active: false`) use the same replacement semantics; a buyer that wants to preserve a paused subscriber MUST re-include it with `active: false`. Duplicate `subscriber_id` values within one submitted array are rejected. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth \u2014 see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) or at the agent (today: `capabilities.changed`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry \u2014 those events do not belong on this surface. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; canonical product subscribers repair through `list_products(if_feed_version)`, legacy product subscribers through `get_products(if_wholesale_feed_version)`, and signal subscribers through `get_signals(if_wholesale_feed_version)`. Account status change registrations carry the invalidation payload in `/schemas/core/account-status-changed-webhook.json`; receivers use `list_accounts` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.\n\nActivation proof: before activating a new or changed active subscriber, the seller MUST validate the URL, complete the account-level webhook proof-of-control challenge, and only then persist or expose the subscriber as `active: true`. For `account.status_changed`, sellers MUST assign `account_id` before completing proof so subsequent status transitions can identify the account and be repaired through `list_accounts`, even when external approval remains pending. A valid existing proof for the same `(account_id, subscriber_id, normalized url, authentication mode/credential binding, normalized event_types)` tuple MAY be reused; changing any element of that tuple requires fresh proof. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key and MUST include seller_agent_url, delivery_auth, and event_types so the receiver can verify the pending registration before echoing the challenge. New signers use `adcp_use: \"request-signing\"`; deprecated `webhook-signing` keys remain accepted during the compatibility window. Entries sent with `active: false` may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time, and those entries MUST NOT receive fires until reactivated. If proof fails or times out, the seller rejects the account entry with `action: \"failed\"`, leaves the prior notification_configs[] set unchanged, and reports `VALIDATION_ERROR` (or `INVALID_REQUEST` for malformed URLs) at the failing `notification_configs[j].url` field.\n\n**Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.", "items": { "allOf": [ { - "$ref": "../core/notification-config.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" }, { "if": { @@ -244,14 +230,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": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/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": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json b/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json index d0a9f565b..8e66a593e 100644 --- a/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json +++ b/schemas/cache/3.2.0-beta.6/account/sync-accounts-response.json @@ -5,10 +5,10 @@ "type": "object", "allOf": [ { - "$ref": "../core/version-envelope.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/version-envelope.json" }, { - "$ref": "../core/protocol-envelope.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/protocol-envelope.json" } ], "oneOf": [ @@ -33,7 +33,7 @@ "x-entity": "account" }, "brand": { - "$ref": "../core/brand-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", "description": "Current canonical brand reference for the account." }, "operator": { @@ -41,7 +41,7 @@ "description": "Current canonical operator domain. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "operator_unit": { - "$ref": "../core/operator-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", "description": "Current canonical operator-owned business unit, agency seat, or platform account. The stable id participates in the natural key; name is mutable display metadata. This is distinct from the seller/storefront account_id. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "revision": { @@ -50,11 +50,11 @@ "description": "Current account revision after this operation. Incremented by each persisted settings change, identity-change request, or identity-change disposition; not incremented by dry runs, validation failures, or exact idempotency replays. Pass this value in the next settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "../core/account-identity-change.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", "description": "Pending or rejected desired operator identity. The top-level operator and operator_unit remain canonical until an approved change is applied." }, "identity_change_preview": { - "$ref": "../core/account-identity-change-preview.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change-preview.json", "description": "Dry-run-only preview of whether the requested identity would apply, require approval, or be blocked, plus evaluated resource impacts. This value is not persisted; canonical fields and revision remain current." }, "currency": { @@ -94,11 +94,11 @@ "description": "Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). rejected: seller declined the account request. payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: was active, now terminated." }, "billing": { - "$ref": "../enums/billing-party.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", "description": "Who is invoiced on this account. Matches the requested billing model." }, "billing_entity": { - "$ref": "../core/business-entity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Sellers MAY add verified fields, but MUST NOT return data from a different entity. During an operator-domain handoff this remains the current entity until approval applies atomically; destination_billing_entity is staged and write-only. Bank details are omitted (write-only)." }, "destination_billing_entity": { @@ -106,7 +106,7 @@ "not": {} }, "account_scope": { - "$ref": "../enums/account-scope.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/account-scope.json" }, "setup": { "type": "object", @@ -137,7 +137,7 @@ "description": "Rate card applied to this account" }, "payment_terms": { - "$ref": "../enums/payment-terms.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", "description": "Payment terms agreed for this account. When the account is active, these are the binding terms for all invoices on this account." }, "credit_limit": { @@ -161,7 +161,7 @@ "type": "array", "description": "Per-account errors (only present when action is 'failed')", "items": { - "$ref": "../core/error.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json" } }, "warnings": { @@ -179,21 +179,12 @@ "type": "array", "description": "Applied notification subscribers for this account after declarative replacement and activation-proof checks. Present on `created`, `updated`, and `unchanged` results when the buyer included `notification_configs` in the request or any persisted entries exist on the account. Entries are keyed by account-scoped `subscriber_id`; re-sending an existing `subscriber_id` replaces that subscriber's config rather than creating a duplicate. Only configs that the seller has persisted are echoed. `authentication.credentials` is omitted on every entry (write-only).", "items": { - "$ref": "../core/notification-config.json" - }, - "maxItems": 16 - }, - "reporting_delivery_configs": { - "type": "array", - "x-status": "experimental", - "description": "Resolved caller-owned durable reporting delivery configurations after declarative replacement. Each item echoes desired state and reports validation/setup state plus the seller-issued destination_ref when resolved. A setup action may direct an authenticated user to complete a provider grant or Open Sharing activation, but MUST NOT carry credentials or a bearer URL.", - "items": { - "$ref": "../core/reporting-delivery-config-state.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" }, "maxItems": 16 }, "authorization": { - "$ref": "../core/account-authorization.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-authorization.json", "description": "Optional. The caller's scope grant against this account after the sync operation. Vendor agents of any type (media-buy, signals, governance, creative, brand) that support scope introspection SHOULD populate this so callers can preempt RBAC errors rather than discovering scope by trial and error. Media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Present on `created`, `updated`, and `unchanged` results; omitted on `failed` results (where the account did not reach a usable state). Absence means the vendor agent does not advertise introspectable scope \u2014 callers MUST NOT infer access from absence." } }, @@ -220,10 +211,10 @@ } }, "context": { - "$ref": "../core/context.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" } }, "required": [ @@ -285,15 +276,15 @@ "type": "array", "description": "Operation-level errors (e.g., authentication failure, service unavailable)", "items": { - "$ref": "../core/error.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "../core/context.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/context.json" }, "ext": { - "$ref": "../core/ext.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/account.json b/schemas/cache/3.2.0-beta.6/core/account.json index 50c841733..6c4521dea 100644 --- a/schemas/cache/3.2.0-beta.6/core/account.json +++ b/schemas/cache/3.2.0-beta.6/core/account.json @@ -22,11 +22,11 @@ "description": "Optional intermediary who receives invoices on behalf of the advertiser (e.g., agency)" }, "status": { - "$ref": "../enums/account-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/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": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", "description": "Brand reference identifying the advertiser" }, "operator": { @@ -36,7 +36,7 @@ "x-entity": "operator" }, "operator_unit": { - "$ref": "operator-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-unit.json", "description": "Operator-owned business unit, agency seat, or platform account associated with this advertiser account. The id round-trips from the natural key; name is mutable display metadata. This is distinct from account_id, which belongs to the seller/storefront namespace." }, "revision": { @@ -45,7 +45,7 @@ "description": "Monotonically increasing optimistic-concurrency token for this account. Incremented on every persisted settings change, identity-change request, and identity-change disposition; reads, dry runs, validation failures, and exact idempotency replays do not increment it. Pass the latest observed value in a sync_accounts settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "account-identity-change.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", "description": "Pending or rejected operator-identity transition. While present, the top-level operator and operator_unit remain the current canonical identity. Re-read list_accounts until the request is applied (canonical fields change and this object disappears) or rejected." }, "currency": { @@ -59,11 +59,11 @@ "description": "Immutable operational timezone for this account, expressed as UTC or an IANA timezone identifier. AdCP 3.2 sellers return it on every account. It is the default calendar-day boundary for account-scoped behavior unless a feature explicitly declares another timezone basis. For buyer-selected account_fixed provisioning it participates in the natural account key." }, "billing": { - "$ref": "../enums/billing-party.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/billing-party.json", "description": "Who is invoiced on this account. See billing_entity for the invoiced party's business details." }, "billing_entity": { - "$ref": "business-entity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Contains the legal name, tax IDs, and address 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 and the request-only destination_billing_entity MUST NOT be exposed." }, "destination_billing_entity": { @@ -75,7 +75,7 @@ "description": "Identifier for the rate card applied to this account" }, "payment_terms": { - "$ref": "../enums/payment-terms.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/payment-terms.json", "description": "Payment terms agreed for this account. Binding for all invoices when the account is active." }, "credit_limit": { @@ -121,7 +121,7 @@ "additionalProperties": true }, "account_scope": { - "$ref": "../enums/account-scope.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/account-scope.json" }, "governance_agents": { "type": "array", @@ -149,7 +149,7 @@ "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).", "properties": { "protocol": { - "$ref": "../enums/cloud-storage-protocol.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/cloud-storage-protocol.json", "description": "Cloud storage protocol" }, "bucket": { @@ -230,18 +230,9 @@ }, "notification_configs": { "type": "array", - "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, wholesale feed changes, and reporting.delivery_ready. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. reporting.delivery_ready is repaired through get_reporting_status; indicator and assignment payloads are repaired through get_media_buys. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", + "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, and wholesale feed changes. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. Indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", "items": { - "$ref": "notification-config.json" - }, - "maxItems": 16 - }, - "reporting_delivery_configs": { - "type": "array", - "x-status": "experimental", - "description": "Resolved durable reporting delivery configurations owned by the authenticated caller for this account. list_accounts MUST expose only the calling principal's set. State and seller-issued destination_ref are returned; credentials and bearer profiles MUST NOT appear. Any setup URL is a secret-free authenticated entry point, not a bearer credential.", - "items": { - "$ref": "reporting-delivery-config-state.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/notification-config.json" }, "maxItems": 16 }, @@ -249,12 +240,12 @@ "type": "array", "description": "Recent webhook delivery attempts scoped to this account when the caller requested webhook activity on list_accounts and the seller surfaces the log. Includes account-anchored notifications such as account.status_changed and MAY include other account-level fires relevant to this account. Three-state presence follows the shared webhook_activity[] contract: omitted means unsupported or not requested, [] means supported but no retained fires, non-empty lists recent attempts most-recent-first.", "items": { - "$ref": "webhook-activity-record.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-activity-record.json" }, "maxItems": 200 }, "ext": { - "$ref": "ext.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/notification-config.json b/schemas/cache/3.2.0-beta.6/core/notification-config.json index 104d9f166..dbdda2dc0 100644 --- a/schemas/cache/3.2.0-beta.6/core/notification-config.json +++ b/schemas/cache/3.2.0-beta.6/core/notification-config.json @@ -18,7 +18,7 @@ }, "event_types": { "type": "array", - "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, wholesale feed, and reporting.delivery_ready events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", + "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, and wholesale feed events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", "items": { "type": "string", "enum": [ @@ -35,8 +35,7 @@ "signal.updated", "signal.priced", "signal.removed", - "wholesale_feed.bulk_change", - "reporting.delivery_ready" + "wholesale_feed.bulk_change" ] }, "minItems": 1, @@ -59,7 +58,7 @@ "schemes": { "type": "array", "items": { - "$ref": "../enums/auth-scheme.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/auth-scheme.json" }, "minItems": 1, "maxItems": 1 @@ -81,7 +80,7 @@ "description": "When false, the seller persists the configuration but suppresses fires. Use to pause a noisy subscriber without losing the registration. Sellers MUST NOT skip persisting the entry when `active: false` \u2014 the buyer's next `sync_accounts` MUST observe the same array, otherwise the buyer cannot distinguish pause from drop. Paused configs may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time. Reactivation requires full SSRF validation with connect pinning plus proof-of-control for any tuple without current valid proof." }, "ext": { - "$ref": "ext.json" + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/ext.json" } }, "required": [ diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json b/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json deleted file mode 100644 index 472183927..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-canonical-content-digest.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Canonical Content Digest", - "x-status": "experimental", - "description": "Cryptographic digest of logical reporting rows under an immutable canonicalization contract.", - "type": "object", - "properties": { - "algorithm": { - "type": "string", - "const": "sha256" - }, - "value": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - }, - "canonicalization_id": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "canonicalization_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", - "description": "Location of the exact immutable canonicalization contract. Consumers verify canonicalization_sha256 before applying it." - }, - "canonicalization_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - } - }, - "required": [ - "algorithm", - "value", - "canonicalization_id", - "canonicalization_uri", - "canonicalization_sha256" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json deleted file mode 100644 index b5c98a48c..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-capabilities.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Capabilities", - "x-status": "experimental", - "description": "Managed reporting status and durable delivery support. Each offerings entry is an atomic supported combination; buyers MUST NOT construct an unsupported cross-product. Presence requires media_buy.reporting_delivery in experimental_features and an RFC 9421 webhook-signing capability. Polling get_media_buy_delivery remains the compatibility baseline when this block is absent.", - "type": "object", - "properties": { - "supported": { - "type": "boolean", - "const": true - }, - "configuration_task": { - "type": "string", - "const": "sync_accounts" - }, - "status_task": { - "type": "string", - "const": "get_reporting_status" - }, - "receipt_task": { - "type": "string", - "const": "sync_reporting_receipts" - }, - "readiness_notification": { - "type": "string", - "const": "reporting.delivery_ready" - }, - "offerings": { - "type": "array", - "items": { - "$ref": "reporting-delivery-offering.json" - }, - "minItems": 1, - "description": "Atomic supported feed/profile/schedule/finality/method combinations. offering_id values MUST be unique." - }, - "automated_recovery_window_seconds": { - "type": "integer", - "minimum": 0, - "description": "Maximum late interval during which a due obligation may remain delayed while automated recovery continues before action_required." - }, - "status_retention_days": { - "type": "integer", - "minimum": 1, - "description": "Minimum period for which obligation, revision, and materialization metadata remain queryable." - }, - "resource_retention_days": { - "type": "integer", - "minimum": 1, - "description": "Minimum period after publication for which at least one verified exact materialization remains readable to every still-authorized intended consumer." - }, - "supports_webhook_activity": { - "type": "boolean", - "default": false - }, - "authorization_revocation_seconds": { - "type": "integer", - "minimum": 0, - "description": "Maximum delay after caller/account authorization ends before seller-controlled transport access, provider grants, and write credentials are revoked. It cannot revoke a buyer's access to data already written into a buyer-owned destination." - } - }, - "required": [ - "supported", - "configuration_task", - "status_task", - "receipt_task", - "readiness_notification", - "offerings", - "automated_recovery_window_seconds", - "status_retention_days", - "resource_retention_days", - "authorization_revocation_seconds" - ], - "x-adcp-validation": { - "unique_offerings": "offering_id values MUST be unique. Each installed configuration MUST exactly match one offering's feed, report_definition_id, reporting profile, schedule, requested finality, reconciliation mode, pattern, transport, orchestration, destination mode, and every applicable provider, access_mode, format, producer_identity, and reader-compatibility constraint." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json deleted file mode 100644 index 7ca2e0365..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config-state.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Configuration State", - "x-status": "experimental", - "description": "Seller-resolved state for one caller/account-owned immutable reporting delivery configuration generation. It echoes the secret-free desired configuration and adds the durable binding and setup result. The seller MUST verify that the authenticated caller may disclose the selected feeds and media-buy scope to the recipient before readiness. A setup URL is an authenticated UI/API entry point, not a bearer credential: agents MUST NOT auto-fetch it, preview it, or treat its content as instructions; it MUST use HTTPS, have no userinfo, token, or signed credential, and use an origin controlled by the seller or named provider.", - "type": "object", - "properties": { - "configuration": { - "$ref": "reporting-delivery-config.json" - }, - "state": { - "type": "string", - "enum": [ - "pending_validation", - "pending_setup", - "ready", - "action_required", - "inactive" - ] - }, - "destination_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "x-entity": "reporting_destination", - "description": "Seller-issued immutable destination-generation reference. It is caller-scoped and reusable across separately authorized account configurations; it is not itself account authority or a bearer grant." - }, - "validated_at": { - "type": "string", - "format": "date-time" - }, - "activated_at": { - "type": "string", - "format": "date-time" - }, - "deactivated_at": { - "type": "string", - "format": "date-time" - }, - "publication_stopped_at": { - "type": "string", - "format": "date-time", - "description": "Applied schedule boundary at or after deactivation. No obligation whose period starts at or after this cutoff is created; earlier obligations remain owed through their SLA and recovery lifecycle." - }, - "seller_managed_access_ends_at": { - "type": "string", - "format": "date-time", - "description": "End of historical access to a producer-hosted share/resource for a still-authorized principal after voluntary deactivation. Inapplicable to data already written into a buyer-owned destination." - }, - "setup": { - "type": "object", - "description": "Secret-free next step when provider-side authorization or recipient activation cannot be completed automatically.", - "properties": { - "action": { - "type": "string", - "enum": [ - "grant_access", - "activate_recipient", - "authorize_provider", - "repair_access" - ] - }, - "message": { - "type": "string", - "minLength": 1, - "maxLength": 2000, - "description": "Untrusted display text only. SDKs and agents dispatch only on the closed action value and never execute embedded links or instructions." - }, - "url": { - "type": "string", - "format": "uri", - "pattern": "^https://" - }, - "expires_at": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "action", - "message" - ], - "additionalProperties": false - }, - "issues": { - "type": "array", - "items": { - "$ref": "reporting-status-issue.json" - }, - "minItems": 1 - } - }, - "required": [ - "configuration", - "state" - ], - "allOf": [ - { - "if": { - "properties": { - "state": { - "const": "ready" - } - } - }, - "then": { - "properties": { - "configuration": { - "properties": { - "active": { - "const": true - } - } - } - }, - "required": [ - "destination_ref", - "validated_at", - "activated_at" - ], - "not": { - "anyOf": [ - { - "required": [ - "setup" - ] - }, - { - "required": [ - "issues" - ] - }, - { - "required": [ - "deactivated_at" - ] - } - ] - } - } - }, - { - "if": { - "properties": { - "state": { - "enum": [ - "pending_setup", - "action_required" - ] - } - } - }, - "then": { - "anyOf": [ - { - "required": [ - "setup" - ] - }, - { - "required": [ - "issues" - ] - } - ] - } - }, - { - "if": { - "properties": { - "state": { - "const": "inactive" - } - } - }, - "then": { - "required": [ - "deactivated_at", - "publication_stopped_at" - ] - } - } - ], - "x-adcp-validation": { - "binding_authorization": "destination_ref and any recipient identity MUST be bound to the stable authenticated caller. This account configuration separately binds and authorizes the resolved account/feed/scope; possession of a reusable destination_ref grants no account authority. Proof of recipient/destination control and disclosure authorization MUST precede ready.", - "period_eligibility": "Only complete schedule periods whose period.start is at or after activated_at are eligible. A mid-period activation begins at the next boundary; periods are never clipped. On voluntary deactivation, publication_stopped_at MUST be a schedule boundary at or after deactivated_at. Periods whose start is before that boundary remain obligations and may complete afterward; periods whose start is at or after it MUST NOT be created.", - "revocation": "Voluntary deactivation stops new obligations/publication at publication_stopped_at. A still-authorized principal may retain a producer-hosted historical share only through seller_managed_access_ends_at. Caller authorization loss, account closure, or recipient revocation overrides that window and terminates seller-controlled transport access and provider grants within authorization_revocation_seconds. For buyer-owned destinations, the seller revokes write ability but cannot revoke the buyer's access to bytes already delivered; buyer retention governs those copies.", - "safe_setup_url": "Reject URL userinfo, non-HTTPS, credential-like query/fragment values, redirects or origins outside the seller/named provider allowlist. Agents must surface the URL for explicit human action without fetching or interpreting its content." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json deleted file mode 100644 index c4b56f3c4..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-config.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Configuration", - "x-status": "experimental", - "description": "Desired durable reporting delivery for one account. Entries are owned by (authenticated caller, account) and keyed by (delivery_config_id, delivery_config_version). The generation's feed, report definition, profile, scope, finality, schedule, method, and immutable destination generation are fixed; only lifecycle intent (`active` and `revocation_effective_at`) may change without a new generation. Sellers reject a reused version with different immutable content. sync_accounts replacement semantics apply only to the calling principal's set. Omission leaves that set unchanged; [] deactivates that caller's set and stops new publication without affecting another caller. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", - "type": "object", - "properties": { - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config", - "description": "Caller-selected stable identifier, unique within the authenticated caller and account." - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1, - "description": "Caller-selected immutable semantic generation. Increment when feed/profile/scope/finality/schedule/method/destination changes; lifecycle fields may change in place." - }, - "offering_id": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Za-z0-9_.:-]{1,128}$", - "x-entity": "reporting_offering", - "description": "Atomic reporting offering advertised by the seller that binds feed, profile, schedule, finality, and delivery support." - }, - "active": { - "type": "boolean", - "default": true, - "description": "Whether new reporting obligations should use this configuration. Inactive configurations remain visible for historical resolution." - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ], - "description": "Operational use of this independently reconciled feed. pacing is the fast snapshot path; billing is invoice-authoritative. Event-level exposure is intentionally deferred until a privacy and authorization contract exists." - }, - "report_definition_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_definition", - "description": "Exact immutable semantic definition selected from the offering. This makes the expected obligation identity independently derivable and prevents attribution, timezone, source-mapping, or restatement-policy drift behind a profile label." - }, - "reporting_profile": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Za-z0-9_.:-]{1,128}$", - "description": "Versioned semantic profile for the aggregate report, such as media_buy_delivery_v1. It MUST match the selected offering." - }, - "scope": { - "type": "object", - "description": "Media buys covered by this configuration.", - "properties": { - "all_media_buys": { - "type": "boolean", - "const": true - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "minItems": 1, - "uniqueItems": true - } - }, - "minProperties": 1, - "maxProperties": 1, - "additionalProperties": false - }, - "required_finality": { - "$ref": "../enums/reporting-finality.json", - "description": "Finality the durable path must ultimately provide. Snapshot delivery may still precede an official requirement." - }, - "reconciliation_mode": { - "$ref": "reporting-reconciliation-mode.json", - "description": "Whether producer-side delivery evidence is sufficient or the selected consumer must submit an authenticated matching receipt. Billing MUST use consumer_receipt." - }, - "schedule": { - "$ref": "reporting-schedule.json" - }, - "method": { - "$ref": "reporting-delivery-method.json" - }, - "revocation_effective_at": { - "type": "string", - "format": "date-time", - "description": "Optional requested cutoff for deactivation. No new publication may begin after the applied cutoff; historical access is limited to the contracted recovery window." - } - }, - "required": [ - "delivery_config_id", - "delivery_config_version", - "offering_id", - "active", - "feed_purpose", - "report_definition_id", - "reporting_profile", - "scope", - "required_finality", - "reconciliation_mode", - "schedule", - "method" - ], - "allOf": [ - { - "if": { - "properties": { - "feed_purpose": { - "const": "billing" - } - }, - "required": [ - "feed_purpose" - ] - }, - "then": { - "properties": { - "reconciliation_mode": { - "const": "consumer_receipt" - } - } - } - }, - { - "if": { - "properties": { - "feed_purpose": { - "const": "billing" - } - }, - "required": [ - "feed_purpose" - ] - }, - "then": { - "properties": { - "required_finality": { - "const": "official" - } - } - } - } - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json deleted file mode 100644 index 4e0bd666f..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-method.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Method", - "x-status": "experimental", - "description": "Provider-neutral durable reporting delivery method. The caller may request protocol-managed provisioning or reuse an existing seller-issued binding. Transport names are open so new platforms do not require an AdCP enum change. Credentials, bearer profiles, and private keys MUST NOT appear. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", - "type": "object", - "oneOf": [ - { - "title": "File transfer", - "type": "object", - "properties": { - "pattern": { - "type": "string", - "const": "file_transfer", - "description": "Immutable file/object publication with a manifest-last commit boundary." - }, - "transport": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$", - "description": "Storage transport such as s3, gcs, azure_blob, or sftp." - }, - "orchestration": { - "type": "string", - "enum": [ - "producer_managed", - "consumer_managed" - ], - "description": "Party responsible for starting and monitoring the transfer. Independent of destination ownership and the service that copies bytes." - }, - "destination": { - "$ref": "reporting-write-destination.json" - }, - "format": { - "type": "string", - "enum": [ - "jsonl", - "csv", - "parquet", - "avro", - "orc" - ], - "description": "Physical file format." - } - }, - "required": [ - "pattern", - "transport", - "orchestration", - "destination", - "format" - ], - "additionalProperties": false - }, - { - "title": "Dataset share", - "type": "object", - "properties": { - "pattern": { - "type": "string", - "const": "dataset_share", - "description": "Producer-hosted relation or share read through the intended recipient's access path." - }, - "transport": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$", - "description": "Sharing transport such as delta_sharing, snowflake_secure_sharing, or bigquery_authorized_view." - }, - "orchestration": { - "type": "string", - "enum": [ - "producer_managed", - "consumer_managed" - ], - "description": "Party responsible for configuring and monitoring the share." - }, - "destination": { - "$ref": "reporting-dataset-share-destination.json" - } - }, - "required": [ - "pattern", - "transport", - "orchestration", - "destination" - ], - "additionalProperties": false - }, - { - "title": "Warehouse materialization", - "type": "object", - "properties": { - "pattern": { - "type": "string", - "const": "warehouse_materialization", - "description": "Exact-revision publication into a warehouse relation or partition." - }, - "transport": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$", - "description": "Warehouse or transfer transport such as bigquery, snowflake, databricks_sql, or gam_bigquery_transfer." - }, - "orchestration": { - "type": "string", - "enum": [ - "producer_managed", - "consumer_managed" - ], - "description": "Party responsible for starting and monitoring materialization. consumer_managed covers platform transfer services that physically write consumer-owned tables." - }, - "destination": { - "$ref": "reporting-write-destination.json" - } - }, - "required": [ - "pattern", - "transport", - "orchestration", - "destination" - ], - "additionalProperties": false - } - ] -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json deleted file mode 100644 index 04cb619e0..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-offering.json +++ /dev/null @@ -1,371 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Offering", - "x-status": "experimental", - "description": "One atomic combination a seller can honor. Buyers MUST NOT form a cross-product from separate capability arrays; each installed configuration selects one offering_id and values within that offering.", - "type": "object", - "properties": { - "offering_id": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Za-z0-9_.:-]{1,128}$", - "x-entity": "reporting_offering" - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "report_definition_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_definition", - "description": "Immutable semantic definition for metric, grain, attribution, action-report-time, timezone/calendar, source/API mapping, and restatement/finality policy. Configurations and revisions MUST echo this exact value." - }, - "report_definition_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", - "description": "Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin." - }, - "report_definition_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "Digest of the exact report-definition bytes. SDKs verify this before parsing and cache by digest." - }, - "reporting_profile": { - "type": "object", - "description": "Machine-readable semantic and validation contract for delivered rows.", - "properties": { - "id": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Za-z0-9_.:-]{1,128}$" - }, - "version": { - "type": "string", - "minLength": 1, - "maxLength": 64 - }, - "schema_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", - "description": "Authenticated seller/provider or AdCP-registry HTTPS origin only; never an IP literal, userinfo URL, redirect target, or mutable validation authority." - }, - "schema_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "Digest of the exact schema bytes. SDKs verify this before parsing and cache by digest." - }, - "schema_dialect": { - "type": "string", - "const": "https://json-schema.org/draft/2020-12/schema", - "description": "Closed SDK-bundled dialect. The SDK never resolves a metaschema over the network, and the fetched document's $schema MUST equal this value." - }, - "schema_ref_policy": { - "type": "string", - "const": "local_fragment_only", - "description": "The fetched schema is a self-contained bundle. Every $ref is a local # fragment; remote and relative-document dependencies are forbidden." - }, - "grain": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "description": "Stable description of what one logical row represents." - }, - "primary_keys": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "minItems": 1, - "uniqueItems": true - }, - "canonicalization_id": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "description": "Rules for stable logical row ordering, value encoding, nulls, and schema used by canonical_content_digest." - }, - "canonicalization_contract_version": { - "type": "string", - "const": "1.0" - }, - "canonicalization_media_type": { - "type": "string", - "const": "application/vnd.adcp.reporting-canonicalization+json" - }, - "canonicalization_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", - "description": "Retrievable exact canonicalization contract on the authenticated seller/provider or AdCP-registry origin. SDKs apply the same bounded, redirect-free SSRF controls as schema_uri and verify canonicalization_sha256 before use." - }, - "canonicalization_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "Digest of the exact canonicalization contract identified by canonicalization_id." - } - }, - "required": [ - "id", - "version", - "schema_uri", - "schema_sha256", - "schema_dialect", - "schema_ref_policy", - "grain", - "primary_keys", - "canonicalization_id", - "canonicalization_contract_version", - "canonicalization_media_type", - "canonicalization_uri", - "canonicalization_sha256" - ], - "additionalProperties": false - }, - "schedule": { - "$ref": "reporting-schedule-offering.json" - }, - "supported_finality": { - "type": "array", - "items": { - "$ref": "../enums/reporting-finality.json" - }, - "minItems": 1, - "uniqueItems": true - }, - "reconciliation_mode": { - "$ref": "reporting-reconciliation-mode.json", - "description": "Receipt contract included in this atomic offering. Billing offerings MUST require consumer_receipt." - }, - "method": { - "type": "object", - "properties": { - "pattern": { - "type": "string", - "enum": [ - "file_transfer", - "dataset_share", - "warehouse_materialization" - ] - }, - "transport": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$" - }, - "orchestration": { - "type": "string", - "enum": [ - "producer_managed", - "consumer_managed" - ] - }, - "destination_modes": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "provision", - "existing" - ] - }, - "minItems": 1, - "uniqueItems": true - }, - "provider": { - "type": "object", - "properties": { - "domain": { - "type": "string", - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" - } - }, - "required": [ - "domain" - ], - "additionalProperties": false - }, - "format": { - "type": "string", - "enum": [ - "jsonl", - "csv", - "parquet", - "avro", - "orc" - ] - }, - "access_mode": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$" - }, - "producer_identity": { - "type": "object", - "description": "Seller principal a buyer grants access to for this exact buyer-hosted destination offering.", - "properties": { - "provider": { - "type": "object", - "properties": { - "domain": { - "type": "string", - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" - } - }, - "required": [ - "domain" - ], - "additionalProperties": false - }, - "identity": { - "type": "string", - "minLength": 1, - "maxLength": 512 - }, - "cloud": { - "type": "string", - "enum": [ - "aws", - "azure", - "gcp" - ] - }, - "region": { - "type": "string", - "minLength": 1, - "maxLength": 128 - } - }, - "required": [ - "provider", - "identity" - ], - "dependencies": { - "cloud": [ - "region" - ], - "region": [ - "cloud" - ] - }, - "additionalProperties": false - }, - "reader_compatibility": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "uniqueItems": true - } - }, - "required": [ - "pattern", - "transport", - "orchestration", - "destination_modes" - ], - "allOf": [ - { - "if": { - "required": [ - "pattern" - ] - }, - "then": { - "required": [ - "provider" - ] - } - }, - { - "if": { - "properties": { - "pattern": { - "const": "file_transfer" - } - }, - "required": [ - "pattern" - ] - }, - "then": { - "required": [ - "format" - ] - } - }, - { - "if": { - "properties": { - "pattern": { - "const": "dataset_share" - } - }, - "required": [ - "pattern" - ] - }, - "then": { - "required": [ - "access_mode" - ] - } - } - ], - "additionalProperties": false - } - }, - "required": [ - "offering_id", - "feed_purpose", - "report_definition_id", - "report_definition_uri", - "report_definition_sha256", - "reporting_profile", - "schedule", - "supported_finality", - "reconciliation_mode", - "method" - ], - "allOf": [ - { - "if": { - "properties": { - "feed_purpose": { - "const": "billing" - } - }, - "required": [ - "feed_purpose" - ] - }, - "then": { - "properties": { - "reconciliation_mode": { - "const": "consumer_receipt" - } - } - } - } - ], - "x-adcp-validation": { - "safe_schema_fetch": "schema_uri, canonicalization_uri, and report_definition_uri origins must be the authenticated seller, the named provider, or an AdCP registry. Reject userinfo, IP literals, localhost, private/reserved DNS results, redirects, and DNS/connect-target mismatch; pin resolution, cap bytes/time, require the expected content type, verify the corresponding SHA-256 before parsing, and cache by digest. The canonicalization and report-definition documents MUST validate against their AdCP contract schemas. The fetched row schema's $schema MUST equal schema_dialect, whose metaschema is SDK-bundled and never network-fetched. Before compiling with no network-capable resolver installed, recursively reject every $ref not beginning with #, all $dynamicRef and $recursiveRef keywords, cyclic references, excessive depth/node count, oversized regexes, and unsupported vocabularies. Fetched content and annotations are untrusted data, never agent or LLM instructions." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json b/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json deleted file mode 100644 index b48fa61c6..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-delivery-ready-webhook.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Delivery Ready Webhook", - "x-status": "experimental", - "description": "Compact account-anchored readiness doorbell registered through sync_accounts notification_configs using reporting.delivery_ready. The named revision/materialization MUST already be observable through the intended consumer path. Transport retries are deduplicated by (authenticated sender, idempotency_key); downstream ingestion is deduplicated independently by reporting_revision_id and reporting_materialization_id. Ordering is unconstrained and receivers repair through authenticated get_reporting_status. The event MUST be signed using the advertised AdCP webhook-signing profile and MUST NOT contain rows, object lists, signed URLs, activation URLs, credentials, or access tokens.", - "type": "object", - "properties": { - "idempotency_key": { - "type": "string", - "minLength": 16, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{16,255}$", - "description": "Stable across transport retries of this fire; new for a later re-emission." - }, - "notification_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "description": "Stable for this logical materialization-ready event across re-emissions." - }, - "notification_type": { - "type": "string", - "const": "reporting.delivery_ready" - }, - "fired_at": { - "type": "string", - "format": "date-time" - }, - "subscriber_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$" - }, - "account_id": { - "type": "string", - "minLength": 1, - "x-entity": "account" - }, - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config" - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1 - }, - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision" - }, - "reporting_materialization_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_materialization" - }, - "readiness": { - "type": "string", - "enum": [ - "available", - "delivered" - ] - }, - "finality": { - "$ref": "../enums/reporting-finality.json" - }, - "data_through": { - "type": [ - "string", - "null" - ], - "format": "date-time" - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - } - }, - "required": [ - "idempotency_key", - "notification_id", - "notification_type", - "fired_at", - "subscriber_id", - "account_id", - "delivery_config_id", - "delivery_config_version", - "feed_purpose", - "reporting_revision_id", - "reporting_materialization_id", - "readiness", - "finality", - "data_through" - ], - "x-adcp-validation": { - "authorization": "The authenticated webhook signer, subscriber_id, account_id, configuration generation, revision, and materialization MUST belong to one caller/account binding; receivers MUST repair through an authenticated status read rather than trusting event contents alone.", - "deduplication": "Deduplicate transport retries by (authenticated sender, idempotency_key), then deduplicate ingestion independently by reporting_revision_id and reporting_materialization_id." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json b/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json deleted file mode 100644 index 12132731b..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-file-entry.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting File Entry", - "x-status": "experimental", - "description": "One immutable data object committed by a reporting file manifest.", - "type": "object", - "properties": { - "object_ref": { - "type": "string", - "minLength": 1, - "maxLength": 1024, - "description": "Credential-free object identifier resolved through the configured destination." - }, - "size_bytes": { - "type": "integer", - "minimum": 0 - }, - "sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - }, - "row_count": { - "type": "integer", - "minimum": 0 - }, - "partition": { - "type": "object", - "additionalProperties": { - "type": "string", - "maxLength": 512 - }, - "maxProperties": 32 - } - }, - "required": [ - "object_ref", - "size_bytes", - "sha256", - "row_count" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json b/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json deleted file mode 100644 index 1ca708b2c..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-file-manifest.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting File Manifest", - "x-status": "experimental", - "description": "Normative manifest for one completed file-transfer materialization. Producers write every data object first and publish this manifest last. Its appearance is the commit point: consumers MUST ignore unlisted objects and MUST NOT process the materialization before a digest-valid complete manifest is visible.", - "type": "object", - "properties": { - "manifest_version": { - "type": "string", - "const": "1.0" - }, - "complete": { - "type": "boolean", - "const": true - }, - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision" - }, - "reporting_obligation_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_obligation" - }, - "reporting_materialization_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_materialization" - }, - "period": { - "type": "object", - "properties": { - "start": { - "type": "string", - "format": "date-time" - }, - "end": { - "type": "string", - "format": "date-time" - }, - "source_timezone": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "start", - "end", - "source_timezone" - ], - "additionalProperties": false - }, - "format": { - "type": "string", - "enum": [ - "jsonl", - "csv", - "parquet", - "avro", - "orc" - ] - }, - "compression": { - "$ref": "reporting-file-compression.json" - }, - "files": { - "type": "array", - "items": { - "$ref": "reporting-file-entry.json" - }, - "minItems": 1 - }, - "total_size_bytes": { - "type": "integer", - "minimum": 0 - }, - "row_count": { - "type": "integer", - "minimum": 0 - }, - "control_totals": { - "type": "array", - "items": { - "$ref": "reporting-control-total.json" - }, - "uniqueItems": true - }, - "created_at": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "manifest_version", - "complete", - "reporting_revision_id", - "reporting_obligation_id", - "reporting_materialization_id", - "period", - "format", - "compression", - "files", - "total_size_bytes", - "row_count", - "control_totals", - "created_at" - ], - "x-adcp-validation": { - "manifest_digest": "reporting_resource.manifest_sha256 MUST equal SHA-256 over the exact manifest bytes before parsing.", - "object_set": "object_ref values MUST be unique. total_size_bytes and row_count MUST equal the sums across files. Every file checksum MUST be verified before downstream commit.", - "identity_match": "The revision, obligation, materialization, period, format, row count, and control totals MUST equal the referenced ledger records and verification evidence." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json b/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json deleted file mode 100644 index a6a9c92dd..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-materialization.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Materialization", - "x-status": "experimental", - "description": "One attempt to expose an immutable reporting revision through a configured durable delivery method. Automated retry creates a new materialization and attempt number while preserving reporting_revision_id. available is a verified producer-hosted pull/share claim; delivered is a verified recipient/destination claim. Existing per-buy inline reporting remains on its existing data API and is outside this v1 managed ledger.", - "type": "object", - "properties": { - "reporting_materialization_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_materialization" - }, - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision" - }, - "reporting_obligation_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_obligation", - "description": "Destination-specific obligation this materialization attempts to satisfy." - }, - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config", - "description": "Durable configuration that requested this materialization." - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1 - }, - "destination_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "x-entity": "reporting_destination", - "description": "Immutable caller-owned destination generation selected by the account-authorized obligation. It may be reused by the same caller across other independently authorized accounts." - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "method": { - "type": "string", - "enum": [ - "file_transfer", - "dataset_share", - "warehouse_materialization" - ] - }, - "transport": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$" - }, - "attempt": { - "type": "integer", - "minimum": 1 - }, - "status": { - "type": "string", - "enum": [ - "pending", - "available", - "delivered", - "failed" - ], - "description": "Lifecycle of this attempt. pending may transition once to available, delivered, or failed; terminal evidence is immutable. Staleness is evaluated in get_reporting_status health, not stored as a materialization state." - }, - "ready_at": { - "type": "string", - "format": "date-time", - "description": "When consumer-path or destination verification completed." - }, - "failed_at": { - "type": "string", - "format": "date-time" - }, - "failure_code": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Z][A-Z0-9_]*$", - "description": "Stable safe failure classification. MUST NOT include credentials or provider response bodies." - }, - "resource": { - "$ref": "reporting-resource.json" - }, - "verification": { - "$ref": "reporting-verification.json" - }, - "created_at": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "reporting_materialization_id", - "reporting_revision_id", - "reporting_obligation_id", - "delivery_config_id", - "delivery_config_version", - "destination_ref", - "feed_purpose", - "method", - "attempt", - "status", - "created_at" - ], - "allOf": [ - { - "if": { - "properties": { - "status": { - "enum": [ - "available", - "delivered" - ] - } - }, - "required": [ - "status" - ] - }, - "then": { - "required": [ - "ready_at", - "resource", - "verification" - ] - } - }, - { - "if": { - "properties": { - "status": { - "const": "failed" - } - }, - "required": [ - "status" - ] - }, - "then": { - "required": [ - "failed_at", - "failure_code" - ] - } - }, - { - "if": { - "properties": { - "method": { - "const": "file_transfer" - } - }, - "required": [ - "method" - ] - }, - "then": { - "properties": { - "resource": { - "properties": { - "kind": { - "const": "manifest" - } - } - }, - "verification": { - "properties": { - "physical_checksums": { - "minItems": 1 - } - }, - "required": [ - "physical_checksums" - ] - } - } - } - }, - { - "if": { - "properties": { - "method": { - "const": "dataset_share" - } - }, - "required": [ - "method" - ] - }, - "then": { - "properties": { - "resource": { - "properties": { - "kind": { - "const": "dataset" - } - } - }, - "verification": { - "properties": { - "verification_path": { - "const": "representative_consumer" - } - } - } - } - } - }, - { - "if": { - "properties": { - "method": { - "const": "warehouse_materialization" - } - }, - "required": [ - "method" - ] - }, - "then": { - "properties": { - "resource": { - "properties": { - "kind": { - "const": "warehouse_relation" - } - } - }, - "verification": { - "properties": { - "verification_path": { - "const": "destination" - } - } - } - } - } - }, - { - "if": { - "properties": { - "feed_purpose": { - "const": "billing" - }, - "status": { - "enum": [ - "available", - "delivered" - ] - } - }, - "required": [ - "feed_purpose", - "status" - ] - }, - "then": { - "properties": { - "verification": { - "properties": { - "verification_profile": { - "const": "canonical_digest" - } - }, - "required": [ - "canonical_content_digest", - "verification_profile" - ] - } - } - } - } - ], - "x-adcp-validation": { - "revision_match": "reporting_revision_id names destination-independent content. verification.row_count and control_totals MUST equal that revision; canonical_content_digest MUST also equal it when present.", - "obligation_match": "reporting_obligation_id, delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method MUST match one caller/account-bound obligation. This join is what permits one revision to fan out to many destinations and principals.", - "authorization": "The caller MUST be authorized for the referenced account and destination binding. Cross-caller and cross-account identifiers MUST be rejected without revealing whether they exist." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json b/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json deleted file mode 100644 index cccc7ee81..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-obligation.json +++ /dev/null @@ -1,354 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Obligation", - "x-status": "experimental", - "description": "Period-level status joining what reporting was expected to any produced immutable revisions and delivery materializations. An obligation exists before its first revision or webhook, making missing-first-report detection possible. All nested revisions and materializations MUST match this obligation's authenticated caller/account, configuration generation, report definition, feed, period, and scope.", - "type": "object", - "properties": { - "reporting_obligation_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_obligation" - }, - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config" - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1 - }, - "report_definition_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_definition" - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "reporting_profile": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "account_id": { - "type": "string", - "minLength": 1, - "x-entity": "account" - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "uniqueItems": true, - "description": "Exact frozen media-buy denominator resolved for this period, including buys with zero rows. An empty array is the definitive zero-buy set; omission is never used to mean all, empty, or unknown." - }, - "scope_resolved_at": { - "type": "string", - "format": "date-time", - "description": "Instant at which the configured scope was resolved and frozen for this obligation. For all_media_buys, include every caller-authorized account media buy whose effective flight overlaps the half-open period and was known by this cutoff. Later-created or backdated buys do not rewrite this obligation." - }, - "period": { - "type": "object", - "properties": { - "start": { - "type": "string", - "format": "date-time" - }, - "end": { - "type": "string", - "format": "date-time" - }, - "source_timezone": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "start", - "end", - "source_timezone" - ], - "additionalProperties": false - }, - "expected_at": { - "type": "string", - "format": "date-time" - }, - "schedule": { - "$ref": "reporting-schedule.json", - "description": "Resolved immutable schedule generation that created this obligation." - }, - "destination_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "x-entity": "reporting_destination", - "description": "Immutable caller-owned destination generation selected by this account-authorized obligation. The account/configuration join\u2014not possession of this reusable reference\u2014authorizes disclosure." - }, - "required_finality": { - "$ref": "../enums/reporting-finality.json" - }, - "reconciliation_mode": { - "$ref": "reporting-reconciliation-mode.json" - }, - "reconciliation_status": { - "type": "string", - "enum": [ - "not_required", - "pending", - "accepted", - "rejected" - ], - "description": "Consumer agreement state for the current required revision. A later superseding revision returns a receipt-required obligation to pending until that revision is accepted." - }, - "health": { - "$ref": "../enums/reporting-health.json" - }, - "production_status": { - "type": "string", - "enum": [ - "not_due", - "pending", - "published", - "failed" - ], - "description": "Whether any revision has been produced for this obligation. published includes zero-row revisions." - }, - "revision_count": { - "type": "integer", - "minimum": 0, - "description": "Number of revision records for this obligation in the consistent ledger snapshot." - }, - "materialization_count": { - "type": "integer", - "minimum": 0, - "description": "Number of materialization records for this obligation's revisions in the consistent ledger snapshot." - }, - "successful_materialization_count": { - "type": "integer", - "minimum": 0, - "description": "Number of available/delivered verified materializations in the consistent ledger snapshot." - }, - "receipt_count": { - "type": "integer", - "minimum": 0, - "description": "Complete number of authenticated receipts associated with this obligation in the ledger snapshot." - }, - "accepted_receipt_count": { - "type": "integer", - "minimum": 0, - "description": "Number of accepted receipts. At most one current accepted receipt per consumer and revision contributes to reconciliation_status." - }, - "issues": { - "type": "array", - "items": { - "$ref": "reporting-status-issue.json" - } - }, - "resource_retained_until": { - "type": "string", - "format": "date-time", - "description": "Minimum time through which at least one verified materialization for a completed obligation remains readable." - } - }, - "required": [ - "reporting_obligation_id", - "delivery_config_id", - "delivery_config_version", - "report_definition_id", - "feed_purpose", - "reporting_profile", - "account_id", - "media_buy_ids", - "scope_resolved_at", - "period", - "expected_at", - "schedule", - "destination_ref", - "required_finality", - "reconciliation_mode", - "reconciliation_status", - "health", - "production_status", - "revision_count", - "materialization_count", - "successful_materialization_count", - "receipt_count", - "accepted_receipt_count", - "issues" - ], - "allOf": [ - { - "if": { - "properties": { - "health": { - "enum": [ - "healthy", - "complete" - ] - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "production_status": { - "const": "published" - }, - "revision_count": { - "minimum": 1 - }, - "materialization_count": { - "minimum": 1 - }, - "successful_materialization_count": { - "minimum": 1 - }, - "issues": { - "maxItems": 0 - } - }, - "required": [ - "resource_retained_until" - ] - } - }, - { - "if": { - "properties": { - "production_status": { - "const": "published" - } - }, - "required": [ - "production_status" - ] - }, - "then": { - "properties": { - "revision_count": { - "minimum": 1 - } - } - } - }, - { - "if": { - "properties": { - "reconciliation_mode": { - "const": "delivery_only" - } - }, - "required": [ - "reconciliation_mode" - ] - }, - "then": { - "properties": { - "reconciliation_status": { - "const": "not_required" - } - } - } - }, - { - "if": { - "properties": { - "reconciliation_mode": { - "const": "consumer_receipt" - }, - "health": { - "enum": [ - "healthy", - "complete" - ] - } - }, - "required": [ - "reconciliation_mode", - "health" - ] - }, - "then": { - "properties": { - "reconciliation_status": { - "const": "accepted" - }, - "receipt_count": { - "minimum": 1 - }, - "accepted_receipt_count": { - "minimum": 1 - } - } - } - }, - { - "if": { - "properties": { - "health": { - "enum": [ - "delayed", - "action_required" - ] - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "issues": { - "minItems": 1 - } - } - } - }, - { - "if": { - "properties": { - "production_status": { - "const": "failed" - } - }, - "required": [ - "production_status" - ] - }, - "then": { - "properties": { - "issues": { - "minItems": 1 - } - } - } - } - ], - "x-adcp-validation": { - "scope_resolution": "scope_resolved_at MUST equal period.end. all_media_buys membership is frozen from the caller-authorized AdCP media buys known at that instant whose effective flights overlap [period.start, period.end); explicit configured media_buy_ids are echoed even when they produce zero rows. Provider object deletion does not remove a buy. Later-created or backdated buys do not alter the obligation.", - "nested_identity": "Every materialization associated with this obligation MUST equal its delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method; its destination-independent revision MUST equal account_id, report_definition_id, reporting_profile, period, and applicable media_buy_ids.", - "complete_finality": "complete requires a published revision at required_finality and at least one verified readable materialization for that revision through resource_retained_until. consumer_receipt additionally requires an accepted matching receipt for the current revision. A snapshot-required pacing obligation may therefore become complete from a snapshot revision.", - "revision_chain": "Supersession MUST be acyclic, remain within this logical slice, and every supersedes_reporting_revision_id MUST name the immediately prior retained revision.", - "record_counts": "revision_count is the number of distinct revisions referenced by this obligation's materializations. revision_count, materialization_count, successful_materialization_count, receipt_count, and accepted_receipt_count MUST equal the complete associated record totals in ledger_snapshot_id, even when records appear on different pages." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json b/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json deleted file mode 100644 index 92fe86091..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-receipt.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Receipt", - "x-status": "experimental", - "description": "Authenticated consumer evidence for one materialization. A receipt closes the knowledge gap between producer availability and consumer reconciliation. Buyer and governance consumers submit independently; neither consumer's receipt implies acceptance by another principal.", - "type": "object", - "properties": { - "reporting_receipt_id": { - "type": "string", - "minLength": 16, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{16,255}$", - "x-entity": "reporting_receipt" - }, - "reporting_obligation_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_obligation" - }, - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision" - }, - "reporting_materialization_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_materialization" - }, - "status": { - "type": "string", - "enum": [ - "accepted", - "rejected" - ] - }, - "verification_profile": { - "$ref": "reporting-verification-profile.json" - }, - "observed_row_count": { - "type": "integer", - "minimum": 0 - }, - "observed_control_totals": { - "type": "array", - "items": { - "$ref": "reporting-control-total.json" - }, - "uniqueItems": true - }, - "observed_canonical_content_digest": { - "$ref": "reporting-canonical-content-digest.json" - }, - "observed_manifest_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - }, - "observed_native_version_ref": { - "type": "string", - "minLength": 1, - "maxLength": 512, - "description": "Immutable provider-native version observed by the consumer for native_commit verification." - }, - "consumer_commit_ref": { - "type": "string", - "minLength": 1, - "maxLength": 512, - "description": "Optional non-secret consumer checkpoint, transaction, or load identifier. It is evidence for operations, not authorization or a credential." - }, - "rejection_codes": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Z][A-Z0-9_]*$" - }, - "minItems": 1, - "uniqueItems": true - }, - "observed_at": { - "type": "string", - "format": "date-time" - }, - "received_at": { - "type": "string", - "format": "date-time", - "readOnly": true - } - }, - "required": [ - "reporting_receipt_id", - "reporting_obligation_id", - "reporting_revision_id", - "reporting_materialization_id", - "status", - "verification_profile", - "observed_row_count", - "observed_control_totals", - "observed_at" - ], - "allOf": [ - { - "if": { - "properties": { - "status": { - "const": "rejected" - } - }, - "required": [ - "status" - ] - }, - "then": { - "required": [ - "rejection_codes" - ] - } - }, - { - "if": { - "properties": { - "verification_profile": { - "const": "canonical_digest" - }, - "status": { - "const": "accepted" - } - }, - "required": [ - "verification_profile", - "status" - ] - }, - "then": { - "required": [ - "observed_canonical_content_digest" - ] - } - }, - { - "if": { - "properties": { - "verification_profile": { - "const": "manifest_checksums" - }, - "status": { - "const": "accepted" - } - }, - "required": [ - "verification_profile", - "status" - ] - }, - "then": { - "required": [ - "observed_manifest_sha256" - ] - } - }, - { - "if": { - "properties": { - "verification_profile": { - "const": "native_commit" - }, - "status": { - "const": "accepted" - } - }, - "required": [ - "verification_profile", - "status" - ] - }, - "then": { - "required": [ - "observed_native_version_ref" - ] - } - } - ], - "x-adcp-validation": { - "authorization": "The seller derives the consumer principal from authenticated transport and accepts receipts only for that principal's account-bound obligation and materialization. Unknown, unauthorized, cross-account, and cross-caller identifiers are indistinguishable.", - "acceptance_match": "accepted requires exact equality with the selected materialization verification evidence: row count and control totals always; canonical digest or manifest digest when selected. A mismatch MUST be submitted or recorded as rejected.", - "immutability": "A reporting_receipt_id is immutable. Exact retries are idempotent; reuse with different content is a conflict." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json b/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json deleted file mode 100644 index 4c23b3e07..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-report-definition.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Report Definition", - "x-status": "experimental", - "description": "Immutable, inspectable semantic contract for how a reporting feed is produced and finalized. Its exact bytes are pinned by report_definition_sha256.", - "type": "object", - "properties": { - "contract_version": { - "type": "string", - "const": "1.0" - }, - "media_type": { - "type": "string", - "const": "application/vnd.adcp.reporting-definition+json" - }, - "report_definition_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$" - }, - "reporting_profile": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "grain": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "source": { - "type": "object", - "properties": { - "provider": { - "type": "object", - "properties": { - "domain": { - "type": "string", - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" - } - }, - "required": [ - "domain" - ], - "additionalProperties": false - }, - "system": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "api_version": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "query_semantics": { - "type": "object", - "description": "Canonical JSON object containing every source option that can change the numbers, including attribution settings, action-report-time, filters, and mapping version." - } - }, - "required": [ - "provider", - "system", - "api_version", - "query_semantics" - ], - "additionalProperties": false - }, - "calendar": { - "type": "object", - "properties": { - "timezone_basis": { - "type": "string", - "enum": [ - "utc", - "account_timezone", - "configured_timezone" - ] - }, - "timezone": { - "type": "string", - "minLength": 1, - "maxLength": 255 - } - }, - "required": [ - "timezone_basis" - ], - "allOf": [ - { - "if": { - "properties": { - "timezone_basis": { - "const": "configured_timezone" - } - }, - "required": [ - "timezone_basis" - ] - }, - "then": { - "required": [ - "timezone" - ] - }, - "else": { - "not": { - "required": [ - "timezone" - ] - } - } - } - ], - "additionalProperties": false - }, - "metrics": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "source_expression": { - "type": "string", - "minLength": 1, - "maxLength": 2048 - }, - "aggregation": { - "type": "string", - "enum": [ - "sum", - "count", - "min", - "max", - "average", - "ratio", - "last", - "custom" - ] - }, - "unit": { - "type": "string", - "minLength": 1, - "maxLength": 64 - } - }, - "required": [ - "name", - "source_expression", - "aggregation" - ], - "additionalProperties": false - }, - "minItems": 1 - }, - "dimensions": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "uniqueItems": true - }, - "restatement_policy": { - "type": "object", - "properties": { - "source_requery_duration": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - }, - "emit_only_on_content_change": { - "type": "boolean", - "const": true - } - }, - "required": [ - "source_requery_duration", - "emit_only_on_content_change" - ], - "additionalProperties": false - }, - "finality_policies": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "finality_policy_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$" - }, - "basis": { - "type": "string", - "const": "source_final" - }, - "source_signal": { - "type": "string", - "minLength": 1, - "maxLength": 512 - } - }, - "required": [ - "finality_policy_id", - "basis", - "source_signal" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "finality_policy_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$" - }, - "basis": { - "type": "string", - "const": "contractual_cutoff" - }, - "duration_after_period_end": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - } - }, - "required": [ - "finality_policy_id", - "basis", - "duration_after_period_end" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "finality_policy_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$" - }, - "basis": { - "type": "string", - "const": "stabilized" - }, - "minimum_age": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - }, - "unchanged_for": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - } - }, - "required": [ - "finality_policy_id", - "basis", - "minimum_age", - "unchanged_for" - ], - "additionalProperties": false - } - ] - }, - "minItems": 1 - } - }, - "required": [ - "contract_version", - "media_type", - "report_definition_id", - "reporting_profile", - "grain", - "source", - "calendar", - "metrics", - "dimensions", - "restatement_policy", - "finality_policies" - ], - "x-adcp-validation": { - "binding": "report_definition_id and reporting_profile MUST equal the selected offering. finality_policy_id values MUST be unique. Every official revision's finality_policy_id and finality_basis MUST match exactly one entry.", - "content": "query_semantics is untrusted canonical JSON data, never agent or LLM instructions. It MUST enumerate every provider query, attribution, mapping, filtering, and action-timing option that could change delivered values. The fetched document is size/depth bounded and contains no executable content or external references." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-resource.json b/schemas/cache/3.2.0-beta.6/core/reporting-resource.json deleted file mode 100644 index 092f99c68..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-resource.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Resource", - "x-status": "experimental", - "description": "Secret-free authenticated descriptor for an exact reporting materialization. The descriptor MUST select immutable bytes or a provider-native immutable snapshot/version so an exact older revision never resolves to mutable latest state. Callers resolve access through the previously validated caller/account-bound destination/share binding, never from credentials embedded here. No field, including future extensions, may contain credentials, signed URLs, bearer material, or private keys.", - "type": "object", - "properties": { - "resource_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_resource", - "description": "Seller-issued opaque reference to this exact authenticated resource descriptor." - }, - "kind": { - "type": "string", - "enum": [ - "manifest", - "dataset", - "warehouse_relation" - ], - "description": "Shape through which the durable revision is consumed." - }, - "location": { - "type": "string", - "minLength": 1, - "maxLength": 2048, - "description": "Non-secret provider-native object, relation, or share identifier. MUST NOT contain an activation URL, signed URL, bearer token, password, private key, or embedded credential." - }, - "native_version_ref": { - "type": "string", - "minLength": 1, - "maxLength": 512, - "description": "Optional immutable provider-native table version, transaction, snapshot, manifest generation, job, or run reference. It supplements but never replaces reporting_revision_id." - }, - "manifest_version": { - "type": "string", - "const": "1.0", - "description": "Version of reporting-file-manifest.json used by a manifest resource." - }, - "manifest_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "SHA-256 over the exact manifest bytes. Consumers verify this before parsing the manifest." - }, - "immutability": { - "type": "string", - "enum": [ - "immutable_location", - "native_version" - ], - "description": "How this descriptor selects the exact immutable materialization." - }, - "expires_at": { - "type": "string", - "format": "date-time", - "description": "Mandatory finite lower-bound endpoint through which this exact resource remains resolvable; it cannot be earlier than the advertised retention contract." - }, - "reader_compatibility": { - "type": "array", - "description": "Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "uniqueItems": true - } - }, - "required": [ - "resource_ref", - "kind", - "location", - "immutability", - "expires_at" - ], - "allOf": [ - { - "if": { - "properties": { - "kind": { - "const": "manifest" - } - }, - "required": [ - "kind" - ] - }, - "then": { - "required": [ - "manifest_version", - "manifest_sha256" - ] - } - }, - { - "if": { - "properties": { - "immutability": { - "const": "native_version" - } - }, - "required": [ - "immutability" - ] - }, - "then": { - "required": [ - "native_version_ref" - ] - } - } - ], - "x-adcp-validation": { - "retention": "expires_at MUST be no earlier than the owning obligation.resource_retained_until and publication plus advertised resource_retention_days. A completed obligation cannot rely on deterministic rematerialization in place of a readable exact resource." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-revision.json b/schemas/cache/3.2.0-beta.6/core/reporting-revision.json deleted file mode 100644 index 5e5e0595c..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-revision.json +++ /dev/null @@ -1,277 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Revision", - "x-status": "experimental", - "description": "One immutable emitted version of logical reporting content. The revision is destination-independent: one canonical revision may fan out through many caller/account-bound obligations and materializations, including file, warehouse, and dataset-share destinations. The report_definition_id plus period and scope identify the logical slice; restatements create a new revision and preserve the superseded revision for the advertised retention window.", - "type": "object", - "properties": { - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision", - "description": "Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions." - }, - "report_definition_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_definition", - "description": "Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics." - }, - "report_definition_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)" - }, - "report_definition_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - }, - "reporting_profile": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, - "schema_version": { - "type": "string", - "minLength": 1, - "maxLength": 64 - }, - "schema_uri": { - "type": "string", - "format": "uri", - "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", - "description": "Machine-readable schema on the authenticated seller/provider or AdCP-registry origin." - }, - "schema_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "Digest of the exact schema bytes used to validate this immutable revision." - }, - "schema_dialect": { - "type": "string", - "const": "https://json-schema.org/draft/2020-12/schema", - "description": "Closed SDK-bundled dialect; the metaschema is never network-fetched." - }, - "schema_ref_policy": { - "type": "string", - "const": "local_fragment_only", - "description": "The fetched schema is self-contained and every $ref is a local # fragment." - }, - "account_id": { - "type": "string", - "minLength": 1, - "x-entity": "account" - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "uniqueItems": true, - "description": "Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator." - }, - "period": { - "type": "object", - "description": "Half-open reporting interval with its source calendar boundary.", - "properties": { - "start": { - "type": "string", - "format": "date-time" - }, - "end": { - "type": "string", - "format": "date-time" - }, - "source_timezone": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "start", - "end", - "source_timezone" - ], - "additionalProperties": false - }, - "finality": { - "$ref": "../enums/reporting-finality.json" - }, - "finality_basis": { - "type": "string", - "enum": [ - "source_final", - "contractual_cutoff", - "stabilized" - ], - "description": "Why an official revision is considered final: an authoritative source signal, a versioned contractual cutoff, or a versioned stabilization rule." - }, - "finality_policy_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "description": "Immutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id." - }, - "finalized_at": { - "type": "string", - "format": "date-time", - "description": "When the producer applied the declared finality basis to this official revision." - }, - "observed_at": { - "type": "string", - "format": "date-time", - "description": "When the seller obtained or committed this source observation." - }, - "data_through": { - "type": [ - "string", - "null" - ], - "format": "date-time", - "description": "Latest event time conservatively included, or null when precision is unknown." - }, - "data_through_precision": { - "type": "string", - "enum": [ - "exact", - "lower_bound", - "unknown" - ] - }, - "supersedes_reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision", - "description": "Immediately superseded revision of the same logical slice. Both snapshot and official revisions may be superseded." - }, - "row_count": { - "type": "integer", - "minimum": 0, - "description": "Logical row count, including zero for a successfully evaluated empty report." - }, - "control_totals": { - "type": "array", - "items": { - "$ref": "reporting-control-total.json" - }, - "uniqueItems": true, - "description": "Profile-defined totals computed from the canonical logical revision. Names MUST be unique." - }, - "canonical_content_digest": { - "$ref": "reporting-canonical-content-digest.json" - }, - "created_at": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "reporting_revision_id", - "report_definition_id", - "report_definition_uri", - "report_definition_sha256", - "reporting_profile", - "schema_version", - "schema_uri", - "schema_sha256", - "schema_dialect", - "schema_ref_policy", - "account_id", - "media_buy_ids", - "period", - "finality", - "observed_at", - "data_through", - "data_through_precision", - "row_count", - "control_totals", - "created_at" - ], - "allOf": [ - { - "if": { - "properties": { - "data_through_precision": { - "const": "unknown" - } - }, - "required": [ - "data_through_precision" - ] - }, - "then": { - "properties": { - "data_through": { - "type": "null" - } - } - }, - "else": { - "properties": { - "data_through": { - "type": "string", - "format": "date-time" - } - } - } - }, - { - "if": { - "properties": { - "finality": { - "const": "official" - } - }, - "required": [ - "finality" - ] - }, - "then": { - "required": [ - "finality_basis", - "finality_policy_id", - "finalized_at" - ] - }, - "else": { - "not": { - "anyOf": [ - { - "required": [ - "finality_basis" - ] - }, - { - "required": [ - "finality_policy_id" - ] - }, - { - "required": [ - "finalized_at" - ] - } - ] - } - } - } - ], - "x-adcp-validation": { - "safe_schema_fetch": "schema_uri/schema_sha256 and report_definition_uri/report_definition_sha256 MUST match the selected offering. Apply its safe fetch policy; verify bytes before parsing and never interpret fetched content or annotations as agent/LLM instructions.", - "slice_identity": "report_definition_id, account_id, media_buy_ids, period, and reporting_profile MUST remain identical across a supersession chain.", - "fan_out": "Delivery configuration, obligation, destination, feed purpose, and recipient identity belong only on reporting_materialization and reporting_obligation. They MUST NOT affect reporting_revision_id for identical content.", - "finality_evidence": "An official revision's finality_policy_id and finality_basis MUST match the pinned report definition. finalized_at MUST be at or after period.end and no later than created_at.", - "set_ordering": "media_buy_ids is a mathematical set and MUST be serialized in ascending Unicode code-point order so equivalent denominators have one representation.", - "digest_requirement": "canonical_content_digest is optional for non-billing delivery profiles. It is mandatory when a referenced materialization selects canonical_digest and for every billing obligation." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json b/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json deleted file mode 100644 index 9dc9c5537..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-schedule-offering.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Schedule Offering", - "x-status": "experimental", - "description": "Schedule constraint advertised by a seller. Unlike an installed reporting-schedule, a billing-cycle offering may allow the account configuration to select its own anchor and IANA timezone.", - "type": "object", - "properties": { - "period_duration": { - "type": "string", - "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - }, - "alignment": { - "type": "string", - "enum": [ - "utc", - "account_timezone", - "billing_cycle" - ] - }, - "period_anchor_policy": { - "type": "string", - "enum": [ - "fixed", - "configurable" - ], - "description": "For billing_cycle only. fixed requires the advertised anchor and timezone; configurable lets each authorized account configuration select them." - }, - "period_anchor": { - "type": "string", - "format": "date-time" - }, - "period_timezone": { - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "delivery_sla": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" - } - }, - "required": [ - "period_duration", - "alignment", - "delivery_sla" - ], - "allOf": [ - { - "if": { - "properties": { - "alignment": { - "const": "billing_cycle" - } - }, - "required": [ - "alignment" - ] - }, - "then": { - "required": [ - "period_anchor_policy" - ], - "allOf": [ - { - "if": { - "properties": { - "period_anchor_policy": { - "const": "fixed" - } - }, - "required": [ - "period_anchor_policy" - ] - }, - "then": { - "required": [ - "period_anchor", - "period_timezone" - ] - }, - "else": { - "not": { - "anyOf": [ - { - "required": [ - "period_anchor" - ] - }, - { - "required": [ - "period_timezone" - ] - } - ] - } - } - } - ] - }, - "else": { - "not": { - "anyOf": [ - { - "required": [ - "period_anchor_policy" - ] - }, - { - "required": [ - "period_anchor" - ] - }, - { - "required": [ - "period_timezone" - ] - } - ] - } - } - } - ], - "x-adcp-validation": { - "installed_schedule_match": "period_duration, alignment, and delivery_sla MUST equal the installed configuration. For fixed billing_cycle offerings, period_anchor and period_timezone MUST also equal it. For configurable billing_cycle offerings, the installed configuration supplies both values. utc and account_timezone use the normative origins in reporting-schedule.json, so even multi-unit durations have one independently derivable phase." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json b/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json deleted file mode 100644 index 666bc260d..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-schedule.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Schedule", - "x-status": "experimental", - "description": "The period and deadline contract from which reporting obligations are created. Every elapsed period produces an obligation even when it has zero rows or production fails, so a consumer can distinguish empty from missing.", - "type": "object", - "properties": { - "period_duration": { - "type": "string", - "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", - "description": "Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M." - }, - "alignment": { - "type": "string", - "enum": [ - "utc", - "account_timezone", - "billing_cycle" - ], - "description": "Calendar used to establish exact period boundaries. The obligation echoes resolved timestamps and source timezone." - }, - "period_anchor": { - "type": "string", - "format": "date-time", - "description": "Required for billing_cycle alignment. This immutable instant anchors the recurring half-open billing periods so producer and consumer derive the same month, quarter, or other contractual cycle." - }, - "period_timezone": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "description": "Required IANA timezone for billing_cycle calendar arithmetic. A numeric UTC offset is not sufficient because it does not define DST transitions." - }, - "delivery_sla": { - "type": "string", - "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", - "description": "Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration." - } - }, - "required": [ - "period_duration", - "alignment", - "delivery_sla" - ], - "allOf": [ - { - "if": { - "properties": { - "alignment": { - "const": "billing_cycle" - } - }, - "required": [ - "alignment" - ] - }, - "then": { - "required": [ - "period_anchor", - "period_timezone" - ] - }, - "else": { - "not": { - "anyOf": [ - { - "required": [ - "period_anchor" - ] - }, - { - "required": [ - "period_timezone" - ] - } - ] - } - } - } - ], - "x-adcp-validation": { - "period_generation": "Producer and consumer MUST derive the same ordered half-open intervals from period_duration, alignment, period_anchor, and period_timezone when applicable. utc alignment uses 1970-01-01T00:00:00Z as interval zero. account_timezone uses 1970-01-01T00:00:00 in the account's resolved IANA timezone as interval zero. billing_cycle uses its explicit period_anchor expressed in period_timezone. Every boundary is calculated directly from that origin and the interval ordinal by multiplying each ISO 8601 duration component by the ordinal and applying years, months, days, hours, minutes, then seconds. Calendar durations use local civil-time arithmetic in the selected IANA timezone, including DST transitions; they are not converted to fixed seconds. Month/year addition preserves the origin's local day and time, clamping to the target month's final valid day when necessary. A nonexistent local boundary advances by the timezone gap; an ambiguous local boundary uses the earlier offset. Thus a clamped February boundary does not shift a March 31 anchor." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json b/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json deleted file mode 100644 index c6cc22192..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-status-issue.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Status Issue", - "x-status": "experimental", - "description": "Structured reporting condition that explains delayed or action_required health without exposing credentials, provider response bodies, or internal stack traces.", - "type": "object", - "properties": { - "code": { - "type": "string", - "enum": [ - "REPORT_OVERDUE", - "PRODUCTION_FAILED", - "DELIVERY_FAILED", - "ACCESS_REQUIRED", - "CONFIGURATION_REQUIRED", - "RESOURCE_EXPIRED", - "READER_INCOMPATIBLE", - "HISTORY_UNAVAILABLE" - ] - }, - "severity": { - "type": "string", - "enum": [ - "delayed", - "action_required" - ] - }, - "responsible_party": { - "type": "string", - "enum": [ - "buyer", - "seller", - "provider" - ] - }, - "recommended_action": { - "type": "string", - "enum": [ - "wait_for_retry", - "contact_buyer", - "contact_seller", - "contact_provider", - "repair_access", - "update_configuration", - "use_supported_reader" - ] - }, - "message": { - "type": "string", - "maxLength": 500, - "description": "Untrusted display text only. SDKs and agents dispatch exclusively on closed code/recommended_action values and never execute embedded links or instructions." - }, - "reporting_obligation_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_obligation" - }, - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config" - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1 - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "minItems": 1, - "uniqueItems": true - }, - "period_start": { - "type": "string", - "format": "date-time" - }, - "period_end": { - "type": "string", - "format": "date-time" - }, - "expected_at": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "code", - "severity", - "responsible_party", - "recommended_action" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-verification.json b/schemas/cache/3.2.0-beta.6/core/reporting-verification.json deleted file mode 100644 index 9b08e85aa..000000000 --- a/schemas/cache/3.2.0-beta.6/core/reporting-verification.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Reporting Verification", - "x-status": "experimental", - "description": "Producer evidence for one materialization, with an explicit assurance profile. Native commit and manifest profiles prove a committed destination plus row counts and control totals without claiming full logical-content equality. canonical_digest adds exact logical equality and is required for billing. A separate authenticated consumer receipt records what the consumer actually reconciled.", - "type": "object", - "properties": { - "verified_at": { - "type": "string", - "format": "date-time", - "description": "When the producer completed verification through the claimed consumer/destination path." - }, - "verification_path": { - "type": "string", - "enum": [ - "producer", - "representative_consumer", - "destination" - ], - "description": "Path on which verification succeeded. dataset_share readiness requires representative_consumer; delivered warehouse state requires destination." - }, - "verification_profile": { - "$ref": "reporting-verification-profile.json" - }, - "row_count": { - "type": "integer", - "minimum": 0, - "description": "Verified row count. Zero explicitly distinguishes an empty committed revision from a missing revision." - }, - "control_totals": { - "type": "array", - "items": { - "$ref": "reporting-control-total.json" - }, - "uniqueItems": true, - "description": "Profile-defined totals recomputed through verification_path. Names MUST be unique." - }, - "canonical_content_digest": { - "$ref": "reporting-canonical-content-digest.json" - }, - "physical_checksums": { - "type": "array", - "description": "Method-specific byte/object checksums. Different encodings of the same logical revision normally have different values.", - "items": { - "type": "object", - "properties": { - "object_ref": { - "type": "string", - "minLength": 1, - "maxLength": 1024 - }, - "algorithm": { - "type": "string", - "enum": [ - "sha256", - "sha512" - ] - }, - "value": { - "type": "string", - "pattern": "^(?:[A-Fa-f0-9]{64}|[A-Fa-f0-9]{128})$" - } - }, - "required": [ - "object_ref", - "algorithm", - "value" - ], - "additionalProperties": false - }, - "minItems": 1 - }, - "native_commit_evidence": { - "type": "object", - "description": "Provider-native immutable version evidence observed through the named consumer or destination path.", - "properties": { - "native_version_ref": { - "type": "string", - "minLength": 1, - "maxLength": 512 - }, - "observed_through": { - "type": "string", - "enum": [ - "representative_consumer", - "destination" - ] - } - }, - "required": [ - "native_version_ref", - "observed_through" - ], - "additionalProperties": false - } - }, - "required": [ - "verified_at", - "verification_path", - "verification_profile", - "row_count", - "control_totals" - ], - "allOf": [ - { - "if": { - "properties": { - "verification_profile": { - "const": "native_commit" - } - }, - "required": [ - "verification_profile" - ] - }, - "then": { - "required": [ - "native_commit_evidence" - ] - } - }, - { - "if": { - "properties": { - "verification_profile": { - "const": "manifest_checksums" - } - }, - "required": [ - "verification_profile" - ] - }, - "then": { - "required": [ - "physical_checksums" - ] - } - }, - { - "if": { - "properties": { - "verification_profile": { - "const": "canonical_digest" - } - }, - "required": [ - "verification_profile" - ] - }, - "then": { - "required": [ - "canonical_content_digest" - ] - } - } - ], - "x-adcp-validation": { - "revision_match": "row_count and control_totals MUST equal the referenced revision. canonical_digest additionally requires a digest equal to the revision digest.", - "assurance_boundary": "native_commit and manifest_checksums prove committed delivery evidence but MUST NOT be described as cryptographic logical-content equality. That claim requires canonical_digest.", - "native_version_match": "When native_commit_evidence is present, native_version_ref MUST equal resource.native_version_ref and observed_through MUST match the consumer/destination verification path.", - "checksum_binding": "Every physical_checksums.object_ref MUST be an object selected by this exact immutable resource/manifest; algorithm and value length MUST agree." - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/core/x-entity-types.json b/schemas/cache/3.2.0-beta.6/core/x-entity-types.json index 25ef6fb9e..aba7d29cc 100644 --- a/schemas/cache/3.2.0-beta.6/core/x-entity-types.json +++ b/schemas/cache/3.2.0-beta.6/core/x-entity-types.json @@ -19,16 +19,11 @@ "product_pricing_option", "vendor_pricing_option", "creative", - "creative_revision", - "creative_representation", - "macro_declaration", - "tracker_execution_selector", "creative_locale_variant", "creative_format", "transformer", "evaluator", "build_variant", - "served_variant", "audience", "audience_evidence", "audience_evidence_snapshot", @@ -61,15 +56,6 @@ "si_session", "offering", "vendor_metric", - "reporting_destination", - "reporting_offering", - "reporting_delivery_config", - "reporting_definition", - "reporting_obligation", - "reporting_revision", - "reporting_materialization", - "reporting_receipt", - "reporting_resource", "identity_relying_party" ], "x-entity-definitions": { @@ -88,16 +74,11 @@ "product_pricing_option": "A pricing tier on a seller's inventory product (CPM / CPC / CPCV / etc). `pricing_option_id` inside `core/package.json` and `media-buy/package-request.json`. Scoped to the seller's product rate card \u2014 not interchangeable with `vendor_pricing_option`.", "vendor_pricing_option": "A pricing tier offered by a vendor agent (rights agent, signals agent, creative agent, governance agent) for its own services. `pricing_option_id` via `core/vendor-pricing-option.json`, also surfaced in `brand/acquire-rights-*`, `signals/activate-signal-request`, `media-buy/build-creative-response`, and `creative/get-creative-features-response`. Scoped to the issuing agent; not interchangeable with `product_pricing_option`.", "creative": "A creative asset (library entry, buyer-assigned). `creative_id` across creative/*, brand/creative-approval-*, and media-buy/package-request.", - "creative_revision": "A buyer-assigned immutable input-content state beneath one durable creative. Identity is the tuple `(creative_id, revision_id)`. `revision_id` round-trips through sync_creatives, list_creatives, creative status webhooks, and delivery readback. Seller transcoding, normalization, and alternate delivery representations do not create a new revision.", - "creative_representation": "One equivalent trafficking representation inside a complete creative representation set. `representation_id` is scoped to the parent creative revision and is echoed in selection and rejection results. Selecting, transcoding, or delivering one representation does not mint a new buyer revision or reuse a served variant identity.", - "macro_declaration": "One occurrence-level macro processing declaration within a creative asset. `declaration_id` in core/macro-declaration.json is echoed by core/macro-resolution-result.json so validation and sync results correlate to the exact declared occurrence. Scoped to the enclosing asset and not globally unique.", - "tracker_execution_selector": "One stable first-class tracker commitment inside an effective Product tracker execution contract. `selector_id` is scoped to the materialized contract, is retained unchanged in the immutable PackageFormatSnapshot, and is later used to attribute contract matching and execution evidence. It is not globally unique without the product or package snapshot identity.", "creative_locale_variant": "A buyer-assigned stable locale execution within one localized creative. `locale_variant_id` round-trips from core/creative-localization.json into sync_creatives and list_creatives readback, then attributes localized executions in get_creative_delivery. Scoped to the parent creative and deliberately distinct from build_variant (a build_creative output leaf) and variant_id (a provider execution observed in reporting).", "creative_format": "A format spec identified by the composite of `agent_url` + `id` (see core/format-id.json).", "transformer": "An account-scoped creative build capability offered by a creative agent (the creative analog of a product) \u2014 a voice, model, style, or director with typed config params and per-account pricing. `transformer_id` via `core/transformer.json`, discovered in `creative/list-transformers-response` and selected in `media-buy/build-creative-request`. Scoped to the issuing creative agent.", "evaluator": "An account-scoped house evaluator preset a buyer attaches to `build_creative` to rank best_of_n variants - the rank-side of the get_creative_features feature oracle. `evaluator_id` on `core/evaluator-spec.json`, selected in `media-buy/build-creative-request`. The evaluator_id itself is pre-provisioned/account-arranged; only the feature vocabulary it emits is discovered via get_adcp_capabilities governance.creative_features. Scoped to the issuing creative agent.", "build_variant": "A single produced creative variant leaf from build_creative \u2014 the leaf-level lineage anchor. `build_variant_id` on `media-buy/build-creative-response` BuildCreativeVariantSuccess `creatives[].variants[]`. Distinct from a served `variant_id` (delivery) and a `preview_id` (preview renders), and distinct from the call-level grouping `build_creative_id`. On the canonical promotion path, the kept build_variant_id becomes the durable creative_id; delivery joins then use creative_id.", - "served_variant": "An agent-assigned immutable creative execution observed in delivery reporting. `variant_id` is unique within the issuing agent and round-trips from get_creative_delivery into preview_creative variant replay when that capability is supported. A distinct source revision, locale, or rendered manifest receives a distinct AdCP variant_id even when the underlying ad platform reuses a native identifier. Distinct from build_variant, creative_revision, and creative_locale_variant.", "audience": "A buyer-managed audience (CRM, lookalike seed, suppression). `audience_id` in media-buy/sync-audiences-request.", "audience_evidence": "A provider-scoped logical series of population-level audience evidence. `evidence_id` in core/audience-evidence.json and core/audience-evidence-selection.json remains stable while immutable snapshots receive distinct snapshot ids and content digests.", "audience_evidence_snapshot": "An immutable seller-scoped audience-evidence snapshot. `snapshot_id` in core/audience-evidence.json and core/audience-evidence-selection.json MUST never be reused for different canonical evidence content.", @@ -130,15 +111,6 @@ "si_session": "A sponsored-intelligence conversation session. `session_id` in sponsored-intelligence/* schemas.", "offering": "A brand-published offering (campaign, promotion, product set, service) promoted via traditional creatives or SI conversations. `offering_id` in core/offering.json, sponsored-intelligence/si-get-offering-*, and sponsored-intelligence/si-initiate-session-request. Also appears as a catalog item-type id when `core/catalog.json::type` is `offering`.", "vendor_metric": "A vendor-defined metric within a measurement vendor's vocabulary. `metric_id` in core/vendor-metric-id.json \u2014 used by reporting-capabilities.vendor_metrics declarations, delivery-metrics.vendor_metric_values emissions, and required_vendor_metrics filters. Identity is the tuple `(vendor.domain, vendor.brand_id, metric_id)` \u2014 the identifier is namespaced by the vendor's BrandRef, not globally unique. Vendor catalog (category, methodology, standard alignment) lives at the vendor's brand.json `agents[type='measurement']`.", - "reporting_destination": "A seller-resolved durable reporting destination, recipient, share, or grant binding. It may be provisioned through sync_accounts or established bilaterally; destination_ref is opaque within one authenticated caller and seller/account relationship and never contains a credential.", - "reporting_offering": "One seller-advertised atomic reporting feed/profile/schema/schedule/finality/method combination, selected by offering_id during durable delivery configuration.", - "reporting_delivery_config": "One caller-owned durable reporting policy on an account. delivery_config_id is unique within (authenticated caller, account) and persists when inactive so historical materializations remain resolvable.", - "reporting_definition": "An immutable normalized reporting query/profile definition. report_definition_id binds metric, grain, attribution, breakdown, action-definition, schema, and calendar/timezone semantics so unlike logical slices cannot collide.", - "reporting_obligation": "One expected report slice and due time. reporting_obligation_id exists before a revision or webhook and is what makes a missing first report observable.", - "reporting_revision": "One immutable emitted version of a reporting obligation's logical content. reporting_revision_id remains stable across materializations; a restatement receives a new id and points to the immediately superseded revision.", - "reporting_materialization": "One attempt to expose an exact reporting revision through one delivery path. A retry receives a new reporting_materialization_id while preserving reporting_revision_id.", - "reporting_receipt": "One authenticated consumer reconciliation outcome for an exact reporting materialization.", - "reporting_resource": "One seller-issued secret-free descriptor for an exact reporting materialization, resolved by resource_ref through get_reporting_status. Native platform versions supplement but do not replace this identity.", "identity_relying_party": "A verified-identity relying party an entity operates for attestation provenance in TMP Identity Match. `relying_party_id` in brand.json identity_relying_parties[] and trusted-match/identity-match-request.json attestation. Namespaced by the issuer (a vendor BrandRef, `core/brand-ref.json`) \u2014 identity is the tuple `(issuer.domain, issuer.brand_id, relying_party_id)`, mirroring vendor_metric's `(vendor.domain, vendor.brand_id, metric_id)`; the same string under a different issuer is a different relying party. The publishing owner (whose brand.json lists it) asserts ownership, and the receiver matches a forwarded attestation's `(issuer, relying_party_id)` against the claimed owner's published list; the issuer's own relying-party registry (e.g. World ID on-chain) is the authoritative root. One entity may operate many relying parties (scope=entity vs scope=property) \u2014 not 1:1 with an entity." } } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/notification-type.json b/schemas/cache/3.2.0-beta.6/enums/notification-type.json index ed471f6b4..9826cc5d6 100644 --- a/schemas/cache/3.2.0-beta.6/enums/notification-type.json +++ b/schemas/cache/3.2.0-beta.6/enums/notification-type.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Notification Type", - "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`, `reporting.delivery_ready`) fire against an account's `notification_configs[]` entries whose `event_types` include the value. reporting.delivery_ready is a compact doorbell repaired through get_reporting_status; indicator and assignment invalidations are repaired through get_media_buys. Agent-anchored notifications (`capabilities.changed`) fire against the agent-level subscriber set managed by `sync_agent_notification_configs`. New notification types MUST declare their anchor, logical notification_id semantics, and repair key in enumDescriptions. Sellers MUST reject account registrations for media-buy/agent types, agent registrations for media-buy/account types, and per-buy registrations for persistent account/agent types.", + "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`) fire against an account's `notification_configs[]` entries whose `event_types` include the value \u2014 these outlive any single media buy and anchor at the account. `indicators.changed` and `creative.assignment_changed` are invalidations repaired completely through `get_media_buys`; `list_creatives` may provide a bounded reverse projection. Agent-anchored notifications (`capabilities.changed`) fire against the agent-level subscriber set managed by `sync_agent_notification_configs`; they are valid before a buyer has any account. Account status changes use `account.status_changed` as an invalidation signal; receivers repair by re-reading `list_accounts`. Wholesale feed notifications carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; product mirrors repair through `list_products` using `if_feed_version` and signal mirrors through `get_signals` using `if_wholesale_feed_version` (`get_products` remains the deprecated 3.x product fallback). Capability-change notifications carry only an invalidation payload in `/schemas/core/capabilities-changed-webhook.json`; receivers repair by re-reading `get_adcp_capabilities`. New notification types added to this enum MUST declare their anchor (media-buy, account, or agent), logical `notification_id` semantics, and repair key in the enumDescription. Sellers MUST reject `notification_configs[]` entries whose `event_types` include any media-buy-anchored or agent-anchored type, MUST reject `sync_agent_notification_configs` entries whose `event_types` include any media-buy-anchored or account-anchored type, and MUST reject `push_notification_config` registrations for persistent account-anchored or agent-anchored types.", "type": "string", "enum": [ "scheduled", @@ -24,8 +24,7 @@ "signal.priced", "signal.removed", "wholesale_feed.bulk_change", - "capabilities.changed", - "reporting.delivery_ready" + "capabilities.changed" ], "enumDescriptions": { "scheduled": "Scheduled delivery report fire. Fired at the cadence the buyer registered on reporting_webhook (e.g., hourly, daily). Carries the window's delivery metrics. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", @@ -48,7 +47,6 @@ "signal.priced": "Sent when signal pricing changes in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.priced` event with the full post-change `pricing_options[]`, optional retired pricing ids, and optional `effective_at`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "signal.removed": "Sent when a signal is no longer available in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.removed` event with the signal id, optional removal reason, and cache scope. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "wholesale_feed.bulk_change": "Sent when one operation changes too many wholesale product-feed or wholesale signals-feed entities for useful per-entity pushes. Payload: `wholesale-feed-webhook.json` carrying a `wholesale_feed.bulk_change` event with one affected entity type, approximate count, and repair recommendation. Receivers repair products through `list_products` (or deprecated 3.x `get_products`) and signals through `get_signals`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", - "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each `sync_agent_notification_configs.notification_configs[]` entry whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id.", - "reporting.delivery_ready": "Experimental account-anchored readiness doorbell. Fires after one immutable reporting materialization is observable through the intended consumer path. Payload: `reporting-delivery-ready-webhook.json`; it carries identities and readiness metadata, never report rows or credentials. Receivers repair missed, duplicate, or out-of-order fires through `get_reporting_status`. **notification_id**: stable per reporting_materialization_id reaching its ready state across re-emissions; a new retry/materialization receives a new id." + "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each `sync_agent_notification_configs.notification_configs[]` entry whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id." } } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/enums/task-type.json b/schemas/cache/3.2.0-beta.6/enums/task-type.json index 6cf3fbf98..7b294045e 100644 --- a/schemas/cache/3.2.0-beta.6/enums/task-type.json +++ b/schemas/cache/3.2.0-beta.6/enums/task-type.json @@ -36,8 +36,7 @@ "get_rights", "acquire_rights", "update_rights", - "sync_agent_notification_configs", - "sync_reporting_receipts" + "sync_agent_notification_configs" ], "enumDescriptions": { "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", @@ -72,8 +71,7 @@ "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials", "update_rights": "Brand domain: Update an existing rights grant, including its term, impression cap, pricing option, or pause state", - "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications", - "sync_reporting_receipts": "Media-buy domain: Submit authenticated consumer reconciliation outcomes for reporting materializations" + "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications" }, "x-task-result-schema-overrides": { "media_buy_delivery": "media-buy/media-buy-delivery-webhook-result.json" diff --git a/schemas/cache/3.2.0-beta.6/index.json b/schemas/cache/3.2.0-beta.6/index.json index 3924644d4..3aa95154b 100644 --- a/schemas/cache/3.2.0-beta.6/index.json +++ b/schemas/cache/3.2.0-beta.6/index.json @@ -3,14 +3,14 @@ "title": "AdCP Schema Registry", "version": "1.0.0", "description": "Registry of all AdCP JSON schemas for validation and discovery", - "adcp_version": "3.2.0-beta.8", + "adcp_version": "3.2.0-beta.6", "versioning": { - "note": "AdCP uses path-based versioning. The schema URL path (/schemas/) indicates the version. Individual request/response schemas do NOT include adcp_version fields. Compatibility follows semantic versioning rules." + "note": "AdCP uses build-time versioning. This directory contains schemas for AdCP 3.2.0-beta.6. Full semantic versions are available at /schemas/{version}/ (e.g., /schemas/2.5.0/). Major version aliases point to the latest stable release in that major line; use /schemas/index.json or /schemas/latest.json for the canonical file-based pointer." }, - "lastUpdated": "2026-06-05", - "baseUrl": "/schemas/latest", - "stability": "development", - "prerelease": false, + "lastUpdated": "2026-08-23", + "baseUrl": "/schemas/3.2.0-beta.6", + "stability": "beta", + "prerelease": true, "deprecated": false, "protocol_layers": [ { @@ -41,997 +41,921 @@ "description": "Core data models used throughout AdCP", "schemas": { "product": { - "$ref": "core/product.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product.json", "description": "Represents available advertising inventory" }, "canonical-product": { - "$ref": "core/canonical-product.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-product.json", "description": "Canonical-only product view for the AdCP 3.2 split product and proposal tools" }, "canonical-format-option": { - "$ref": "core/canonical-format-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-format-option.json", "description": "Compact canonical format declaration without legacy named-format links" }, - "creative-operation-format-declaration": { - "$ref": "core/creative-operation-format-declaration.json", - "description": "Authority-free canonical declaration for creative-agent build, validation, and preview capabilities" - }, "canonical-placement": { - "$ref": "core/canonical-placement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-placement.json", "description": "Compact canonical product placement" }, "canonical-product-action": { - "$ref": "core/canonical-product-action.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-product-action.json", "description": "Fine-grained action template for compact products" }, "canonical-proposal": { - "$ref": "core/canonical-proposal.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-proposal.json", "description": "Compact immutable proposal with a typed commercial envelope" }, "canonical-account-ref": { - "$ref": "core/canonical-account-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-account-ref.json", "description": "Compact account identity without inline brand documents" }, "canonical-budget-allocation": { - "$ref": "core/canonical-budget-allocation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-budget-allocation.json", "description": "Compact budget allocation for canonical MediaBuy tools" }, "canonical-optimization-goal": { - "$ref": "core/canonical-optimization-goal.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-optimization-goal.json", "description": "Compact optimization goal without legacy targets or inline vendor brands" }, "canonical-metric-qualifier": { - "$ref": "core/canonical-metric-qualifier.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-metric-qualifier.json", "description": "Compact reporting metric qualifier" }, "canonical-reporting-commitment": { - "$ref": "core/canonical-reporting-commitment.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-reporting-commitment.json", "description": "Compact standard or vendor reporting commitment" }, "canonical-media-buy-action": { - "$ref": "core/canonical-media-buy-action.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-media-buy-action.json", "description": "Available MediaBuy action routed to its compact-lifecycle task" }, "keyword-target": { - "$ref": "core/keyword-target.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/keyword-target.json", "description": "Compact keyword targeting mutation" }, "compact-task-submitted": { - "$ref": "core/compact-task-submitted.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-submitted.json", "description": "Shared submitted envelope for compact lifecycle tools" }, "compact-task-working": { - "$ref": "core/compact-task-working.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-working.json", "description": "Shared progress payload for compact lifecycle tools" }, "compact-task-input-required": { - "$ref": "core/compact-task-input-required.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/compact-task-input-required.json", "description": "Shared input-required payload for compact lifecycle tools" }, "media-buy": { - "$ref": "core/media-buy.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/media-buy.json", "description": "Represents a purchased advertising campaign" }, "package": { - "$ref": "core/package.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package.json", "description": "A specific product within a media buy (line item)" }, - "package-format-snapshot": { - "$ref": "core/package-format-snapshot.json", - "description": "Immutable package-time selected product format, placement, execution-version, and tracker-contract binding" - }, "committed-metric": { - "$ref": "core/committed-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/committed-metric.json", "description": "One metric in a package's binding reporting contract" }, "creative-asset": { - "$ref": "core/creative-asset.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-asset.json", "description": "Creative asset for upload to library - supports static assets, generative formats, and third-party ad serving (VAST, DAAST, HTML, JavaScript)" }, "locale-tag": { - "$ref": "core/locale-tag.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/locale-tag.json", "description": "BCP 47 language-identity tag using the AdCP canonical wire profile \u2014 required shared primitive for new language-bearing fields" }, "creative-localization": { - "$ref": "core/creative-localization.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-localization.json", "description": "Explicit source and target locale variants requested on a creative" }, "localized-creative-asset": { - "$ref": "core/localized-creative-asset.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/localized-creative-asset.json", "description": "Creative variant asset with contextual language-tag conformance" }, "creative-localization-readback": { - "$ref": "core/creative-localization-readback.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-localization-readback.json", "description": "Exact materialized locale assets, buyer-assigned identities, and matching policy" }, "account": { - "$ref": "core/account.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account.json", "description": "Billing account representing who pays for advertising. Accounts have rate cards, payment terms, and platform mappings." }, "operator-identity": { - "$ref": "core/operator-identity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/operator-identity.json", "description": "Complete buyer-desired operator domain and optional operator-owned unit for an advertiser account" }, "account-identity-change": { - "$ref": "core/account-identity-change.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change.json", "description": "Pending or rejected operator-identity transition on an existing account" }, "account-identity-change-preview": { - "$ref": "core/account-identity-change-preview.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-identity-change-preview.json", "description": "Non-persisted impact and disposition preview for a dry-run account identity transition" }, "account-with-authorization": { - "$ref": "core/account-with-authorization.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-with-authorization.json", "description": "List-accounts response item combining Account with caller-specific authorization metadata" }, "targeting": { - "$ref": "core/targeting.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting.json", "description": "Audience targeting criteria" }, "targeting-overlay-support": { - "$ref": "core/targeting-overlay-support.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-overlay-support.json", "description": "Product-scoped targeting dimensions whose values may be supplied on packages later" }, "targeting-overlay-requirements": { - "$ref": "core/targeting-overlay-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-overlay-requirements.json", "description": "Buyer requirements for product-scoped targeting dimensions that must remain selectable on packages" }, "geo-region-requirement": { - "$ref": "core/geo-region-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-region-requirement.json", "description": "Buyer country/value requirements for ISO subdivision targeting selected later" }, "geo-region-support": { - "$ref": "core/geo-region-support.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-region-support.json", "description": "Country- and value-aware selectable ISO subdivision targeting support" }, "product-targeting-resolution": { - "$ref": "core/product-targeting-resolution.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-targeting-resolution.json", "description": "Discovery-time targeting modifications bound to a configured product" }, "package-targeting-resolution": { - "$ref": "core/package-targeting-resolution.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-targeting-resolution.json", "description": "Execution details for targeting accepted on a booked package" }, "targeting-modification": { - "$ref": "core/targeting-modification.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/targeting-modification.json", "description": "One buyer-reviewable targeting modification on a configured product" }, "placement-selection": { - "$ref": "core/placement-selection.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-selection.json", "description": "Purchased placement inventory selection within a product" }, "demographic-age-range": { - "$ref": "core/demographic-age-range.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-age-range.json", "description": "Canonical inclusive age interval with explicit unknown-age membership" }, "demographic-predicate": { - "$ref": "core/demographic-predicate.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-predicate.json", "description": "Portable demographic audience intent, beginning with age in AdCP 3.2" }, "demographic-targeting-capability": { - "$ref": "core/demographic-targeting-capability.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-targeting-capability.json", "description": "Product-scoped demographic execution modes and exact interval capabilities" }, "demographic-reporting-capability": { - "$ref": "core/demographic-reporting-capability.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-reporting-capability.json", "description": "Product-scoped demographic reporting ranges, systems, and suppression posture" }, "demographic-targeting-resolution": { - "$ref": "core/demographic-targeting-resolution.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/demographic-targeting-resolution.json", "description": "Requested, applied, execution, and exact-equivalence demographic readback" }, "audience-characteristic": { - "$ref": "core/audience-characteristic.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-characteristic.json", "description": "Machine-comparable audience dimension and value or range" }, "audience-evidence": { - "$ref": "core/audience-evidence.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence.json", "description": "Immutable population-level audience composition, affinity, or reach evidence" }, "audience-evidence-requirements": { - "$ref": "core/audience-evidence-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-requirements.json", "description": "Buyer-authored audience-evidence admissibility and ranking policy" }, "audience-evidence-pin": { - "$ref": "core/audience-evidence-pin.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-pin.json", "description": "Buyer commitment pin for an exact immutable audience-evidence snapshot" }, "audience-evidence-selection": { - "$ref": "core/audience-evidence-selection.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-evidence-selection.json", "description": "Digest-pinned package readback for evidence used in a decision" }, "duration": { - "$ref": "core/duration.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/duration.json", "description": "A time duration with value and unit (hours or days)" }, "feature-requirement": { - "$ref": "core/feature-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/feature-requirement.json", "description": "A feature-based requirement \u2014 reusable predicate over a feature value. Used by property list filters, designed for reuse across governance surfaces." }, "frequency-cap": { - "$ref": "core/frequency-cap.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/frequency-cap.json", "description": "Frequency capping settings" }, "planned-delivery": { - "$ref": "core/planned-delivery.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/planned-delivery.json", "description": "The seller's interpreted delivery parameters for a media buy" }, "geo-breakdown-support": { - "$ref": "core/geo-breakdown-support.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-breakdown-support.json", "description": "Geographic breakdown capability declaration for reporting" }, "spot-reporting-capability": { - "$ref": "core/spot-reporting-capability.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/spot-reporting-capability.json", "description": "Spot-level as-run reporting support and available spot-grain metrics" }, "format": { - "$ref": "core/format.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/format.json", "description": "Deprecated 3.x named-format compatibility definition; use ProductFormatDeclaration canonical contracts for new integrations.", "deprecated": true }, "overlay": { - "$ref": "core/overlay.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/overlay.json", "description": "A publisher-controlled element that renders on top of buyer creative content within an ad placement" }, "outcome-measurement": { - "$ref": "core/outcome-measurement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/outcome-measurement.json", "description": "Business outcome measurement capabilities included with a product" }, "delivery-metrics": { - "$ref": "core/delivery-metrics.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-metrics.json", "description": "Standard delivery metrics for reporting" }, "delivery-metric-aggregate": { - "$ref": "core/delivery-metric-aggregate.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-metric-aggregate.json", "description": "Cross-buy delivery aggregate partitioned by metric scope and qualifier" }, - "placement-evidence": { - "$ref": "core/placement-evidence.json", - "description": "Seller-attested evidence artifact proving a physical placement ran (posting photo, tearsheet)" - }, "missing-metric": { - "$ref": "core/missing-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/missing-metric.json", "description": "Metric from the binding reporting contract that is absent from a delivery report" }, "catalog-item-delivery-metrics": { - "$ref": "core/catalog-item-delivery-metrics.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog-item-delivery-metrics.json", "description": "Delivery metrics row for one catalog item" }, "creative-delivery-metrics": { - "$ref": "core/creative-delivery-metrics.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-delivery-metrics.json", "description": "Delivery metrics row for one creative" }, "keyword-delivery-metrics": { - "$ref": "core/keyword-delivery-metrics.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/keyword-delivery-metrics.json", "description": "Delivery metrics row for one keyword and match type" }, "geo-delivery-metrics": { - "$ref": "core/geo-delivery-metrics.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-delivery-metrics.json", "description": "Delivery metrics row for one geographic area" }, "creative-policy": { - "$ref": "core/creative-policy.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-policy.json", "description": "Creative requirements and restrictions for a product" }, "deadline-policy": { - "$ref": "core/deadline-policy.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/deadline-policy.json", "description": "Default deadline rules for installments based on lead times from scheduled_at" }, "installment-deadlines": { - "$ref": "core/installment-deadlines.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/installment-deadlines.json", "description": "Booking, cancellation, and material submission deadlines for an installment" }, "material-deadline": { - "$ref": "core/material-deadline.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/material-deadline.json", "description": "A deadline for creative material submission at a specific stage" }, "response": { - "$ref": "core/response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/response.json", "description": "Standard response structure (MCP)" }, "error": { - "$ref": "core/error.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/error.json", "description": "Standard error structure" }, "generation-credential": { - "$ref": "core/generation-credential.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/generation-credential.json", "description": "Scoped credential for generating rights-cleared content via LLM providers" }, "attestation-issuer": { - "$ref": "core/attestation-issuer.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-issuer.json", "description": "Typed canonical identity of an attestation credential issuer" }, "attestation-subject": { - "$ref": "core/attestation-subject.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-subject.json", "description": "Typed identity of the entity or object an attestation concerns" }, "attestation-reference": { - "$ref": "core/attestation-reference.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-reference.json", "description": "Reference-first presentation of an independently issued claim" }, "attestation-capabilities": { - "$ref": "core/attestation-capabilities.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-capabilities.json", "description": "Evaluator allowlist and supported attestation delivery and proof formats" }, "attestation-evaluation": { - "$ref": "core/attestation-evaluation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attestation-evaluation.json", "description": "Evaluator-of-record result bound to an exact attestation presentation" }, "rights-attestation-evaluation": { - "$ref": "core/rights-attestation-evaluation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/rights-attestation-evaluation.json", "description": "Seller-produced rights-grant presentation and evaluation readback" }, "rights-constraint": { - "$ref": "core/rights-constraint.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/rights-constraint.json", "description": "Digest-pinned rights metadata and portable issuer-attestation references attached to creatives" }, "pagination-request": { - "$ref": "core/pagination-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pagination-request.json", "description": "Standard cursor-based pagination parameters for list request schemas" }, "pagination-response": { - "$ref": "core/pagination-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pagination-response.json", "description": "Standard cursor-based pagination metadata for list response schemas" }, "date-range": { - "$ref": "core/date-range.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/date-range.json", "description": "Date range with inclusive start and end calendar dates" }, "opportunity-context": { - "$ref": "core/opportunity-context.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/opportunity-context.json", "description": "Buyer planning-cycle context shared across proposal request, decline, and purchase" }, "datetime-range": { - "$ref": "core/datetime-range.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/datetime-range.json", "description": "Datetime range with inclusive start and end timestamps" }, "creative-item": { - "$ref": "core/creative-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-item.json", "description": "Item within a multi-asset creative format" }, "creative-assignment": { - "$ref": "core/creative-assignment.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-assignment.json", "description": "Assignment of a creative asset to a package" }, "creative-manifest": { - "$ref": "core/creative-manifest.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-manifest.json", "description": "Complete specification of a creative with all assets needed for rendering" }, - "creative-representation-set": { - "$ref": "core/creative-representation-set.json", - "description": "Complete immutable creative revision containing equivalent pre-binding trafficking representations" - }, - "creative-representation": { - "$ref": "core/creative-representation.json", - "description": "One canonical pre-binding trafficking representation within a representation set" - }, - "representation-destination": { - "$ref": "core/representation-destination.json", - "description": "Seller-owned product and format context for deterministic representation resolution" - }, - "representation-selection": { - "$ref": "core/representation-selection.json", - "description": "Source-revision, selected-representation, strategy, and derived-output lineage" - }, - "representation-rejection": { - "$ref": "core/representation-rejection.json", - "description": "Structured incompatibility reason for one rejected representation" - }, - "macro-bearing-url": { - "$ref": "core/macro-bearing-url.json", - "description": "HTTP(S) URL or legacy URI template that may contain declared or opaque macro tokens" - }, - "macro-declaration": { - "$ref": "core/macro-declaration.json", - "description": "Occurrence-level source token, semantic, actor, context, and encoding contract" - }, - "macro-encoding": { - "$ref": "core/macro-encoding.json", - "description": "Exact macro value encoding kind and pass depth" - }, - "macro-resolution-capability": { - "$ref": "core/macro-resolution-capability.json", - "description": "Exact dialect-semantic macro processing capability tuple" - }, - "macro-resolution-result": { - "$ref": "core/macro-resolution-result.json", - "description": "Path-addressable macro compatibility result for one declaration" - }, - "macro-translation-target": { - "$ref": "core/macro-translation-target.json", - "description": "Native token contract emitted by a macro translation operation" - }, "performance-feedback": { - "$ref": "core/performance-feedback.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/performance-feedback.json", "description": "Stored processing record for performance feedback" }, "performance-feedback-assertion": { - "$ref": "core/performance-feedback-assertion.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/performance-feedback-assertion.json", "description": "One compact optimizer-ready assertion about a media buy, package, or creative" }, "creative-variant": { - "$ref": "core/creative-variant.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-variant.json", "description": "A specific execution variant of a creative with performance metrics" }, - "creative-revision-id": { - "$ref": "core/creative-revision-id.json", - "description": "Buyer-assigned immutable input-content revision identity scoped to a creative" - }, "property": { - "$ref": "core/property.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property.json", "description": "An advertising property that can be validated via adagents.json" }, "creative-brief": { - "$ref": "core/creative-brief.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-brief.json", "description": "Campaign-level creative context for AI-powered creative generation" }, "creative-variable": { - "$ref": "core/creative-variable.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-variable.json", "description": "A dynamic content variable (DCO slot) on a creative" }, "reference-asset": { - "$ref": "core/reference-asset.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reference-asset.json", "description": "A reference asset with semantic role for creative context" }, "registry-event": { - "$ref": "core/registry-event.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/registry-event.json", "description": "A cursor-ordered registry change-feed event from /api/registry/feed" }, "registry-feed-response": { - "$ref": "core/registry-feed-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/registry-feed-response.json", "description": "Response wrapper for GET /api/registry/feed" }, "proposal": { - "$ref": "core/proposal.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/proposal.json", "description": "A proposed media plan with budget allocations across products - actionable via create_media_buy" }, "budget-allocation": { - "$ref": "core/budget-allocation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/budget-allocation.json", "description": "Fixed or seller-optimized allocation of a media-buy total budget across packages" }, "bidding-policy": { - "$ref": "core/bidding-policy.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/bidding-policy.json", "description": "Buyer-authored bidding, average-cost, or return policy at media-buy or package scope" }, "insertion-order": { - "$ref": "core/insertion-order.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/insertion-order.json", "description": "A formal insertion order attached to a committed proposal for agreement signing" }, "product-allocation": { - "$ref": "core/product-allocation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-allocation.json", "description": "A budget allocation for a specific product within a proposal" }, "delivery-forecast": { - "$ref": "core/delivery-forecast.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/delivery-forecast.json", "description": "Forecasted delivery metrics for a proposal or product allocation" }, "signal-coverage-forecast": { - "$ref": "core/signal-coverage-forecast.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-coverage-forecast.json", "description": "Forecast-shaped availability guidance for a signal, without requiring monetary currency" }, "forecast-range": { - "$ref": "core/forecast-range.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-range.json", "description": "A forecast value with optional low/high bounds" }, "forecast-point": { - "$ref": "core/forecast-point.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-point.json", "description": "A single point on a budget-to-outcome curve" }, "forecast-point-dimensions": { - "$ref": "core/forecast-point-dimensions.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-point-dimensions.json", "description": "Dimensional slice represented by a forecast point" }, "forecast-dimension-geo": { - "$ref": "core/forecast-dimension-geo.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-geo.json", "description": "Geographic forecast dimension variant" }, "forecast-dimension-placement": { - "$ref": "core/forecast-dimension-placement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-placement.json", "description": "Placement forecast dimension variant" }, "forecast-dimension-device-type": { - "$ref": "core/forecast-dimension-device-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-device-type.json", "description": "Device form-factor forecast dimension variant" }, "forecast-dimension-device-platform": { - "$ref": "core/forecast-dimension-device-platform.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-device-platform.json", "description": "Device platform forecast dimension variant" }, "forecast-dimension-audience": { - "$ref": "core/forecast-dimension-audience.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-audience.json", "description": "Audience forecast dimension variant" }, "forecast-dimension-signal": { - "$ref": "core/forecast-dimension-signal.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-signal.json", "description": "Signal forecast dimension variant" }, "forecast-dimension-time": { - "$ref": "core/forecast-dimension-time.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-dimension-time.json", "description": "Calendar-window forecast dimension variant for availability windows" }, "forecast-vendor-metric-value": { - "$ref": "core/forecast-vendor-metric-value.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/forecast-vendor-metric-value.json", "description": "Forecasted vendor-defined measurement value with low/mid/high bounds" }, "catalog": { - "$ref": "core/catalog.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog.json", "description": "A typed data feed \u2014 structural (offering, product, inventory, store, promotion) or vertical (hotel, flight, job, vehicle, real_estate, education, destination). Can be synced, inline, or fetched from a URL." }, "wholesale-feed-event": { - "$ref": "core/wholesale-feed-event.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/wholesale-feed-event.json", "description": "A wholesale product feed or wholesale signals feed event carried by wholesale feed webhooks" }, "offering": { - "$ref": "core/offering.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/offering.json", "description": "A promotable offering from a brand with structured asset groups and optional conversational SI experiences" }, "offering-asset-group": { - "$ref": "core/offering-asset-group.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/offering-asset-group.json", "description": "A structured group of creative assets within an offering, identified by group ID and asset type" }, "postal-area": { - "$ref": "core/postal-area.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-area.json", "description": "Reusable postal area value for targeting, product filtering, and catalog scope" }, "postal-country-system": { - "$ref": "core/postal-country-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-country-system.json", "description": "Valid country and local postal system pairings" }, "postal-area-support": { - "$ref": "core/postal-area-support.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/postal-area-support.json", "description": "Reusable postal area support map for capabilities and reporting" }, "geo-place-area": { - "$ref": "core/geo-place-area.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-area.json", "description": "Catalog-backed named place target using stable identifiers in a declared system" }, "geo-place-requirement": { - "$ref": "core/geo-place-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-requirement.json", "description": "Collision-safe identifier systems, countries, place types, and catalog versions required for later package selection" }, "geo-place-support": { - "$ref": "core/geo-place-support.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-support.json", "description": "Countries and place types supported for one place identifier system" }, "geo-place-system": { - "$ref": "core/geo-place-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-system.json", "description": "Registered geographic place identifier namespaces with HTTPS URI extensions" }, "geo-place-type": { - "$ref": "core/geo-place-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-type.json", "description": "Registered geographic place classifications with HTTPS URI extensions" }, "geo-place-resolver": { - "$ref": "core/geo-place-resolver.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-resolver.json", "description": "Machine-readable endpoint declaration for resolving place names to seller-accepted IDs" }, "get-geo-place-resolution-request": { - "$ref": "core/get-geo-place-resolution-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/get-geo-place-resolution-request.json", "description": "Standard query parameters for geographic place resolution" }, "get-geo-place-resolution-response": { - "$ref": "core/get-geo-place-resolution-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/get-geo-place-resolution-response.json", "description": "Paginated geographic place resolver results" }, "geo-place-catalog-entry": { - "$ref": "core/geo-place-catalog-entry.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-catalog-entry.json", "description": "One place identifier with lifecycle and replacement metadata" }, "geo-place-catalog-capability": { - "$ref": "core/geo-place-catalog-capability.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/geo-place-catalog-capability.json", "description": "Supported versions and resolver for one place identifier system" }, "asset-group-vocabulary": { - "$ref": "core/asset-group-vocabulary.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/asset-group-vocabulary.json", "description": "Canonical registry of asset_group_id values with descriptions and v1 alias mapping (e.g., landing_page_url replaces 6 v1 alias names)" }, "product-format-declaration": { - "$ref": "core/product-format-declaration.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-format-declaration.json", "description": "v2 inline format declaration on products. Keyed by canonical format name; product narrows exactly one canonical with platform-specific parameters." }, - "tracker-execution-contract": { - "$ref": "core/tracker-execution-contract.json", - "description": "Seller production commitment for accepted first-class manifest tracker execution" - }, - "tracker-execution-selector": { - "$ref": "core/tracker-execution-selector.json", - "description": "Exact pixel, VAST, or DAAST tracker selector in a production execution contract" - }, - "vast-tracker-constraints": { - "$ref": "core/vast-tracker-constraints.json", - "description": "Shared version-aware VAST tracker event and target constraints" - }, - "daast-tracker-constraints": { - "$ref": "core/daast-tracker-constraints.json", - "description": "Shared DAAST tracker event and target constraints" - }, "downstream-connection-requirement": { - "$ref": "core/downstream-connection-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/downstream-connection-requirement.json", "description": "Seller/platform-side connection or grant required by a product, format, or request, distinct from the AdCP caller credential." }, "canonical-projection-slot-override": { - "$ref": "core/canonical-projection-slot-override.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/canonical-projection-slot-override.json", "description": "Slot override used when projecting a legacy named format to a canonical format declaration" }, "platform-extension-ref": { - "$ref": "core/platform-extension-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/platform-extension-ref.json", "description": "Reference to a platform extension definition (URI + content digest)." }, "reference-renderer": { - "$ref": "core/reference-renderer.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reference-renderer.json", "description": "Pinned npm package export for a non-authoritative community reference presentation." }, "store-item": { - "$ref": "core/store-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/store-item.json", "description": "A physical store or location with coordinates, address, and catchment areas for proximity targeting" }, "catchment": { - "$ref": "core/catchment.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catchment.json", "description": "A catchment area definition using travel time (isochrone), simple radius, or pre-computed GeoJSON geometry" }, "price": { - "$ref": "core/price.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/price.json", "description": "A monetary amount with currency and optional billing period for catalog item pricing" }, "hotel-item": { - "$ref": "core/hotel-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/hotel-item.json", "description": "A hotel or lodging property for hotel-type catalogs" }, "flight-item": { - "$ref": "core/flight-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/flight-item.json", "description": "A flight route for flight-type catalogs" }, "job-item": { - "$ref": "core/job-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/job-item.json", "description": "A job posting for job-type catalogs" }, "vehicle-item": { - "$ref": "core/vehicle-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vehicle-item.json", "description": "A vehicle listing for vehicle-type catalogs" }, "real-estate-item": { - "$ref": "core/real-estate-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/real-estate-item.json", "description": "A property listing for real-estate-type catalogs" }, "education-item": { - "$ref": "core/education-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/education-item.json", "description": "An educational program or course for education-type catalogs" }, "destination-item": { - "$ref": "core/destination-item.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/destination-item.json", "description": "A travel destination for destination-type catalogs" }, "start-timing": { - "$ref": "core/start-timing.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/start-timing.json", "description": "Campaign start timing: 'asap' or ISO 8601 date-time" }, "pricing-option": { - "$ref": "core/pricing-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/pricing-option.json", "description": "A pricing model option offered by a publisher for a product" }, "protocol-envelope": { - "$ref": "core/protocol-envelope.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/protocol-envelope.json", "description": "Standard envelope structure added by protocol layer (MCP, A2A, REST) that wraps task response payloads with protocol-level fields like status, context_id, task_id, and message" }, "agent-signing-key": { - "$ref": "core/agent-signing-key.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-signing-key.json", "description": "Publisher-attested public key material for an authorized agent" }, "response-payload-jws-envelope": { - "$ref": "core/response-payload-jws-envelope.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/response-payload-jws-envelope.json", "description": "Decoded-payload JWS envelope used by the closed designated-task response-signing profile" }, "placement": { - "$ref": "core/placement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement.json", "description": "Represents a specific ad placement within a product's inventory" }, "placement-ref": { - "$ref": "core/placement-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-ref.json", "description": "Reference to a publisher-scoped placement" }, "format-option-ref": { - "$ref": "core/format-option-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/format-option-ref.json", "description": "Reference to a publisher-scoped format option" }, "placement-definition": { - "$ref": "core/placement-definition.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-definition.json", "description": "Canonical placement definition published in a publisher's adagents.json" }, "presentation-ref": { - "$ref": "core/presentation-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/presentation-ref.json", "description": "Immutable publisher-namespaced reference to placement presentation metadata." }, "placement-presentation": { - "$ref": "core/placement-presentation.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/placement-presentation.json", "description": "Declarative, non-executable placement chrome and creative-slot composition contract." }, "preview-provider": { - "$ref": "core/preview-provider.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/preview-provider.json", "description": "Publisher-scoped delegation to an AdCP creative preview provider." }, "preview-renderer-metadata": { - "$ref": "core/preview-renderer-metadata.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/preview-renderer-metadata.json", "description": "Audit identity and safety metadata for a preview renderer implementation." }, "mcp-webhook-payload": { - "$ref": "core/mcp-webhook-payload.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/mcp-webhook-payload.json", "description": "MCP-specific webhook payload structure for HTTP-based push notifications. Protocol-level fields at top-level (task_id, status, etc.) and AdCP data layer nested under 'result'. NOT used in A2A (uses native statusUpdate)." }, "agent-notification-config": { - "$ref": "core/agent-notification-config.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-notification-config.json", "description": "Agent-level webhook subscriber configuration for notifications such as capabilities.changed" }, "agent-webhook-challenge": { - "$ref": "core/agent-webhook-challenge.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/agent-webhook-challenge.json", "description": "Proof-of-control challenge payload for agent-level notification endpoint activation" }, "capabilities-changed-webhook": { - "$ref": "core/capabilities-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/capabilities-changed-webhook.json", "description": "Agent-level webhook payload that invalidates cached get_adcp_capabilities responses" }, "account-status-changed-webhook": { - "$ref": "core/account-status-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-status-changed-webhook.json", "description": "Account-level webhook payload that invalidates a list_accounts account status snapshot" }, "indicator": { - "$ref": "core/indicator.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator.json", "description": "Compact durable seller interpretation attached to an authoritative resource snapshot" }, "creative-approval-scope": { - "$ref": "core/creative-approval-scope.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-approval-scope.json", "description": "Publisher- or placement-scoped creative approval outcome within an assignment" }, "indicator-bearing": { - "$ref": "core/indicator-bearing.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator-bearing.json", "description": "Reusable indicator snapshot fields, exact evaluated-type coverage, freshness, and optional scope coverage" }, "indicator-scope": { - "$ref": "core/indicator-scope.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicator-scope.json", "description": "Publisher and placement scope for an indicator assertion or evaluation" }, "indicators-changed-webhook": { - "$ref": "core/indicators-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/indicators-changed-webhook.json", "description": "Account-level invalidation payload for a semantic indicator snapshot change" }, "warning": { - "$ref": "core/warning.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/warning.json", "description": "Structured non-blocking receipt returned only on synchronous mutation success" }, "warning-resource": { - "$ref": "core/warning-resource.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/warning-resource.json", "description": "Typed identity of the resource affected by an operation warning" }, "destination": { - "$ref": "core/destination.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/destination.json", "description": "A destination platform where signals can be activated (DSP, sales agent, etc.)" }, "deployment": { - "$ref": "core/deployment.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/deployment.json", "description": "A signal deployment to a specific destination platform with activation status and key" }, "publisher-property-selector": { - "$ref": "core/publisher-property-selector.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/publisher-property-selector.json", "description": "Selects properties from a publisher's adagents.json - supports three patterns: all properties, specific IDs, or by tags" }, "product-filters": { - "$ref": "core/product-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-filters.json", "description": "Structured filters for product discovery" }, "budget-range": { - "$ref": "core/budget-range.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/budget-range.json", "description": "Shared currency-denominated inclusive budget bounds" }, "product-change-map": { - "$ref": "core/product-change-map.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-change-map.json", "description": "Contradiction-proof product membership actions keyed by product ID" }, "product-offer-filters": { - "$ref": "core/product-offer-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-offer-filters.json", "description": "Offer-only product filters used by the compact product-discovery tools" }, "product-audience-evidence-requirements": { - "$ref": "core/product-audience-evidence-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-audience-evidence-requirements.json", "description": "Reference-only audience evidence policy used by compact product discovery" }, "creative-filters": { - "$ref": "core/creative-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-filters.json", "description": "Filter criteria for querying creative assets from the centralized library" }, "signal-filters": { - "$ref": "core/signal-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-filters.json", "description": "Filters to refine signal discovery results" }, "signal-pricing": { - "$ref": "core/signal-pricing.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-pricing.json", "description": "Vendor pricing model \u2014 discriminated union of cpm (fixed CPM), percent_of_media (percentage of spend, with optional CPM cap), flat_fee (fixed charge per reporting period), or per_unit (fixed price per unit of work)" }, "signal-pricing-option": { - "$ref": "core/signal-pricing-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-pricing-option.json", "deprecated": true, "description": "Deprecated \u2014 alias for vendor-pricing-option.json. Retained for backward compatibility. Prefer vendor-pricing-option.json for new implementations." }, "vendor-pricing-option": { - "$ref": "core/vendor-pricing-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-pricing-option.json", "description": "A pricing option offered by a vendor agent (signals, creative, governance), combining a pricing_option_id with a pricing model. Returned in get_signals and list_creatives, referenced in build_creative responses and report_usage." }, "creative-consumption": { - "$ref": "core/creative-consumption.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/creative-consumption.json", "description": "Structured consumption details returned by build_creative when a paid creative agent computes cost. Well-known fields for tokens, images, renders, and processing time." }, "transformer": { - "$ref": "core/transformer.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/transformer.json", "description": "An agent-offered, account-scoped, selectable unit of creative build capability (the creative analog of a media-buy product). Maps input formats to output formats and exposes typed config params. Discovered via list_transformers, selected by transformer_id in build_creative." }, "transformer-param": { - "$ref": "core/transformer-param.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/transformer-param.json", "description": "Descriptor for one configuration knob a transformer exposes (field, type, value_source inline|range|enumerable, allowed values/range/account-scoped options, default)." }, "evaluator-spec": { - "$ref": "core/evaluator-spec.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/evaluator-spec.json", "description": "Advisory buyer-attached evaluator input for build_creative \u2014 the rank-side of the get_creative_features feature oracle, driving a gate-then-rank pipeline. Declares the SOURCE of feature evaluation via one of three forms (inline pass/fail exemplars calibrating a single predicted_performance feature, an account-scoped evaluator_id, or an external get_creative_features-capable agent_url), an optional hard feature_requirement[] GATE (drop fails \u2014 internal best_of_n pruning), an explicit rank_by ordering ({feature_id, direction}), an allowlisted feature_agent pointer (accepted_verifiers; off-list \u2192 EVALUATOR_AGENT_NOT_ACCEPTED), plus an optional soft eval_budget. Informs best_of_n recommended/rank; never blocks an already-produced billable leaf." }, "property-id": { - "$ref": "core/property-id.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-id.json", "description": "Identifier for a publisher property - lowercase alphanumeric with underscores only" }, "property-tag": { - "$ref": "core/property-tag.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-tag.json", "description": "Tag for categorizing publisher properties - lowercase alphanumeric with underscores only" }, "property-list-ref": { - "$ref": "core/property-list-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/property-list-ref.json", "description": "Reference to an externally managed property list for passing large property sets" }, "collection-list-ref": { - "$ref": "core/collection-list-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/collection-list-ref.json", "description": "Reference to an externally managed collection list for passing large collection exclusion/inclusion sets" }, "identifier": { - "$ref": "core/identifier.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/identifier.json", "description": "A property identifier with type and value" }, "media-buy-features": { - "$ref": "core/media-buy-features.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/media-buy-features.json", "description": "Optional media-buy protocol features for capability declarations and product filters" }, "brand-id": { - "$ref": "core/brand-id.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-id.json", "description": "Identifier for a brand within a house portfolio - lowercase alphanumeric with underscores only" }, "brand-ref": { - "$ref": "core/brand-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-ref.json", "description": "Reference to a brand via house domain + brand_id (like publisher + property_id)" }, "brand-key": { - "$ref": "core/brand-key.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/brand-key.json", "description": "Identity-only brand key for resolving a canonical brand manifest" }, "catalog-selection": { - "$ref": "core/catalog-selection.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/catalog-selection.json", "description": "Catalog reference and item selectors without ingestion configuration" }, "seller-agent-ref": { - "$ref": "core/seller-agent-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/seller-agent-ref.json", "description": "Reference to a seller agent by its adagents.json-declared URL. Used on TMP AvailablePackage and echoed on Offer." }, "signal-id": { - "$ref": "core/signal-id.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-id.json", "description": "Universal signal identifier - discriminated union by source: 'catalog' (data_provider_domain + id, verifiable) or 'agent' (agent_url + id for a signal-source-native signal)" }, "signal-ref": { - "$ref": "core/signal-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-ref.json", "description": "Named signal reference for discovery, activation, and media-buy product targeting: scope 'product' for product-local signal options, scope 'data_provider' for published adagents.json signals[], or scope 'signal_source' for source-native signals" }, "signal-listing": { - "$ref": "core/signal-listing.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-listing.json", "description": "Shared signal_ref plus optional definition metadata used by get_signals and media products" }, "product-signal-targeting-option": { - "$ref": "core/product-signal-targeting-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/product-signal-targeting-option.json", "description": "Product-scoped signal option available for package-level signal_targeting_groups" }, "signal-definition": { - "$ref": "core/signal-definition.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-definition.json", "description": "Signal definition published in a data provider's adagents.json signals[]" }, "signal-definition-enrichment": { - "$ref": "core/signal-definition-enrichment.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-definition-enrichment.json", "description": "Optional signal-definition enrichment fields projected inline on signal listings" }, "signal-modeling-disclosure": { - "$ref": "core/signal-modeling-disclosure.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-modeling-disclosure.json", "description": "Signal-specific modeling and AI-use disclosure metadata for data signals" }, "data-provider-signal-selector": { - "$ref": "core/data-provider-signal-selector.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/data-provider-signal-selector.json", "description": "Selects signals from a data provider's adagents.json - supports three patterns: all signals, specific IDs, or by tags" }, "daypart-target": { - "$ref": "core/daypart-target.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/daypart-target.json", "description": "A time window for daypart targeting with days of week and hour range" }, "signal-targeting": { - "$ref": "core/signal-targeting.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting.json", "description": "Signals Protocol targeting constraint using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "signal-targeting-rules": { - "$ref": "core/signal-targeting-rules.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting-rules.json", "description": "Product-scoped composition rules for package-level signal_targeting_groups" }, "signal-selection-group-rule": { - "$ref": "core/signal-selection-group-rule.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-selection-group-rule.json", "description": "Override for one product signal selection group" }, "signal-targeting-expression": { - "$ref": "core/signal-targeting-expression.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/signal-targeting-expression.json", "description": "Media-buy product targeting expression using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "package-signal-targeting": { - "$ref": "core/package-signal-targeting.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting.json", "description": "One selected signal inside a package signal targeting group" }, "package-signal-targeting-group": { - "$ref": "core/package-signal-targeting-group.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting-group.json", "description": "One include or exclude child group inside package-level signal_targeting_groups" }, "package-signal-targeting-groups": { - "$ref": "core/package-signal-targeting-groups.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/package-signal-targeting-groups.json", "description": "Portable package-level signal composition: top-level all with child any/none groups" }, "event": { - "$ref": "core/event.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event.json", "description": "A marketing event (conversion, engagement, or custom) for attribution" }, "user-match": { - "$ref": "core/user-match.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/user-match.json", "description": "User identifiers for attribution matching (UIDs, hashed identifiers, click IDs)" }, "event-custom-data": { - "$ref": "core/event-custom-data.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event-custom-data.json", "description": "Event-specific data for attribution and reporting" }, "event-surface": { - "$ref": "core/event-surface.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/event-surface.json", "description": "Structured context for the surface where an event source or logged event originated" }, "attribution-window": { - "$ref": "core/attribution-window.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/attribution-window.json", "description": "Attribution methodology and lookback windows for conversion measurement" }, "optimization-goal": { - "$ref": "core/optimization-goal.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/optimization-goal.json", "description": "Conversion optimization goal for a package - event source, event type, target ROAS/CPA, and attribution window" }, "vendor-metric-optimization": { - "$ref": "core/vendor-metric-optimization.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-metric-optimization.json", "description": "Product-level capability declaration for vendor-attested metric optimization (attention, brand lift, emissions, retail-media partner metrics)" }, "vendor-metric-optimization-supported-metric": { - "$ref": "core/vendor-metric-optimization-supported-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/vendor-metric-optimization-supported-metric.json", "description": "One vendor metric a product can optimize toward" }, "audience-member": { - "$ref": "core/audience-member.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/audience-member.json", "description": "Hashed identifiers for a CRM audience member (hashed email, phone, or universal IDs)" }, "account-ref": { - "$ref": "core/account-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/account-ref.json", "description": "Reference to an account by seller-assigned ID or natural key (brand, operator, optional sandbox)" }, "provenance": { - "$ref": "core/provenance.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/provenance.json", "description": "AI provenance and disclosure metadata \u2014 declares how content was produced, C2PA references, regulatory disclosure requirements, and third-party verification results" }, "wholesale-feed-webhook": { - "$ref": "core/wholesale-feed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/wholesale-feed-webhook.json", "description": "Webhook payload carrying a wholesale feed change event" }, "webhook-challenge": { - "$ref": "core/webhook-challenge.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-challenge.json", "description": "Proof-of-control challenge payload for account-level notification endpoint activation" }, "webhook-challenge-response": { - "$ref": "core/webhook-challenge-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/webhook-challenge-response.json", "description": "Receiver response body for account-level notification_configs[] endpoint proof-of-control challenges" } }, @@ -1039,63 +963,63 @@ "description": "Typed requirement schemas for creative assets in format definitions", "schemas": { "asset-requirements": { - "$ref": "core/requirements/asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/asset-requirements.json", "description": "Combined schema that allows any typed asset requirements" }, "html-asset-requirements": { - "$ref": "core/requirements/html-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/html-asset-requirements.json", "description": "Requirements for HTML creative assets - sandbox compatibility, external resources, allowed domains" }, "image-asset-requirements": { - "$ref": "core/requirements/image-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/image-asset-requirements.json", "description": "Requirements for image creative assets - dimensions, formats, file size, animation" }, "video-asset-requirements": { - "$ref": "core/requirements/video-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/video-asset-requirements.json", "description": "Requirements for video creative assets - dimensions, duration, codecs, bitrate" }, "audio-asset-requirements": { - "$ref": "core/requirements/audio-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/audio-asset-requirements.json", "description": "Requirements for audio creative assets - duration, formats, sample rate, channels" }, "javascript-asset-requirements": { - "$ref": "core/requirements/javascript-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/javascript-asset-requirements.json", "description": "Requirements for JavaScript creative assets - module type, external resources" }, "text-asset-requirements": { - "$ref": "core/requirements/text-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/text-asset-requirements.json", "description": "Requirements for text creative assets - character limits, line counts" }, "url-asset-requirements": { - "$ref": "core/requirements/url-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/url-asset-requirements.json", "description": "Requirements for URL assets - protocols, allowed domains, macro support" }, "markdown-asset-requirements": { - "$ref": "core/requirements/markdown-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/markdown-asset-requirements.json", "description": "Requirements for markdown creative assets" }, "css-asset-requirements": { - "$ref": "core/requirements/css-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/css-asset-requirements.json", "description": "Requirements for CSS creative assets" }, "vast-asset-requirements": { - "$ref": "core/requirements/vast-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/vast-asset-requirements.json", "description": "Requirements for VAST creative assets - version requirements" }, "daast-asset-requirements": { - "$ref": "core/requirements/daast-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/daast-asset-requirements.json", "description": "Requirements for DAAST creative assets" }, "catalog-requirements": { - "$ref": "core/requirements/catalog-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/catalog-requirements.json", "description": "Format-level declaration of what catalog feeds a creative requires" }, "offering-asset-constraint": { - "$ref": "core/requirements/offering-asset-constraint.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/offering-asset-constraint.json", "description": "Per-group creative requirements that each offering must satisfy within a catalog" }, "webhook-asset-requirements": { - "$ref": "core/requirements/webhook-asset-requirements.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/requirements/webhook-asset-requirements.json", "description": "Requirements for webhook creative assets" } } @@ -1105,440 +1029,424 @@ "description": "Enumerated types and constants", "schemas": { "pricing-model": { - "$ref": "enums/pricing-model.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pricing-model.json", "description": "Supported pricing models for advertising products" }, "pricing-structure": { - "$ref": "enums/pricing-structure.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pricing-structure.json", "description": "How a payable media price is determined: fixed, auction, or contingent" }, "delivery-type": { - "$ref": "enums/delivery-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/delivery-type.json", "description": "Type of inventory delivery" }, "proposal-status": { - "$ref": "enums/proposal-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-status.json", "description": "Lifecycle status of a proposal (draft or committed)" }, "proposal-decline-reason": { - "$ref": "enums/proposal-decline-reason.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-decline-reason.json", "description": "Machine-readable terminal proposal feedback" }, "proposal-refinement-reason": { - "$ref": "enums/proposal-refinement-reason.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/proposal-refinement-reason.json", "description": "Machine-readable partial or unable proposal-refinement outcome" }, "media-buy-status": { - "$ref": "enums/media-buy-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/media-buy-status.json", "description": "Status of a media buy" }, "canonical-media-buy-action": { - "$ref": "enums/canonical-media-buy-action.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/canonical-media-buy-action.json", "description": "Fine-grained action vocabulary for compact MediaBuy tools" }, "canonical-media-buy-action-mode": { - "$ref": "enums/canonical-media-buy-action-mode.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/canonical-media-buy-action-mode.json", "description": "Execution mode for routed compact-lifecycle actions" }, "creative-status": { - "$ref": "enums/creative-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-status.json", "description": "Status of a creative asset" }, "creative-approval-status": { - "$ref": "enums/creative-approval-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-approval-status.json", "description": "Approval state of a creative on a specific package" }, "audience-status": { - "$ref": "enums/audience-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audience-status.json", "description": "Matching status of a synced audience on a seller platform" }, "creative-quality": { - "$ref": "enums/creative-quality.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-quality.json", "description": "Quality tier for creative generation (draft, production)" }, "logo-slot": { - "$ref": "enums/logo-slot.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/logo-slot.json", "description": "Renderer-facing logo slots for selecting brand.json logo variants" }, "pacing": { - "$ref": "enums/pacing.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/pacing.json", "description": "Budget pacing strategy" }, "frequency-cap-scope": { - "$ref": "enums/frequency-cap-scope.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/frequency-cap-scope.json", "description": "Scope for frequency cap application" }, "identifier-types": { - "$ref": "enums/identifier-types.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/identifier-types.json", "description": "Valid identifier types for property identification across different media types" }, "publisher-identifier-types": { - "$ref": "enums/publisher-identifier-types.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/publisher-identifier-types.json", "description": "Valid identifier types for publisher/legal entity identification (TAG ID, DUNS, LEI, seller_id, GLN)" }, "channels": { - "$ref": "enums/channels.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/channels.json", "description": "Advertising channels (display, video, dooh, ctv, audio, etc.)" }, "video-placement-type": { - "$ref": "enums/video-placement-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/video-placement-type.json", "description": "Declared video placement classifications using IAB Tech Lab/OpenRTB 2.6 video.plcmt definitions" }, "audio-distribution-type": { - "$ref": "enums/audio-distribution-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audio-distribution-type.json", "description": "Declared audio distribution classifications using IAB Tech Lab/OpenRTB 2.6 audio.feed definitions" }, "sponsored-placement-type": { - "$ref": "enums/sponsored-placement-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sponsored-placement-type.json", "description": "Declared sponsored-placement classifications for catalog-driven retail-media inventory" }, "social-placement-surface": { - "$ref": "enums/social-placement-surface.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/social-placement-surface.json", "description": "Declared social-placement surface classifications for social inventory" }, "task-status": { - "$ref": "enums/task-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/task-status.json", "description": "Standardized task status values based on A2A TaskState enum" }, "task-type": { - "$ref": "enums/task-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/task-type.json", "description": "Valid AdCP task types across all domains" }, "asset-content-type": { - "$ref": "enums/asset-content-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/asset-content-type.json", "description": "Types of content that can be used as creative assets (image, video, html, etc.)" }, "disclosure-position": { - "$ref": "enums/disclosure-position.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/disclosure-position.json", "description": "Where a required disclosure should appear within a creative" }, "disclosure-persistence": { - "$ref": "enums/disclosure-persistence.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/disclosure-persistence.json", "description": "How long a disclosure must persist during content playback or display" }, "vast-version": { - "$ref": "enums/vast-version.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/vast-version.json", "description": "Supported VAST specification versions (2.0, 3.0, 4.0, 4.1, 4.2, 4.3)" }, - "representation-selection-strategy": { - "$ref": "enums/representation-selection-strategy.json", - "description": "Deterministic strategy for selecting one compatible creative representation" - }, "vast-tracking-event": { - "$ref": "enums/vast-tracking-event.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/vast-tracking-event.json", "description": "Standard VAST tracking events for video playback and interaction" }, - "pixel-tracking-event": { - "$ref": "enums/pixel-tracking-event.json", - "description": "Canonical first-class pixel tracker event vocabulary" - }, - "tracker-execution-actor": { - "$ref": "enums/tracker-execution-actor.json", - "description": "Actor responsible for initiating an accepted tracker" - }, - "tracker-firing-path": { - "$ref": "enums/tracker-firing-path.json", - "description": "Permitted client or server tracker initiation path" - }, "property-type": { - "$ref": "enums/property-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/property-type.json", "description": "Types of addressable advertising properties with verifiable ownership" }, "dimension-unit": { - "$ref": "enums/dimension-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/dimension-unit.json", "description": "Units of measurement for creative format dimensions (px, dp, inches, cm)" }, "co-branding-requirement": { - "$ref": "enums/co-branding-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/co-branding-requirement.json", "description": "Co-branding policy for creatives (required, optional, none)" }, "landing-page-requirement": { - "$ref": "enums/landing-page-requirement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/landing-page-requirement.json", "description": "Landing page policy for creative destinations (any, retailer_site_only, must_include_retailer)" }, "daast-version": { - "$ref": "enums/daast-version.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/daast-version.json", "description": "Supported DAAST specification versions (1.0, 1.1)" }, "daast-tracking-event": { - "$ref": "enums/daast-tracking-event.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/daast-tracking-event.json", "description": "Standard DAAST tracking events for audio playback and interaction" }, "day-of-week": { - "$ref": "enums/day-of-week.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/day-of-week.json", "description": "Days of the week for daypart targeting" }, "signal-catalog-type": { - "$ref": "enums/signal-catalog-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-catalog-type.json", "description": "Commercial/provenance types for signals (marketplace, custom, owned)" }, "metric-type": { - "$ref": "enums/metric-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/metric-type.json", "description": "Performance metric types for feedback and optimization" }, "feedback-source": { - "$ref": "enums/feedback-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/feedback-source.json", "description": "Source of performance feedback data" }, "forecast-method": { - "$ref": "enums/forecast-method.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecast-method.json", "description": "Method used to produce a delivery forecast (estimate, modeled, guaranteed)" }, "forecastable-metric": { - "$ref": "enums/forecastable-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecastable-metric.json", "description": "Standard metric names for delivery forecasts (audience_size, reach, impressions, clicks, spend, etc.)" }, "forecast-range-unit": { - "$ref": "enums/forecast-range-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/forecast-range-unit.json", "description": "How to interpret forecast points: spend curve, reach/frequency curve, temporal (weekly/daily), or outcome targets (clicks/conversions)" }, "availability-status": { - "$ref": "enums/availability-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/availability-status.json", "description": "Bookability of the inventory a forecast row describes (available, unavailable)" }, "demographic-system": { - "$ref": "enums/demographic-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/demographic-system.json", "description": "Audience measurement systems for demographic notation (nielsen, barb, agf, oztam, mediametrie, custom)" }, "reach-unit": { - "$ref": "enums/reach-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/reach-unit.json", "description": "Unit of measurement for reach metrics (individuals, households, devices, accounts, cookies, custom)" }, "creative-agent-capability": { - "$ref": "enums/creative-agent-capability.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-agent-capability.json", "description": "Capabilities supported by creative agents (validation, assembly, generation, preview, delivery)" }, "adcp-protocol": { - "$ref": "enums/adcp-protocol.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/adcp-protocol.json", "description": "AdCP protocol domains (media-buy, signals, governance, creative, brand)" }, "brand-agent-type": { - "$ref": "enums/brand-agent-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/brand-agent-type.json", "description": "Agent types declarable in brand.json (brand, rights, measurement, governance, creative, sales, buying, signals)" }, "right-use": { - "$ref": "enums/right-use.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/right-use.json", "description": "Types of rights usage (likeness, voice, endorsement, sync, etc.)" }, "right-type": { - "$ref": "enums/right-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/right-type.json", "description": "Categories of licensable rights (talent, music, brand_ip, stock_media)" }, "http-method": { - "$ref": "enums/http-method.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/http-method.json", "description": "HTTP methods for webhook requests (GET, POST)" }, "webhook-response-type": { - "$ref": "enums/webhook-response-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/webhook-response-type.json", "description": "Expected response content types from webhooks" }, "webhook-security-method": { - "$ref": "enums/webhook-security-method.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/webhook-security-method.json", "description": "Security methods for webhook authentication" }, "javascript-module-type": { - "$ref": "enums/javascript-module-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/javascript-module-type.json", "description": "JavaScript module format types (esm, commonjs, script)" }, "markdown-flavor": { - "$ref": "enums/markdown-flavor.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/markdown-flavor.json", "description": "Markdown specification flavors (commonmark, gfm)" }, "url-asset-type": { - "$ref": "enums/url-asset-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/url-asset-type.json", "description": "Types of URL assets (clickthrough, tracker_pixel, tracker_script)" }, "validation-mode": { - "$ref": "enums/validation-mode.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/validation-mode.json", "description": "Creative validation strictness levels (strict, lenient)" }, "creative-action": { - "$ref": "enums/creative-action.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-action.json", "description": "Actions taken on creatives during sync (created, updated, unchanged, failed, deleted)" }, "notification-type": { - "$ref": "enums/notification-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/notification-type.json", "description": "Shared notification registry for delivery, impairment, lifecycle, wholesale-feed, and capability-change events" }, "indicator-type": { - "$ref": "enums/indicator-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/indicator-type.json", "description": "Closed AdCP 3.2 vocabulary for durable media-buy and creative-assignment indicators" }, "warning-code": { - "$ref": "enums/warning-code.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/warning-code.json", "description": "Closed AdCP 3.2 vocabulary for synchronous operation warnings" }, "reporting-frequency": { - "$ref": "enums/reporting-frequency.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/reporting-frequency.json", "description": "Frequencies for delivery reports (hourly, daily, monthly)" }, "available-metric": { - "$ref": "enums/available-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/available-metric.json", "description": "Standard delivery and performance metrics for reporting" }, "preview-output-format": { - "$ref": "enums/preview-output-format.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/preview-output-format.json", "description": "Output formats for creative previews (url, html)" }, "sort-direction": { - "$ref": "enums/sort-direction.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sort-direction.json", "description": "Sort direction for list queries (asc, desc)" }, "sort-metric": { - "$ref": "enums/sort-metric.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/sort-metric.json", "description": "Numeric delivery metrics available for sorting breakdown rows" }, "history-entry-type": { - "$ref": "enums/history-entry-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/history-entry-type.json", "description": "Type of task history entry (request, response)" }, "feed-format": { - "$ref": "enums/feed-format.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/feed-format.json", "description": "Product catalog feed formats" }, "update-frequency": { - "$ref": "enums/update-frequency.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/update-frequency.json", "description": "Frequency of product catalog updates" }, "content-id-type": { - "$ref": "enums/content-id-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/content-id-type.json", "description": "Identifier type for matching conversion event content_ids to catalog items (sku, gtin, or vertical-specific IDs)" }, "auth-scheme": { - "$ref": "enums/auth-scheme.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/auth-scheme.json", "description": "Authentication schemes for push notifications" }, "creative-sort-field": { - "$ref": "enums/creative-sort-field.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/creative-sort-field.json", "description": "Fields available for sorting creative listings" }, "geo-level": { - "$ref": "enums/geo-level.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/geo-level.json", "description": "Geographic targeting granularity levels (country, region, metro, postal_area)" }, "metro-system": { - "$ref": "enums/metro-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/metro-system.json", "description": "Metro area classification systems for geographic targeting (nielsen_dma, uk_itl1, uk_itl2, eurostat_nuts2)" }, "postal-system": { - "$ref": "enums/postal-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/postal-system.json", "description": "Country-local postal code systems for geographic targeting (zip, zip_plus_four, outward, plz, postal_code, etc.)" }, "legacy-postal-system": { - "$ref": "enums/legacy-postal-system.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/legacy-postal-system.json", "deprecated": true, "description": "Deprecated country-fused postal code systems for compatibility (us_zip, gb_outward, ca_fsa, etc.)" }, "age-verification-method": { - "$ref": "enums/age-verification-method.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/age-verification-method.json", "description": "Methods for verifying user age for compliance (facial_age_estimation, id_document, digital_id, credit_card, world_id)" }, "age-determination-basis": { - "$ref": "enums/age-determination-basis.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/age-determination-basis.json", "description": "User-level age determination bases permitted for targeting execution (verified, declared, or inferred)" }, "device-platform": { - "$ref": "enums/device-platform.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/device-platform.json", "description": "Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV" }, "device-type": { - "$ref": "enums/device-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/device-type.json", "description": "Device form factor categories for targeting and reporting (desktop, mobile, tablet, ctv, dooh, unknown)" }, "signal-value-type": { - "$ref": "enums/signal-value-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-value-type.json", "description": "Signal value types for targeting (binary, categorical, numeric)" }, "signal-source": { - "$ref": "enums/signal-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/signal-source.json", "description": "Source type for signal identifiers: 'catalog' (verifiable via data provider) or 'agent' (signal source identified by agent_url)" }, "universal-macro": { - "$ref": "enums/universal-macro.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/universal-macro.json", "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs" }, "event-type": { - "$ref": "enums/event-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/event-type.json", "description": "Standard marketing event types for conversion tracking (purchase, lead, add_to_cart, etc.)" }, "uid-type": { - "$ref": "enums/uid-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/uid-type.json", "description": "Universal ID types for user matching (rampid, id5, uid2, maid, etc.)" }, "attestation-claim": { - "$ref": "enums/attestation-claim.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/attestation-claim.json", "description": "Claims a verified identity attestation can establish (unique_human, age_over_13/16/18/21)" }, "action-source": { - "$ref": "enums/action-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/action-source.json", "description": "Where the conversion event originated (website, app, offline, etc.)" }, "attribution-model": { - "$ref": "enums/attribution-model.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/attribution-model.json", "description": "Attribution model used for conversion measurement" }, "audience-source": { - "$ref": "enums/audience-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/audience-source.json", "description": "Origin of an audience segment in delivery reporting (synced, platform, third_party, lookalike, retargeting, unknown)" }, "wcag-level": { - "$ref": "enums/wcag-level.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/wcag-level.json", "description": "Web Content Accessibility Guidelines conformance level (A, AA, AAA)" }, "catalog-type": { - "$ref": "enums/catalog-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-type.json", "description": "Catalog feed types: offering, product, inventory, store, promotion, hotel, flight, job, vehicle, real_estate, education, destination" }, "catalog-action": { - "$ref": "enums/catalog-action.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-action.json", "description": "Actions taken on catalogs during sync (created, updated, unchanged, failed, deleted)" }, "catalog-item-status": { - "$ref": "enums/catalog-item-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/catalog-item-status.json", "description": "Approval status of individual catalog items (approved, pending, rejected, warning)" }, "transport-mode": { - "$ref": "enums/transport-mode.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/transport-mode.json", "description": "Transportation modes for isochrone-based catchment area calculations (walking, cycling, driving, public_transport)" }, "distance-unit": { - "$ref": "enums/distance-unit.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/distance-unit.json", "description": "Units of distance measurement for radius-based catchment areas (km, mi, m)" }, "error-code": { - "$ref": "enums/error-code.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/error-code.json", "description": "Standard error code vocabulary for agent recovery classification" }, "consent-basis": { - "$ref": "enums/consent-basis.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/consent-basis.json", "description": "GDPR Article 6(1) lawful basis for processing personal data" }, "digital-source-type": { - "$ref": "enums/digital-source-type.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/digital-source-type.json", "description": "IPTC-aligned classification of AI involvement in content creation (digital_capture, trained_algorithmic_media, composite_with_trained_algorithmic_media, etc.)" }, "governance-phase": { - "$ref": "enums/governance-phase.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-phase.json", "description": "Media buy lifecycle phase for governance checks (purchase, modification, delivery)" }, "governance-domain": { - "$ref": "enums/governance-domain.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-domain.json", "description": "Governance sub-domains a registry policy applies to (campaign, property, creative, content_standards)" }, "genre-taxonomy": { - "$ref": "enums/genre-taxonomy.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/genre-taxonomy.json", "description": "Taxonomy systems for genre classification (iab_content_3.0, gracenote, eidr, etc.)" }, "governance-mode": { - "$ref": "enums/governance-mode.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/governance-mode.json", "description": "Operating mode for a governance agent (audit, advisory, enforce)" }, "delegation-authority": { - "$ref": "enums/delegation-authority.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/delegation-authority.json", "description": "Authority level for a delegated agent on a campaign plan (full, execute_only, propose_only)" }, "exclusivity": { - "$ref": "enums/exclusivity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/enums/exclusivity.json", "description": "Whether a product offers exclusive access to its inventory (none, category, exclusive)" } } @@ -1547,43 +1455,43 @@ "description": "Individual pricing model schemas discriminated by pricing_model. Unit-based models may be fixed or auction-based. Contingent models such as revenue_share calculate payable spend from a measured business outcome after delivery.", "schemas": { "cpm-option": { - "$ref": "pricing-options/cpm-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpm-option.json", "description": "Cost Per Mille (CPM) pricing - supports fixed rate and auction modes" }, "vcpm-option": { - "$ref": "pricing-options/vcpm-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/vcpm-option.json", "description": "Viewable Cost Per Mille (vCPM) pricing - supports fixed rate and auction modes" }, "cpc-option": { - "$ref": "pricing-options/cpc-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpc-option.json", "description": "Cost Per Click (CPC) pricing - supports fixed rate and auction modes" }, "cpcv-option": { - "$ref": "pricing-options/cpcv-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpcv-option.json", "description": "Cost Per Completed View (CPCV) pricing - supports fixed rate and auction modes" }, "cpv-option": { - "$ref": "pricing-options/cpv-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpv-option.json", "description": "Cost Per View (CPV) pricing with threshold - supports fixed rate and auction modes" }, "cpp-option": { - "$ref": "pricing-options/cpp-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpp-option.json", "description": "Cost Per Point (CPP) pricing for TV/audio with demographic measurement - supports fixed rate and auction modes" }, "cpa-option": { - "$ref": "pricing-options/cpa-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/cpa-option.json", "description": "Cost Per Acquisition (CPA) pricing for performance campaigns - fixed price per conversion event" }, "revenue-share-option": { - "$ref": "pricing-options/revenue-share-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/revenue-share-option.json", "description": "Revenue-share pricing - decimal commission rate applied to settled commissionable conversion value" }, "flat-rate-option": { - "$ref": "pricing-options/flat-rate-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/flat-rate-option.json", "description": "Flat rate pricing for DOOH and sponsorships - supports fixed rate and auction modes" }, "time-option": { - "$ref": "pricing-options/time-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/pricing-options/time-option.json", "description": "Time-based pricing - cost per time unit (hour, day, week, month) that scales with campaign duration" } } @@ -1593,51 +1501,51 @@ "tasks": { "list-accounts": { "request": { - "$ref": "account/list-accounts-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/list-accounts-request.json", "description": "Request parameters for listing accounts accessible to the authenticated agent" }, "response": { - "$ref": "account/list-accounts-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/list-accounts-response.json", "description": "Response payload for list_accounts task" } }, "sync-accounts": { "request": { - "$ref": "account/sync-accounts-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-accounts-request.json", "description": "Request parameters for syncing advertiser accounts with a seller" }, "response": { - "$ref": "account/sync-accounts-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-accounts-response.json", "description": "Response payload for sync_accounts task" } }, "sync-governance": { "request": { - "$ref": "account/sync-governance-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-governance-request.json", "description": "Request parameters for registering governance agent endpoints on accounts" }, "response": { - "$ref": "account/sync-governance-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/sync-governance-response.json", "description": "Response payload for sync_governance task" } }, "report-usage": { "request": { - "$ref": "account/report-usage-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/report-usage-request.json", "description": "Request parameters for reporting vendor service consumption after delivery" }, "response": { - "$ref": "account/report-usage-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/report-usage-response.json", "description": "Response payload for report_usage task" } }, "get-account-financials": { "request": { - "$ref": "account/get-account-financials-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/get-account-financials-request.json", "description": "Request parameters for querying financial status of an operator-billed account" }, "response": { - "$ref": "account/get-account-financials-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/account/get-account-financials-response.json", "description": "Response payload for get_account_financials task" } } @@ -1647,264 +1555,244 @@ "description": "Media buy task request/response schemas", "supporting-schemas": { "product-discovery-criteria": { - "$ref": "media-buy/product-discovery-criteria.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/product-discovery-criteria.json", "description": "Structured offer, catalog, and policy criteria shared by compact discovery tools" }, "outcome-target": { - "$ref": "media-buy/outcome-target.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/outcome-target.json", "description": "Reverse-forecast planning input: a compact metric or event goal plus desired volume the seller solves budget for" }, "proposal-refinement": { - "$ref": "media-buy/proposal-refinement.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-refinement.json", "description": "One immutable proposal revision request" }, "proposal-budget-constraint": { - "$ref": "media-buy/proposal-budget-constraint.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-budget-constraint.json", "description": "Strict inclusive budget bounds for proposal negotiation" }, "proposal-decline": { - "$ref": "media-buy/proposal-decline.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/proposal-decline.json", "description": "One terminal decline of an immutable proposal" }, "product-purchase": { - "$ref": "media-buy/product-purchase.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/product-purchase.json", "description": "Canonical direct product selection without creatives or negotiated term overrides" }, "compatibility-purchase-coordinator-input": { - "$ref": "media-buy/legacy-purchase-continuation-input.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/legacy-purchase-continuation-input.json", "description": "SDK-local fail-closed input for redeeming a deprecated products-only compatibility continuation" }, "commercial-terms": { - "$ref": "media-buy/commercial-terms.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/commercial-terms.json", "description": "Typed immutable commercial envelope shared by direct purchases and proposals" }, "package-control": { - "$ref": "media-buy/package-control.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-control.json", "description": "Operational package controls bounded by accepted commercial terms" }, "media-buy-commitment-response": { - "$ref": "media-buy/media-buy-commitment-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/media-buy-commitment-response.json", "description": "Compact shared result for direct purchase and proposal acceptance" }, "get-products-rejected": { - "$ref": "media-buy/get-products-rejected.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-rejected.json", "description": "Terminal business rejection arm for a well-formed get_products brief or refinement" }, "package-request": { - "$ref": "media-buy/package-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-request.json", "description": "Package configuration for media buy creation - used within create_media_buy request" }, "package-update": { - "$ref": "media-buy/package-update.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/package-update.json", "description": "Package update configuration for update_media_buy - identifies package and specifies fields to modify" } }, "tasks": { "get-products": { "request": { - "$ref": "media-buy/get-products-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use list_products, request_proposals, refine_proposals, or decline_proposals." }, "response": { - "$ref": "media-buy/get-products-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-products-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for get_products" } }, "list-products": { "request": { - "$ref": "media-buy/list-products-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-products-request.json", "description": "Request parameters for synchronous product-offer reads" }, "response": { - "$ref": "media-buy/list-products-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-products-response.json", "description": "Response payload for list_products" } }, "request-proposals": { "request": { - "$ref": "media-buy/request-proposals-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/request-proposals-request.json", "description": "Request parameters for creating actionable seller proposals" }, "response": { - "$ref": "media-buy/request-proposals-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/request-proposals-response.json", "description": "Response payload for request_proposals" } }, "refine-proposals": { "request": { - "$ref": "media-buy/refine-proposals-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/refine-proposals-request.json", "description": "Request parameters for creating one or more proposal revisions" }, "response": { - "$ref": "media-buy/refine-proposals-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/refine-proposals-response.json", "description": "Response payload for refine_proposals" } }, "decline-proposals": { "request": { - "$ref": "media-buy/decline-proposals-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/decline-proposals-request.json", "description": "Request parameters for terminally declining one or more proposals" }, "response": { - "$ref": "media-buy/decline-proposals-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/decline-proposals-response.json", "description": "Ordered decline results for decline_proposals" } }, "buy-products": { "request": { - "$ref": "media-buy/buy-products-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/buy-products-request.json", "description": "Create a MediaBuy directly from canonical published product offers" }, "response": { - "$ref": "media-buy/buy-products-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/buy-products-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "accept-proposal": { "request": { - "$ref": "media-buy/accept-proposal-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/accept-proposal-request.json", "description": "Accept a committed new-buy, amendment, or cancellation proposal" }, "response": { - "$ref": "media-buy/accept-proposal-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/accept-proposal-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "control-media-buy": { "request": { - "$ref": "media-buy/control-media-buy-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/control-media-buy-request.json", "description": "Apply operational controls inside accepted commercial terms" }, "response": { - "$ref": "media-buy/control-media-buy-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/control-media-buy-response.json", "description": "Compact operational-control result" } }, "list-creative-formats": { "request": { - "$ref": "media-buy/list-creative-formats-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request. Sales agents publish canonical sellable formats through get_products Product.format_options[]." }, "response": { - "$ref": "media-buy/list-creative-formats-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats. Not a sales-agent deliverability contract." } }, "create-media-buy": { "request": { - "$ref": "media-buy/create-media-buy-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/create-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use buy_products or accept_proposal." }, "response": { - "$ref": "media-buy/create-media-buy-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/create-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for create_media_buy" } }, "update-media-buy": { "request": { - "$ref": "media-buy/update-media-buy-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/update-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use control_media_buy or refine_proposals." }, "response": { - "$ref": "media-buy/update-media-buy-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/update-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for update_media_buy" } }, "get-media-buys": { "request": { - "$ref": "media-buy/get-media-buys-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buys-request.json", "description": "Request parameters for retrieving media buy status, creative approvals, and delivery snapshots" }, "response": { - "$ref": "media-buy/get-media-buys-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buys-response.json", "description": "Response payload for get_media_buys task" } }, "get-media-buy-delivery": { "request": { - "$ref": "media-buy/get-media-buy-delivery-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buy-delivery-request.json", "description": "Request parameters for retrieving comprehensive delivery metrics" }, "response": { - "$ref": "media-buy/get-media-buy-delivery-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/get-media-buy-delivery-response.json", "description": "Response payload for get_media_buy_delivery task" } }, - "get-reporting-status": { - "request": { - "$ref": "media-buy/get-reporting-status-request.json", - "description": "Request parameters for reconciling managed reporting obligations, revisions, and materializations" - }, - "response": { - "$ref": "media-buy/get-reporting-status-response.json", - "description": "Authoritative reporting ledger status for summary, periods, or one exact revision" - } - }, - "sync-reporting-receipts": { - "request": { - "$ref": "media-buy/sync-reporting-receipts-request.json", - "description": "Submit authenticated consumer reconciliation receipts for durable reporting materializations" - }, - "response": { - "$ref": "media-buy/sync-reporting-receipts-response.json", - "description": "Per-receipt durable recording results" - } - }, "provide-performance-feedback": { "request": { - "$ref": "media-buy/provide-performance-feedback-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/provide-performance-feedback-request.json", "description": "Request parameters for sharing performance outcomes with publishers" }, "response": { - "$ref": "media-buy/provide-performance-feedback-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/provide-performance-feedback-response.json", "description": "Response payload for provide_performance_feedback task" } }, "sync-event-sources": { "request": { - "$ref": "media-buy/sync-event-sources-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-event-sources-request.json", "description": "Request parameters for configuring event sources on an account" }, "response": { - "$ref": "media-buy/sync-event-sources-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-event-sources-response.json", "description": "Response payload for sync_event_sources task" } }, "log-event": { "request": { - "$ref": "media-buy/log-event-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/log-event-request.json", "description": "Request parameters for logging conversion or marketing events" }, "response": { - "$ref": "media-buy/log-event-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/log-event-response.json", "description": "Response payload for log_event task" } }, "sync-audiences": { "request": { - "$ref": "media-buy/sync-audiences-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-audiences-request.json", "description": "Request parameters for managing CRM-based audiences on an account" }, "response": { - "$ref": "media-buy/sync-audiences-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-audiences-response.json", "description": "Response payload for sync_audiences task" } }, "sync-catalogs": { "request": { - "$ref": "media-buy/sync-catalogs-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-catalogs-request.json", "description": "Request parameters for syncing catalog feeds (products, inventory, stores, promotions, offerings) with approval workflow" }, "response": { - "$ref": "media-buy/sync-catalogs-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/sync-catalogs-response.json", "description": "Response payload for sync_catalogs task with per-catalog results and item-level approval status" } } @@ -1915,100 +1803,100 @@ "tasks": { "build-creative": { "request": { - "$ref": "media-buy/build-creative-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/build-creative-request.json", "description": "Request parameters for AI-powered creative generation" }, "response": { - "$ref": "media-buy/build-creative-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/media-buy/build-creative-response.json", "description": "Response payload for build_creative task" } }, "preview-creative": { "request": { - "$ref": "creative/preview-creative-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/preview-creative-request.json", "description": "Request parameters for generating creative previews" }, "response": { - "$ref": "creative/preview-creative-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/preview-creative-response.json", "description": "Response payload for preview_creative task" } }, "list-creative-formats": { "request": { - "$ref": "creative/list-creative-formats-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request; use get_adcp_capabilities creative.supported_formats[]." }, "response": { - "$ref": "creative/list-creative-formats-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats." } }, "list-transformers": { "request": { - "$ref": "creative/list-transformers-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-transformers-request.json", "description": "Request parameters for discovering account-scoped creative transformers (the creative analog of products), with optional brief filtering, per-param option expansion, and pricing" }, "response": { - "$ref": "creative/list-transformers-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-transformers-response.json", "description": "Response payload with transformer descriptors \u2014 input/output formats, typed config params, account-scoped enumerable option values when expanded, and per-account pricing" } }, "get-creative-delivery": { "request": { - "$ref": "creative/get-creative-delivery-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-delivery-request.json", "description": "Request parameters for retrieving creative delivery data with variant-level breakdowns" }, "response": { - "$ref": "creative/get-creative-delivery-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-delivery-response.json", "description": "Response payload with creative delivery data including variant manifests and metrics" } }, "list-creatives": { "request": { - "$ref": "creative/list-creatives-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creatives-request.json", "description": "Request parameters for querying creative library with filtering and pagination" }, "response": { - "$ref": "creative/list-creatives-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/list-creatives-response.json", "description": "Response payload for list_creatives task" } }, "sync-creatives": { "request": { - "$ref": "creative/sync-creatives-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/sync-creatives-request.json", "description": "Request parameters for syncing creative assets with upsert semantics" }, "response": { - "$ref": "creative/sync-creatives-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/sync-creatives-response.json", "description": "Response payload for sync_creatives task" } }, "validate-input": { "request": { - "$ref": "creative/validate-input-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/validate-input-request.json", "description": "Request parameters for validating a creative manifest against canonical formats and/or specific products without committing to a render" }, "response": { - "$ref": "creative/validate-input-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/validate-input-response.json", "description": "Response payload for validate_input task with per-target validation results" } } }, "webhooks": { "creative-assignment-changed": { - "$ref": "creative/creative-assignment-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/creative-assignment-changed-webhook.json", "description": "Account-level invalidation payload for creative assignment membership or approval changes" } }, "asset_types": { - "$ref": "creative/asset-types/index.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/asset-types/index.json", "description": "Asset type definitions for creative manifests" }, "build_inputs": { "video_brief": { - "$ref": "creative/video-brief.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/video-brief.json", "description": "Typed per-segment generation brief for build_creative input on generative video platforms" } } @@ -2018,21 +1906,21 @@ "tasks": { "get-signals": { "request": { - "$ref": "signals/get-signals-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/get-signals-request.json", "description": "Request parameters for discovering signals based on description" }, "response": { - "$ref": "signals/get-signals-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/get-signals-response.json", "description": "Response payload for get_signals task" } }, "activate-signal": { "request": { - "$ref": "signals/activate-signal-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/activate-signal-request.json", "description": "Request parameters for activating a signal on a specific platform/account" }, "response": { - "$ref": "signals/activate-signal-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/signals/activate-signal-response.json", "description": "Response payload for activate_signal task" } } @@ -2042,298 +1930,298 @@ "description": "Governance protocol for property governance, brand standards, content standards, and compliance", "supporting-schemas": { "property-feature-definition": { - "$ref": "property/property-feature-definition.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-feature-definition.json", "description": "Definition of a feature that a governance agent can evaluate" }, "property-feature": { - "$ref": "property/property-feature.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-feature.json", "description": "A discrete feature assessment for a property" }, "property-error": { - "$ref": "property/property-error.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-error.json", "description": "Error information for a property that could not be evaluated" }, "property-list": { - "$ref": "property/property-list.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list.json", "description": "A managed property list with optional filters for dynamic evaluation" }, "property-list-filters": { - "$ref": "property/property-list-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list-filters.json", "description": "Filters that dynamically modify a property list when resolved" }, "property-list-changed-webhook": { - "$ref": "property/property-list-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/property-list-changed-webhook.json", "description": "Webhook payload when a property list changes" }, "base-property-source": { - "$ref": "property/base-property-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/base-property-source.json", "description": "A source of properties for a property list - supports publisher+tags, publisher+property_ids, or direct identifiers" }, "collection-list": { - "$ref": "collection/collection-list.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list.json", "description": "A managed collection list with optional filters for dynamic evaluation \u2014 collections represent programs/shows independent of properties" }, "collection-list-filters": { - "$ref": "collection/collection-list-filters.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list-filters.json", "description": "Filters that dynamically modify a collection list when resolved \u2014 content ratings, genres, kinds, production quality" }, "collection-list-changed-webhook": { - "$ref": "collection/collection-list-changed-webhook.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/collection-list-changed-webhook.json", "description": "Webhook payload when a collection list changes" }, "base-collection-source": { - "$ref": "collection/base-collection-source.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/base-collection-source.json", "description": "A source of collections for a collection list - supports distribution_ids, publisher_collections, or publisher_genres" }, "content-standards": { - "$ref": "content-standards/content-standards.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/content-standards.json", "description": "Reusable content standards configuration - defines brand safety/suitability policies with scope, policy, calibration exemplars, and lifecycle dates" }, "content-standards-artifact": { - "$ref": "content-standards/artifact.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/artifact.json", "description": "Content artifact for evaluation or calibration - represents content context where ad placements occur, identified by property_id + artifact_id" }, "artifact-webhook-payload": { - "$ref": "content-standards/artifact-webhook-payload.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/artifact-webhook-payload.json", "description": "Webhook payload for content artifact delivery from sales agents to orchestrators" }, "policy-entry": { - "$ref": "governance/policy-entry.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/policy-entry.json", "description": "A complete policy in the policy registry with natural language text, metadata, and calibration exemplars" }, "policy-ref": { - "$ref": "governance/policy-ref.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/policy-ref.json", "description": "Reference to a registry policy by ID with optional version pin" } }, "tasks": { "create-property-list": { "request": { - "$ref": "property/create-property-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/create-property-list-request.json", "description": "Request parameters for creating a new property list" }, "response": { - "$ref": "property/create-property-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/create-property-list-response.json", "description": "Response payload for create_property_list task" } }, "update-property-list": { "request": { - "$ref": "property/update-property-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/update-property-list-request.json", "description": "Request parameters for updating an existing property list" }, "response": { - "$ref": "property/update-property-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/update-property-list-response.json", "description": "Response payload for update_property_list task" } }, "get-property-list": { "request": { - "$ref": "property/get-property-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/get-property-list-request.json", "description": "Request parameters for retrieving a property list with resolved properties" }, "response": { - "$ref": "property/get-property-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/get-property-list-response.json", "description": "Response payload for get_property_list task" } }, "list-property-lists": { "request": { - "$ref": "property/list-property-lists-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/list-property-lists-request.json", "description": "Request parameters for listing property lists" }, "response": { - "$ref": "property/list-property-lists-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/list-property-lists-response.json", "description": "Response payload for list_property_lists task" } }, "delete-property-list": { "request": { - "$ref": "property/delete-property-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/delete-property-list-request.json", "description": "Request parameters for deleting a property list" }, "response": { - "$ref": "property/delete-property-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/property/delete-property-list-response.json", "description": "Response payload for delete_property_list task" } }, "create-collection-list": { "request": { - "$ref": "collection/create-collection-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/create-collection-list-request.json", "description": "Request parameters for creating a new collection list" }, "response": { - "$ref": "collection/create-collection-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/create-collection-list-response.json", "description": "Response payload for create_collection_list task" } }, "update-collection-list": { "request": { - "$ref": "collection/update-collection-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/update-collection-list-request.json", "description": "Request parameters for updating an existing collection list" }, "response": { - "$ref": "collection/update-collection-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/update-collection-list-response.json", "description": "Response payload for update_collection_list task" } }, "get-collection-list": { "request": { - "$ref": "collection/get-collection-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/get-collection-list-request.json", "description": "Request parameters for retrieving a collection list with resolved collections" }, "response": { - "$ref": "collection/get-collection-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/get-collection-list-response.json", "description": "Response payload for get_collection_list task" } }, "list-collection-lists": { "request": { - "$ref": "collection/list-collection-lists-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/list-collection-lists-request.json", "description": "Request parameters for listing collection lists" }, "response": { - "$ref": "collection/list-collection-lists-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/list-collection-lists-response.json", "description": "Response payload for list_collection_lists task" } }, "delete-collection-list": { "request": { - "$ref": "collection/delete-collection-list-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/delete-collection-list-request.json", "description": "Request parameters for deleting a collection list" }, "response": { - "$ref": "collection/delete-collection-list-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/collection/delete-collection-list-response.json", "description": "Response payload for delete_collection_list task" } }, "list-content-standards": { "request": { - "$ref": "content-standards/list-content-standards-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/list-content-standards-request.json", "description": "Request parameters for listing content standards configurations" }, "response": { - "$ref": "content-standards/list-content-standards-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/list-content-standards-response.json", "description": "Response payload with list of content standards configurations" } }, "get-content-standards": { "request": { - "$ref": "content-standards/get-content-standards-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-content-standards-request.json", "description": "Request parameters for retrieving a specific standards configuration" }, "response": { - "$ref": "content-standards/get-content-standards-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-content-standards-response.json", "description": "Response payload with full standards configuration including policy and calibration data" } }, "create-content-standards": { "request": { - "$ref": "content-standards/create-content-standards-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/create-content-standards-request.json", "description": "Request parameters for creating a new content standards configuration" }, "response": { - "$ref": "content-standards/create-content-standards-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/create-content-standards-response.json", "description": "Response payload with new standards_id" } }, "update-content-standards": { "request": { - "$ref": "content-standards/update-content-standards-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/update-content-standards-request.json", "description": "Request parameters for updating an existing content standards configuration" }, "response": { - "$ref": "content-standards/update-content-standards-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/update-content-standards-response.json", "description": "Response payload confirming update" } }, "calibrate-content": { "request": { - "$ref": "content-standards/calibrate-content-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/calibrate-content-request.json", "description": "Request parameters for collaborative calibration dialogue" }, "response": { - "$ref": "content-standards/calibrate-content-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/calibrate-content-response.json", "description": "Response payload with detailed explanations for policy alignment" } }, "validate-content-delivery": { "request": { - "$ref": "content-standards/validate-content-delivery-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/validate-content-delivery-request.json", "description": "Request parameters for batch validating delivery records" }, "response": { - "$ref": "content-standards/validate-content-delivery-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/validate-content-delivery-response.json", "description": "Response payload with batch validation results" } }, "get-media-buy-artifacts": { "request": { - "$ref": "content-standards/get-media-buy-artifacts-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-media-buy-artifacts-request.json", "description": "Request parameters for retrieving content artifacts from a media buy" }, "response": { - "$ref": "content-standards/get-media-buy-artifacts-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/content-standards/get-media-buy-artifacts-response.json", "description": "Response payload with content artifacts for validation" } }, "get-creative-features": { "request": { - "$ref": "creative/get-creative-features-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-features-request.json", "description": "Request parameters for evaluating creative features from a governance agent" }, "response": { - "$ref": "creative/get-creative-features-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/creative/get-creative-features-response.json", "description": "Response payload with feature values for the evaluated creative" } }, "sync-plans": { "request": { - "$ref": "governance/sync-plans-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/sync-plans-request.json", "description": "Push campaign plans to the governance agent" }, "response": { - "$ref": "governance/sync-plans-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/sync-plans-response.json", "description": "Sync result with active validation categories and resolved policies per plan" } }, "report-plan-outcome": { "request": { - "$ref": "governance/report-plan-outcome-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-outcome-request.json", "description": "Report the outcome of an action to the governance agent" }, "response": { - "$ref": "governance/report-plan-outcome-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-outcome-response.json", "description": "Outcome acceptance status with budget impact and findings" } }, "report-plan-adjustment": { "request": { - "$ref": "governance/report-plan-adjustment-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-adjustment-request.json", "description": "Seller-authenticated append-only commitment adjustment report" }, "response": { - "$ref": "governance/report-plan-adjustment-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/report-plan-adjustment-response.json", "description": "Accepted adjustment with gross, restored-headroom, and net budget state" } }, "get-plan-audit-logs": { "request": { - "$ref": "governance/get-plan-audit-logs-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/get-plan-audit-logs-request.json", "description": "Retrieve governance state and audit trail for a plan" }, "response": { - "$ref": "governance/get-plan-audit-logs-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/get-plan-audit-logs-response.json", "description": "Plan state with budget tracking, validation history, and compliance summary" } }, "check-governance": { "request": { - "$ref": "governance/check-governance-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/check-governance-request.json", "description": "Orchestrator or seller calls the governance agent to validate an action against the campaign plan" }, "response": { - "$ref": "governance/check-governance-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/governance/check-governance-response.json", "description": "Governance decision with findings and conditions" } } @@ -2344,41 +2232,41 @@ "tasks": { "get-adcp-capabilities": { "request": { - "$ref": "protocol/get-adcp-capabilities-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-adcp-capabilities-request.json", "description": "Request parameters for cross-protocol capability discovery" }, "response": { - "$ref": "protocol/get-adcp-capabilities-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json", "description": "Response payload for get_adcp_capabilities task - includes AdCP version, supported protocols, and protocol-specific capabilities (media_buy, signals, etc.)" } }, "get-task-status": { "request": { - "$ref": "protocol/get-task-status-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-task-status-request.json", "description": "Request parameters for get_task_status, the 3.x AdCP application-layer alias for legacy tasks/get polling; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "protocol/get-task-status-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/get-task-status-response.json", "description": "AdCP application-layer task status, metadata, and optional completion result; alias response for legacy tasks/get" } }, "list-tasks": { "request": { - "$ref": "protocol/list-tasks-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/list-tasks-request.json", "description": "Request parameters for list_tasks, the 3.x AdCP application-layer alias for legacy tasks/list reconciliation; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "protocol/list-tasks-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/list-tasks-response.json", "description": "Filtered AdCP application-layer async task list for reconciliation; alias response for legacy tasks/list" } }, "sync-agent-notification-configs": { "request": { - "$ref": "protocol/sync-agent-notification-configs-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/sync-agent-notification-configs-request.json", "description": "Register, replace, pause, or clear agent-level webhook subscribers such as capabilities.changed" }, "response": { - "$ref": "protocol/sync-agent-notification-configs-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/protocol/sync-agent-notification-configs-response.json", "description": "Applied agent-level webhook subscriber set with credentials redacted" } } @@ -2388,68 +2276,68 @@ "description": "Sponsored Intelligence Protocol for conversational brand experiences in AI assistants", "supporting-schemas": { "si-capabilities": { - "$ref": "sponsored-intelligence/si-capabilities.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-capabilities.json", "description": "Capability categories that brand or host can support (modalities, components, commerce)" }, "si-identity": { - "$ref": "sponsored-intelligence/si-identity.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-identity.json", "description": "User identity with explicit consent for personalized brand experiences" }, "si-ui-element": { - "$ref": "sponsored-intelligence/si-ui-element.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-ui-element.json", "description": "Standard visual components (text, link, image, product_card, carousel, action_button, app_handoff)" }, "si-context-use": { - "$ref": "sponsored-intelligence/si-context-use.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-context-use.json", "description": "Declared host-side use mode for sponsored context entering an SI boundary" }, "si-sponsored-context": { - "$ref": "sponsored-intelligence/si-sponsored-context.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-sponsored-context.json", "description": "Declaration linking paying principal, context use, and disclosure obligation for sponsored context" }, "si-sponsored-context-receipt": { - "$ref": "sponsored-intelligence/si-sponsored-context-receipt.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-sponsored-context-receipt.json", "description": "Host receipt recording accepted use mode and disclosure commitment for sponsored context" } }, "tasks": { "si-get-offering": { "request": { - "$ref": "sponsored-intelligence/si-get-offering-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-get-offering-request.json", "description": "Get offering details, availability, and optionally matching products before session handoff" }, "response": { - "$ref": "sponsored-intelligence/si-get-offering-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-get-offering-response.json", "description": "Offering details, availability status, matching products, and token for session correlation" } }, "si-initiate-session": { "request": { - "$ref": "sponsored-intelligence/si-initiate-session-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-initiate-session-request.json", "description": "Host initiates SI session with brand agent - includes context, identity, and capability negotiation" }, "response": { - "$ref": "sponsored-intelligence/si-initiate-session-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-initiate-session-response.json", "description": "Brand agent's response with session ID, initial message, UI elements, and negotiated capabilities" } }, "si-send-message": { "request": { - "$ref": "sponsored-intelligence/si-send-message-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-send-message-request.json", "description": "Send a message within an active SI session" }, "response": { - "$ref": "sponsored-intelligence/si-send-message-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-send-message-response.json", "description": "Brand agent's response to the message, including session status and potential handoff" } }, "si-terminate-session": { "request": { - "$ref": "sponsored-intelligence/si-terminate-session-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-terminate-session-request.json", "description": "Terminate an SI session with reason (handoff_transaction, handoff_complete, user_exit, session_timeout, host_terminated)" }, "response": { - "$ref": "sponsored-intelligence/si-terminate-session-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/sponsored-intelligence/si-terminate-session-response.json", "description": "Termination confirmation with optional ACP handoff or follow-up data" } } @@ -2457,13 +2345,13 @@ }, "adagents": { "description": "Agent authorization file format specification for publishers and data providers", - "$ref": "adagents.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/adagents.json", "file_location": "/.well-known/adagents.json", "purpose": "Declares authorized agents. Publishers use it for sales agent authorization over properties. Data providers use it to publish signal definitions and authorize signals agents to resell their data." }, "brand": { "description": "Brand identity claim file format specification", - "$ref": "brand.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand.json", "file_location": "/.well-known/brand.json", "purpose": "Declares brand identity and agent for a domain, enabling brand discovery and verification" }, @@ -2471,64 +2359,64 @@ "description": "Trusted Match Protocol (TMP) \u2014 real-time execution layer for activating pre-negotiated packages across any surface. Conformance invariants are normative in docs/trusted-match/specification.mdx; the cap-fire boundary contract is at docs/trusted-match/identity-match-implementation.mdx; a non-normative impression-tracker implementation reference (multi-identity dedup, fcap_keys labels, log-based data model, SDK primitives) is at docs/trusted-match/impression-tracker-implementation.mdx. Storage backend is an implementation choice; conformant services may use any store that satisfies the invariants.", "supporting-schemas": { "available-package": { - "$ref": "trusted-match/available-package.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/available-package.json", "description": "A package available for contextual matching on a given impression opportunity" }, "offer": { - "$ref": "trusted-match/offer.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/offer.json", "description": "Buyer's response to a context match \u2014 ranges from simple activation (package_id only) to rich offers with brand, price, summary, and creative manifest" }, "offer-price": { - "$ref": "trusted-match/offer-price.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/offer-price.json", "description": "Lightweight price for variable-priced offers" }, "error": { - "$ref": "trusted-match/error.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/error.json", "description": "Error response from a TMP provider or router when a request cannot be processed" }, "provider-registration": { - "$ref": "trusted-match/provider-registration.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-registration.json", "description": "TMP provider registration \u2014 endpoint, capabilities, and operational parameters for router configuration" }, "provider-context-match-response": { - "$ref": "trusted-match/provider-context-match-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-context-match-response.json", "description": "Provider-to-router Context Match response shape \u2014 carries provider-local targeting key-values and forbids router-authored attribution buckets" }, "provider-identity-match-response": { - "$ref": "trusted-match/provider-identity-match-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/provider-identity-match-response.json", "description": "Provider-to-router Identity Match response shape \u2014 carries ordered TMPX `{slot_id, value}` chunks with no publisher-local names" }, "publisher-targeting-kv-config": { - "$ref": "trusted-match/publisher-targeting-kv-config.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/publisher-targeting-kv-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, provider-local targeting key) to the ad-server targeting destination for that surface" }, "publisher-tmpx-config": { - "$ref": "trusted-match/publisher-tmpx-config.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/publisher-tmpx-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, slot_id) to the ad-server macro name, GAM key-value, VAST substitution, or play-log field for that surface" }, "tmpx-chunk": { - "$ref": "trusted-match/tmpx-chunk.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/tmpx-chunk.json", "description": "A single TMPX chunk \u2014 provider-local slot_id and opaque URL-safe value; shared between provider\u2192router and router\u2192publisher hops" } }, "operations": { "context-match": { "request": { - "$ref": "trusted-match/context-match-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/context-match-request.json", "description": "Evaluate available packages against content context. Contains no user identity." }, "response": { - "$ref": "trusted-match/context-match-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/context-match-response.json", "description": "Router-to-publisher offers for matched packages with provider-attributed targeting signals" } }, "identity-match": { "request": { - "$ref": "trusted-match/identity-match-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/identity-match-request.json", "description": "Evaluate user eligibility for packages using an opaque identity token. Contains no page context." }, "response": { - "$ref": "trusted-match/identity-match-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/trusted-match/identity-match-response.json", "description": "Per-package eligibility \u2014 boolean eligible plus optional intent score" } } @@ -2538,88 +2426,88 @@ "description": "Brand protocol for identity retrieval, rights discovery, acquisition, and lifecycle management", "supporting-schemas": { "rights-pricing-option": { - "$ref": "brand/rights-pricing-option.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/rights-pricing-option.json", "description": "Pricing option for licensable rights" }, "rights-terms": { - "$ref": "brand/rights-terms.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/rights-terms.json", "description": "Terms returned with a rights grant \u2014 coverage, restrictions, revocation, and credentials" }, "creative-approval-request": { - "$ref": "brand/creative-approval-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/creative-approval-request.json", "description": "Payload the buyer submits to the approval_webhook from acquire_rights for rights-holder creative review" }, "creative-approval-response": { - "$ref": "brand/creative-approval-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/creative-approval-response.json", "description": "Response from the approval_webhook \u2014 approved, rejected, or pending_review" }, "revocation-notification": { - "$ref": "brand/revocation-notification.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/revocation-notification.json", "description": "Notification sent to the buyer's revocation_webhook when an acquired rights grant is revoked" }, "verification-status": { - "$ref": "brand/verification-status.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verification-status.json", "description": "Shared status enum returned by verify_brand_claim \u2014 owned, pending_review, transferring, disputed, not_ours, archived, licensed_in, licensed_out, unknown" } }, "tasks": { "get-brand-identity": { "request": { - "$ref": "brand/get-brand-identity-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-brand-identity-request.json", "description": "Request parameters for retrieving brand identity data from a brand agent" }, "response": { - "$ref": "brand/get-brand-identity-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-brand-identity-response.json", "description": "Response payload for get_brand_identity task" } }, "verify-brand-claim": { "request": { - "$ref": "brand/verify-brand-claim-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claim-request.json", "description": "Request parameters for verifying a single brand claim (subsidiary / parent / property / trademark, discriminated by claim_type)" }, "response": { - "$ref": "brand/verify-brand-claim-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claim-response.json", "description": "Response payload for verify_brand_claim task \u2014 claim_type echoed, status from the shared VerificationStatus enum, per-claim-type details" } }, "verify-brand-claims": { "request": { - "$ref": "brand/verify-brand-claims-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claims-request.json", "description": "Request parameters for bulk verification \u2014 claims[] array (max 100), each entry shaped like a single verify_brand_claim request" }, "response": { - "$ref": "brand/verify-brand-claims-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/verify-brand-claims-response.json", "description": "Response payload for verify_brand_claims task \u2014 results[] positionally aligned with the request's claims[], per-result success or error inline" } }, "get-rights": { "request": { - "$ref": "brand/get-rights-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-rights-request.json", "description": "Request parameters for searching licensable rights with pricing" }, "response": { - "$ref": "brand/get-rights-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/get-rights-response.json", "description": "Response payload for get_rights task" } }, "acquire-rights": { "request": { - "$ref": "brand/acquire-rights-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/acquire-rights-request.json", "description": "Request parameters for acquiring rights with contractual clearance" }, "response": { - "$ref": "brand/acquire-rights-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/acquire-rights-response.json", "description": "Response payload for acquire_rights task \u2014 terms and generation credentials" } }, "update-rights": { "request": { - "$ref": "brand/update-rights-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/update-rights-request.json", "description": "Request parameters for modifying an active rights grant \u2014 dates, caps, pricing, or pause/resume" }, "response": { - "$ref": "brand/update-rights-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/brand/update-rights-response.json", "description": "Response payload for update_rights task" } } @@ -2628,11 +2516,11 @@ "extensions": { "description": "Typed extension schemas for vendor-specific or domain-specific data. Extensions define the structure of data within the ext.{namespace} field. Agents declare which extensions they support in their agent card.", "registry": { - "$ref": "extensions/index.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/extensions/index.json", "description": "Auto-generated registry of all available extensions with metadata" }, "meta": { - "$ref": "extensions/extension-meta.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/extensions/extension-meta.json", "description": "Schema that all extension files must follow. Defines valid_from, valid_until, and extension data structure." }, "schemas": {} @@ -2641,18 +2529,18 @@ "description": "Compliance testing tool schemas. The test controller is an optional sandbox-only tool that lets comply walk full lifecycle state machines by triggering seller-side transitions deterministically.", "supporting-schemas": { "task-completion-data": { - "$ref": "compliance/task-completion-data.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/task-completion-data.json", "description": "Bounded force_task_completion result union for supported legacy async scenarios" } }, "tasks": { "comply-test-controller": { "request": { - "$ref": "compliance/comply-test-controller-request.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/comply-test-controller-request.json", "description": "Request payload for the comply_test_controller tool \u2014 scenario selection and scenario-specific params" }, "response": { - "$ref": "compliance/comply-test-controller-response.json", + "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/compliance/comply-test-controller-response.json", "description": "Response payload \u2014 state transition results, simulation results, scenario list, or structured errors" } } @@ -2682,5 +2570,5 @@ "code": "// Use everit-org/json-schema or similar library" } ], - "published_version": "3.2.0-beta.8" + "published_version": "3.2.0-beta.6" } \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json deleted file mode 100644 index fe8fd47ca..000000000 --- a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-request.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Get Reporting Status Request", - "x-status": "experimental", - "x-tool-summary": "Check reporting health, enumerate expected periods and all retained revisions, or resolve one exact reporting revision.", - "description": "Authoritative caller/account-isolated reporting reliability read. The authenticated caller identity comes only from transport authentication, never request fields. summary answers the operational question for independently selected delivery configurations/feeds; periods returns a cursor-paginated obligation ledger; revision resolves one exact retained revision and its materializations/resources. Unknown, unauthorized, cross-caller, and cross-account identifiers MUST be indistinguishable. Sellers implementing this task MUST advertise media_buy.reporting_delivery in experimental_features.", - "type": "object", - "allOf": [ - { - "$ref": "../core/version-envelope.json" - }, - { - "if": { - "properties": { - "view": { - "const": "summary" - } - }, - "required": [ - "view" - ] - }, - "then": { - "not": { - "anyOf": [ - { - "required": [ - "reporting_revision_id" - ] - }, - { - "required": [ - "pagination" - ] - }, - { - "required": [ - "health" - ] - } - ] - } - } - }, - { - "if": { - "properties": { - "view": { - "const": "periods" - } - }, - "required": [ - "view" - ] - }, - "then": { - "not": { - "required": [ - "reporting_revision_id" - ] - } - } - }, - { - "if": { - "properties": { - "view": { - "const": "revision" - } - }, - "required": [ - "view" - ] - }, - "then": { - "required": [ - "reporting_revision_id" - ], - "not": { - "anyOf": [ - { - "required": [ - "media_buy_ids" - ] - }, - { - "required": [ - "delivery_config_ids" - ] - }, - { - "required": [ - "feed_purposes" - ] - }, - { - "required": [ - "period" - ] - }, - { - "required": [ - "health" - ] - }, - { - "required": [ - "finality" - ] - } - ] - } - } - } - ], - "x-mutates-state": false, - "properties": { - "account": { - "$ref": "../core/canonical-account-ref.json", - "description": "Account whose caller-owned reporting status is queried." - }, - "view": { - "type": "string", - "enum": [ - "summary", - "periods", - "revision" - ], - "description": "Stable response-shape discriminator. SDK convenience methods may default this to summary, but the wire request is explicit." - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "minItems": 1, - "maxItems": 100, - "uniqueItems": true, - "description": "Optional summary/periods scope. Omit for every accessible media buy in the account." - }, - "delivery_config_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[A-Za-z0-9_.:-]{1,64}$", - "x-entity": "reporting_delivery_config" - }, - "minItems": 1, - "maxItems": 16, - "uniqueItems": true, - "description": "Optional summary/periods scope. Use to reconcile billing, analytics, and pacing independently. Omit for every active caller-owned configuration." - }, - "feed_purposes": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate." - }, - "period": { - "type": "object", - "description": "Half-open summary/periods horizon. Omit for the seller's documented operational default horizon; the response always echoes the evaluated scope.", - "properties": { - "start": { - "type": "string", - "format": "date-time" - }, - "end": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "start", - "end" - ], - "additionalProperties": false - }, - "health": { - "type": "array", - "items": { - "$ref": "../enums/reporting-health.json" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Periods-view result filter only; it never changes summary health." - }, - "finality": { - "type": "array", - "items": { - "$ref": "../enums/reporting-finality.json" - }, - "minItems": 1, - "uniqueItems": true - }, - "reporting_revision_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{1,255}$", - "x-entity": "reporting_revision", - "description": "Exact retained revision to resolve in revision view." - }, - "pagination": { - "$ref": "../core/pagination-request.json", - "description": "Periods or revision-view pagination. Cursors are bound to the authenticated caller, account, filters, and ledger snapshot." - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } - }, - "required": [ - "account", - "view" - ] -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json b/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json deleted file mode 100644 index f936d20d2..000000000 --- a/schemas/cache/3.2.0-beta.6/media-buy/get-reporting-status-response.json +++ /dev/null @@ -1,758 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Get Reporting Status Response", - "x-status": "experimental", - "description": "Authoritative caller/account-isolated reporting status response. The view echoes the request and discriminates summary, periods, exact revision, and fatal error shapes. Every identifier, cursor, ledger snapshot, destination, revision, materialization, and resource is scoped to the authenticated caller and account.", - "type": "object", - "allOf": [ - { - "$ref": "../core/version-envelope.json" - }, - { - "$ref": "../core/protocol-envelope.json" - }, - { - "if": { - "properties": { - "health": { - "const": "complete" - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "scope": { - "properties": { - "scope_closed": { - "const": true - }, - "coverage_complete": { - "const": true - } - }, - "required": [ - "scope_closed", - "coverage_complete" - ] - } - }, - "not": { - "required": [ - "next_expected_at" - ] - } - } - }, - { - "if": { - "properties": { - "health": { - "const": "action_required" - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "issues": { - "minItems": 1, - "contains": { - "properties": { - "severity": { - "const": "action_required" - } - }, - "required": [ - "severity" - ] - } - } - }, - "required": [ - "issues" - ] - } - }, - { - "if": { - "properties": { - "health": { - "const": "delayed" - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "issues": { - "minItems": 1, - "items": { - "properties": { - "severity": { - "const": "delayed" - } - } - } - } - }, - "required": [ - "issues" - ] - } - }, - { - "if": { - "properties": { - "health": { - "enum": [ - "healthy", - "waiting", - "complete" - ] - } - }, - "required": [ - "health" - ] - }, - "then": { - "properties": { - "issues": { - "maxItems": 0 - } - }, - "required": [ - "issues" - ] - } - }, - { - "if": { - "properties": { - "scope": { - "properties": { - "coverage_complete": { - "const": false - } - }, - "required": [ - "coverage_complete" - ] - } - }, - "required": [ - "scope" - ] - }, - "then": { - "properties": { - "health": { - "const": "action_required" - }, - "issues": { - "minItems": 1, - "contains": { - "properties": { - "code": { - "const": "HISTORY_UNAVAILABLE" - }, - "severity": { - "const": "action_required" - } - }, - "required": [ - "code", - "severity" - ] - } - } - }, - "required": [ - "issues" - ] - } - } - ], - "properties": { - "view": { - "type": "string", - "enum": [ - "summary", - "periods", - "revision" - ] - }, - "ledger_snapshot_id": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "description": "Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value." - }, - "ledger_as_of": { - "type": "string", - "format": "date-time", - "description": "Exclusive observation boundary for ledger_snapshot_id. Revisions committed later appear only in a later reconciliation." - }, - "account_id": { - "type": "string", - "minLength": 1, - "x-entity": "account", - "description": "Resolved seller/storefront account identifier." - }, - "scope": { - "type": "object", - "description": "Exact denominator evaluated for summary or periods health. complete is valid only when scope_closed is true.", - "properties": { - "period_start": { - "type": "string", - "format": "date-time" - }, - "period_end": { - "type": "string", - "format": "date-time" - }, - "scope_closed": { - "type": "boolean", - "description": "True only when no new obligation can enter this evaluated scope." - }, - "media_buy_ids": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "media_buy" - }, - "uniqueItems": true - }, - "all_accessible_media_buys": { - "type": "boolean", - "description": "True when media_buy_ids was omitted and the scope covers all caller-accessible account buys." - }, - "delivery_config_generations": { - "type": "array", - "description": "Exact independently reconciled configuration generations in the denominator.", - "items": { - "type": "object", - "properties": { - "delivery_config_id": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "x-entity": "reporting_delivery_config" - }, - "delivery_config_version": { - "type": "integer", - "minimum": 1 - }, - "feed_purpose": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - } - }, - "required": [ - "delivery_config_id", - "delivery_config_version", - "feed_purpose" - ], - "additionalProperties": false - }, - "minItems": 1 - }, - "feed_purposes": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "pacing", - "analytics", - "billing" - ] - }, - "minItems": 1, - "uniqueItems": true - }, - "finality": { - "type": "array", - "items": { - "$ref": "../enums/reporting-finality.json" - }, - "minItems": 1, - "uniqueItems": true - }, - "ledger_retained_from": { - "type": "string", - "format": "date-time", - "description": "Earliest period boundary for which anti-entropy metadata is retained for every selected configuration generation." - }, - "coverage_complete": { - "type": "boolean", - "description": "Whether the requested horizon is fully inside retained ledger coverage. False means health cannot prove completeness for the whole requested horizon." - } - }, - "required": [ - "period_start", - "period_end", - "scope_closed", - "all_accessible_media_buys", - "delivery_config_generations", - "feed_purposes", - "finality", - "ledger_retained_from", - "coverage_complete" - ], - "allOf": [ - { - "if": { - "properties": { - "all_accessible_media_buys": { - "const": false - } - }, - "required": [ - "all_accessible_media_buys" - ] - }, - "then": { - "required": [ - "media_buy_ids" - ] - } - } - ], - "additionalProperties": false - }, - "health": { - "$ref": "../enums/reporting-health.json" - }, - "data_through": { - "type": [ - "string", - "null" - ], - "format": "date-time", - "description": "Conservative latest included event time across satisfied obligations in scope, or null when unavailable/unknown." - }, - "next_expected_at": { - "type": "string", - "format": "date-time", - "description": "Next obligation due time for an open scope. Omitted for a closed complete scope." - }, - "obligation_counts": { - "type": "object", - "properties": { - "total": { - "type": "integer", - "minimum": 0 - }, - "waiting": { - "type": "integer", - "minimum": 0 - }, - "healthy": { - "type": "integer", - "minimum": 0 - }, - "delayed": { - "type": "integer", - "minimum": 0 - }, - "action_required": { - "type": "integer", - "minimum": 0 - }, - "complete": { - "type": "integer", - "minimum": 0 - } - }, - "required": [ - "total", - "waiting", - "healthy", - "delayed", - "action_required", - "complete" - ], - "additionalProperties": false - }, - "issues": { - "type": "array", - "items": { - "$ref": "../core/reporting-status-issue.json" - } - }, - "periods": { - "type": "array", - "items": { - "$ref": "../core/reporting-obligation.json" - } - }, - "revisions": { - "type": "array", - "items": { - "$ref": "../core/reporting-revision.json" - }, - "description": "Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, materializations, and receipts, avoiding unbounded nested history." - }, - "pagination": { - "$ref": "../core/pagination-response.json" - }, - "revision": { - "$ref": "../core/reporting-revision.json" - }, - "materializations": { - "type": "array", - "items": { - "$ref": "../core/reporting-materialization.json" - } - }, - "receipts": { - "type": "array", - "items": { - "$ref": "../core/reporting-receipt.json" - }, - "description": "Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." - }, - "errors": { - "type": "array", - "items": { - "$ref": "../core/error.json" - } - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } - }, - "oneOf": [ - { - "title": "Successful lookup", - "properties": { - "status": { - "type": "string", - "const": "completed" - } - }, - "required": [ - "status" - ], - "oneOf": [ - { - "title": "Summary view", - "properties": { - "view": { - "type": "string", - "const": "summary" - } - }, - "required": [ - "view", - "ledger_snapshot_id", - "ledger_as_of", - "account_id", - "scope", - "health", - "data_through", - "obligation_counts", - "issues" - ], - "not": { - "anyOf": [ - { - "required": [ - "periods" - ] - }, - { - "required": [ - "revisions" - ] - }, - { - "required": [ - "pagination" - ] - }, - { - "required": [ - "revision" - ] - }, - { - "required": [ - "materializations" - ] - }, - { - "required": [ - "receipts" - ] - } - ] - } - }, - { - "title": "Periods view", - "properties": { - "view": { - "type": "string", - "const": "periods" - }, - "pagination": { - "required": [ - "has_more", - "total_count" - ] - } - }, - "required": [ - "view", - "ledger_snapshot_id", - "ledger_as_of", - "account_id", - "scope", - "periods", - "revisions", - "materializations", - "receipts", - "pagination" - ], - "not": { - "required": [ - "revision" - ] - } - }, - { - "title": "Revision view", - "properties": { - "view": { - "type": "string", - "const": "revision" - }, - "pagination": { - "required": [ - "has_more", - "total_count" - ] - } - }, - "required": [ - "view", - "ledger_snapshot_id", - "ledger_as_of", - "account_id", - "revision", - "materializations", - "receipts", - "pagination" - ], - "not": { - "anyOf": [ - { - "required": [ - "scope" - ] - }, - { - "required": [ - "health" - ] - }, - { - "required": [ - "periods" - ] - }, - { - "required": [ - "revisions" - ] - } - ] - } - } - ] - }, - { - "title": "Failed lookup", - "properties": { - "status": { - "type": "string", - "const": "failed" - } - }, - "required": [ - "status" - ], - "oneOf": [ - { - "title": "Unavailable lookup", - "type": "object", - "properties": { - "adcp_version": { - "type": "string" - }, - "adcp_major_version": { - "type": "integer" - }, - "status": { - "type": "string", - "const": "failed" - }, - "view": { - "enum": [ - "summary", - "periods", - "revision" - ] - }, - "failure_kind": { - "type": "string", - "const": "lookup_unavailable" - }, - "context_id": { - "type": "string" - }, - "context": { - "$ref": "../core/context.json" - }, - "message": { - "const": "Reporting status resource is unavailable." - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "replayed": { - "type": "boolean" - }, - "adcp_error": { - "type": "object", - "properties": { - "code": { - "const": "NOT_FOUND" - }, - "message": { - "const": "Reporting status resource is unavailable." - } - }, - "required": [ - "code", - "message" - ], - "additionalProperties": false - }, - "errors": { - "type": "array", - "minItems": 1, - "maxItems": 1, - "items": { - "type": "object", - "properties": { - "code": { - "const": "NOT_FOUND" - }, - "message": { - "const": "Reporting status resource is unavailable." - } - }, - "required": [ - "code", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "status", - "view", - "failure_kind", - "errors" - ], - "additionalProperties": false - }, - { - "title": "Operational failure", - "type": "object", - "properties": { - "adcp_version": { - "type": "string" - }, - "adcp_major_version": { - "type": "integer" - }, - "status": { - "type": "string", - "const": "failed" - }, - "view": { - "enum": [ - "summary", - "periods", - "revision" - ] - }, - "failure_kind": { - "type": "string", - "const": "operational" - }, - "context_id": { - "type": "string" - }, - "context": { - "$ref": "../core/context.json" - }, - "message": { - "type": "string" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "replayed": { - "type": "boolean" - }, - "adcp_error": { - "$ref": "../core/error.json" - }, - "errors": { - "type": "array", - "items": { - "$ref": "../core/error.json" - }, - "minItems": 1 - } - }, - "required": [ - "status", - "view", - "failure_kind", - "errors" - ], - "additionalProperties": false - } - ] - } - ], - "x-adcp-validation": { - "caller_isolation": "Derive caller identity only from authenticated transport. Every account, configuration generation, cursor, ledger snapshot, revision, materialization, resource, and destination must belong to that caller/account; unknown and unauthorized identifiers must use the identical lookup_unavailable shape. operational failures MUST NOT be used for identifier resolution or authorization failures.", - "snapshot_consistency": "All pages reached from a cursor MUST preserve ledger_snapshot_id and ledger_as_of. A cursor is unusable by another caller or account.", - "resource_retention": "A complete obligation must retain at least one readable verified exact materialization through its resource_retained_until. Metadata retention does not imply resource readability after that boundary." - }, - "additionalProperties": true -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json b/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json deleted file mode 100644 index 9e0d4ba48..000000000 --- a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-response.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Sync Reporting Receipts Response", - "x-status": "experimental", - "description": "Per-receipt durable recording results. Successful readback lets a consumer prove the seller recorded its reconciliation outcome; failed results expose no cross-caller or cross-account resource metadata.", - "type": "object", - "allOf": [ - { - "$ref": "../core/version-envelope.json" - }, - { - "$ref": "../core/protocol-envelope.json" - } - ], - "properties": { - "status": { - "type": "string", - "const": "completed", - "description": "Receipt batches complete synchronously with one result per submitted receipt." - }, - "results": { - "type": "array", - "items": { - "oneOf": [ - { - "title": "Recorded reporting receipt", - "type": "object", - "properties": { - "result": { - "type": "string", - "const": "recorded" - }, - "receipt": { - "allOf": [ - { - "$ref": "../core/reporting-receipt.json" - }, - { - "required": [ - "received_at" - ] - } - ] - } - }, - "required": [ - "result", - "receipt" - ], - "additionalProperties": false - }, - { - "title": "Unchanged reporting receipt", - "type": "object", - "properties": { - "result": { - "type": "string", - "const": "unchanged" - }, - "receipt": { - "allOf": [ - { - "$ref": "../core/reporting-receipt.json" - }, - { - "required": [ - "received_at" - ] - } - ] - } - }, - "required": [ - "result", - "receipt" - ], - "additionalProperties": false - }, - { - "title": "Failed reporting receipt", - "type": "object", - "properties": { - "result": { - "type": "string", - "const": "failed" - }, - "reporting_receipt_id": { - "type": "string", - "minLength": 16, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{16,255}$", - "x-entity": "reporting_receipt" - }, - "errors": { - "type": "array", - "items": { - "$ref": "../core/error.json" - }, - "minItems": 1, - "maxItems": 16 - } - }, - "required": [ - "result", - "reporting_receipt_id", - "errors" - ], - "additionalProperties": false - } - ] - }, - "minItems": 1, - "maxItems": 100 - }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } - }, - "required": [ - "status", - "results" - ], - "additionalProperties": true -} \ No newline at end of file diff --git a/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json b/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json index 0fd4beb85..6e7db0871 100644 --- a/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json +++ b/schemas/cache/3.2.0-beta.6/protocol/get-adcp-capabilities-response.json @@ -84,66 +84,6 @@ ] } }, - { - "if": { - "properties": { - "media_buy": { - "required": [ - "reporting_delivery" - ] - } - }, - "required": [ - "media_buy" - ] - }, - "then": { - "properties": { - "experimental_features": { - "contains": { - "const": "media_buy.reporting_delivery" - } - } - }, - "required": [ - "experimental_features" - ] - } - }, - { - "if": { - "properties": { - "media_buy": { - "required": [ - "reporting_delivery" - ] - } - }, - "required": [ - "media_buy" - ] - }, - "then": { - "required": [ - "webhook_signing" - ], - "properties": { - "webhook_signing": { - "properties": { - "supported": { - "const": true - } - }, - "required": [ - "supported", - "profile", - "algorithms", - "legacy_hmac_fallback" - ] - } - } - } - }, { "if": { "allOf": [ @@ -1219,11 +1159,6 @@ "minItems": 1, "uniqueItems": true }, - "reporting_delivery": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.6/core/reporting-delivery-capabilities.json", - "x-status": "experimental", - "description": "Managed reporting status and durable delivery capability. Presence requires media_buy.reporting_delivery in experimental_features. This generalizes, but does not remove, the legacy reporting_delivery_methods/offline_delivery_protocols surface." - }, "performance_feedback": { "type": "object", "x-status": "experimental", diff --git a/schemas/cache/3.2.0-beta.9/account/sync-accounts-request.json b/schemas/cache/3.2.0-beta.9/account/sync-accounts-request.json index 081d8125b..8466d464d 100644 --- a/schemas/cache/3.2.0-beta.9/account/sync-accounts-request.json +++ b/schemas/cache/3.2.0-beta.9/account/sync-accounts-request.json @@ -1,19 +1,20 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/account/sync-accounts-request.json", "title": "Sync Accounts Request", "description": "Sync advertiser account state with a seller. Two modes, distinguished by the key on each per-account entry:\n\n- **Provisioning mode** (`brand` + `operator` + `billing` at the entry root): the agent declares the advertiser identity, operator, optional operator-owned buying unit, optional fixed account currency, conditionally required buyer-selected account timezone, sandbox disposition, and billing model. The seller provisions or links the corresponding advertiser object via upsert. `brand.countries`, `operator_unit.id`, `currency`, buyer-selected `timezone`, and `sandbox` participate in the buyer-declared natural key when present; `operator_unit.name` is display metadata only. The seller MAY echo a seller-assigned account_id but MUST continue accepting the complete natural-key AccountRef.\n\n- **Settings-update mode** (`account` field carrying an [`AccountRef`](/schemas/core/account-ref.json)): targets an existing account by seller/storefront `account_id` or buyer-declared natural key. The seller updates settable state without provisioning side effects. A complete `operator_identity` value reconciles the existing account to the buyer's desired operator domain and optional operator unit; omission leaves identity unchanged.\n\nExactly one key shape is allowed per entry. Sellers that do not implement one mode return `UNSUPPORTED_PROVISIONING` for that mode. Identity reconciliation is additionally gated by `get_adcp_capabilities.account.identity_updates`.", "x-tool-summary": "Provision advertiser accounts or update settings for existing accounts through declarative synchronization.", "type": "object", "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/version-envelope.json" + "$ref": "/schemas/core/version-envelope.json" } ], "x-mutates-state": true, "properties": { "idempotency_key": { "type": "string", - "description": "Client-generated unique key for at-most-once execution. Natural per-account upsert keys 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 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}$" @@ -23,11 +24,11 @@ "description": "Per-account sync entries. Each entry uses one of two key shapes: the `account` field (AccountRef) for settings-update mode, or the flat `brand` + `operator` + `billing` trio for provisioning mode. An operator_identity settings update MUST carry the latest account revision.", "items": { "type": "object", - "description": "An advertiser account entry \u2014 either provisions/upserts a new account (natural key) or updates an existing one (AccountRef key).", + "description": "An advertiser account entry — either provisions/upserts a new account (natural key) or updates an existing one (AccountRef key).", "properties": { "account": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-ref.json", - "description": "Settings-update key. When present, this entry targets an existing account by `account_id` (seller-owned account namespace) or natural key (buyer-declared account settings-update against a previously-provisioned account). Mutually exclusive with the flat `brand` + `operator` + `billing` provisioning trio. When `account` is present, the seller MUST NOT create a new account \u2014 entries that would otherwise trigger provisioning are rejected with `UNSUPPORTED_PROVISIONING`." + "$ref": "/schemas/core/account-ref.json", + "description": "Settings-update key. When present, this entry targets an existing account by `account_id` (seller-owned account namespace) or natural key (buyer-declared account settings-update against a previously-provisioned account). Mutually exclusive with the flat `brand` + `operator` + `billing` provisioning trio. When `account` is present, the seller MUST NOT create a new account — entries that would otherwise trigger provisioning are rejected with `UNSUPPORTED_PROVISIONING`." }, "revision": { "type": "integer", @@ -35,16 +36,16 @@ "description": "Expected current account revision for optimistic concurrency in settings-update mode. Required whenever operator_identity is present; optional for existing non-identity settings updates. The seller MUST compare it atomically with the write, reject a mismatch with CONFLICT, and leave the account unchanged. Obtain it from list_accounts or the most recent sync_accounts result. Reads, dry runs, validation failures, and exact idempotency replays do not increment revision; every persisted settings or identity-change state transition does. MUST be absent in provisioning mode." }, "operator_identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/operator-identity.json", + "$ref": "/schemas/core/operator-identity.json", "description": "Complete desired operator identity for settings-update mode. Omit this field to leave operator identity unchanged. When present, omission of operator_unit within the object removes the existing unit. Changing only operator_unit.name updates display metadata; changing operator_unit.id or adding/removing a unit rekeys the same account within the current operator. Changing operator requests an inter-entity handoff and MUST enter pending_approval until the seller verifies the current account authority, verified brand authorization, destination-operator acceptance, and any operator-scoped billing and grant transition. The seller MUST preserve account_id and account-scoped historical resources, MUST reject collisions without merging, and MUST apply no identity change if continuity cannot be preserved. MUST be accompanied by revision and MUST be absent in provisioning mode." }, "destination_billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/business-entity.json", + "$ref": "/schemas/core/business-entity.json", "description": "Complete staged billing identity for the requested destination operator during an operator-domain handoff on an account whose billing party is operator. This value is write-only while approval is pending and MUST NOT replace or be echoed as the account's canonical billing_entity until the handoff applies atomically. Required by the protocol when an operator-billed account changes operator; otherwise MUST be absent. Requires operator_identity and revision and MUST be absent in provisioning mode." }, "brand": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-ref.json", - "description": "Brand reference identifying the advertiser. Required for **provisioning mode**; MUST be absent in settings-update mode. Only the BrandKey projection \u2014 `domain`, `brand_id`, and the canonicalized `countries[]` set \u2014 participates in account identity. Mutable or per-call BrandRef fields such as `industries`, `data_subject_contestation`, and `brand_kit_override` MUST NOT affect lookup, idempotency, or account creation. New 3.2 producers SHOULD send only the BrandKey fields; the broader BrandRef remains accepted on this existing 3.x task for compatibility." + "$ref": "/schemas/core/brand-ref.json", + "description": "Brand reference identifying the advertiser. Required for **provisioning mode**; MUST be absent in settings-update mode. Only the BrandKey projection — `domain`, `brand_id`, and the canonicalized `countries[]` set — participates in account identity. Mutable or per-call BrandRef fields such as `industries`, `data_subject_contestation`, and `brand_kit_override` MUST NOT affect lookup, idempotency, or account creation. New 3.2 producers SHOULD send only the BrandKey fields; the broader BrandRef remains accepted on this existing 3.x task for compatibility." }, "operator": { "type": "string", @@ -52,7 +53,7 @@ "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/operator-unit.json", + "$ref": "/schemas/core/operator-unit.json", "description": "Optional operator-owned business unit, agency seat, or platform account for provisioning mode. operator_unit.id participates in the natural key; name is mapping/display metadata. MUST be absent in settings-update mode." }, "currency": { @@ -66,32 +67,46 @@ "description": "Immutable operational timezone selected for an account_fixed advertiser object. Required in provisioning mode when get_adcp_capabilities.account.timezone declares account_selection: buyer_selected, and the value MUST be one of supported_timezones. Omit for seller_fixed or seller_assigned modes. When supplied, it participates in the natural key. MUST be absent in settings-update mode." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/billing-party.json", - "description": "Who the seller invoices for this buyer\u2013storefront account relationship. Required for **provisioning mode**; MUST be absent in settings-update mode (the invoiced party is fixed at provisioning time and cannot be changed via settings-update). This field does not select a payment rail, clearing intermediary, or per-media-buy settlement route." + "$ref": "/schemas/enums/billing-party.json", + "description": "Who the seller invoices for this buyer–storefront account relationship. Required for **provisioning mode**; MUST be absent in settings-update mode (the invoiced party is fixed at provisioning time and cannot be changed via settings-update). This field does not select a payment rail, clearing intermediary, or per-media-buy settlement route." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/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. Permitted in both modes \u2014 sellers MAY accept refinements in settings-update mode (e.g., updated bank details)." + "$ref": "/schemas/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. Permitted in both modes — sellers MAY accept refinements in settings-update mode (e.g., updated bank details)." }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/payment-terms.json", - "description": "Payment terms for this account. The seller must either accept these terms or reject the account \u2014 terms are never silently remapped. When omitted, the seller applies its default terms. Permitted in both modes." + "$ref": "/schemas/enums/payment-terms.json", + "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. Permitted in both modes." }, "sandbox": { "type": "boolean", "description": "When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to buyer-declared accounts (require_operator_auth: false) in provisioning mode. For account-id namespaces, sandbox accounts are pre-existing test accounts discovered via list_accounts or supplied out-of-band." }, "preferred_reporting_protocol": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/cloud-storage-protocol.json", + "$ref": "/schemas/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'." }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. Each generation binds the exact report_definition_id advertised by its offering. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller-scoped immutable destination-generation reference, including one registered through sync_agent_configuration. The account configuration independently authorizes disclosure for this feed and scope, so possession of a reusable reference is never account authority. Unknown, unauthorized, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + "items": { + "$ref": "/schemas/core/reporting-delivery-config.json" + }, + "maxItems": 16, + "x-adcp-validation": { + "unique_config_generation": "Reject the account entry when two items share delivery_config_id and delivery_config_version.", + "immutable_generation": "A previously observed tuple must retain identical feed/profile/scope/finality/schedule/method/destination content. Only active and revocation_effective_at are mutable lifecycle intent.", + "authorization": "Verify authenticated-caller authority for the account, requested reporting scope, recipient, and destination before applying." + } + }, "notification_configs": { "type": "array", - "description": "Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, optional `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, wholesale feed change payloads, and future account-anchored resource events after those event types are added to `notification-config.json`). Indicator and assignment registrations are prospective: activation does not replay current conditions, so buyers establish a complete baseline through `get_media_buys` by enumerating known IDs or requesting every status and exhausting pagination, without an indicator filter. Durable account lifecycle transitions such as later `payment_required`, `suspended`, `closed`, or recovery to `active` use `account.status_changed` on this surface; the one-shot `sync_accounts.push_notification_config` channel remains scoped to the async result of the original provisioning task. Declarative replace semantics: when this field is present, the buyer sends the full desired array and the seller replaces the account's current set with that array, keyed by account-scoped `subscriber_id`. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Re-sending an existing `subscriber_id` for the account replaces that subscriber's config rather than creating a duplicate; persisted entries whose `subscriber_id` does not appear in the sent array are removed, so the seller MUST NOT merge the new array with persisted state. Paused entries (`active: false`) use the same replacement semantics; a buyer that wants to preserve a paused subscriber MUST re-include it with `active: false`. Duplicate `subscriber_id` values within one submitted array are rejected. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth \u2014 see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) or at the agent (today: `capabilities.changed`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry \u2014 those events do not belong on this surface. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; canonical product subscribers repair through `list_products(if_feed_version)`, legacy product subscribers through `get_products(if_wholesale_feed_version)`, and signal subscribers through `get_signals(if_wholesale_feed_version)`. Account status change registrations carry the invalidation payload in `/schemas/core/account-status-changed-webhook.json`; receivers use `list_accounts` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.\n\nActivation proof: before activating a new or changed active subscriber, the seller MUST validate the URL, complete the account-level webhook proof-of-control challenge, and only then persist or expose the subscriber as `active: true`. For `account.status_changed`, sellers MUST assign `account_id` before completing proof so subsequent status transitions can identify the account and be repaired through `list_accounts`, even when external approval remains pending. A valid existing proof for the same `(account_id, subscriber_id, normalized url, authentication mode/credential binding, normalized event_types)` tuple MAY be reused; changing any element of that tuple requires fresh proof. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key and MUST include seller_agent_url, delivery_auth, and event_types so the receiver can verify the pending registration before echoing the challenge. New signers use `adcp_use: \"request-signing\"`; deprecated `webhook-signing` keys remain accepted during the compatibility window. Entries sent with `active: false` may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time, and those entries MUST NOT receive fires until reactivated. If proof fails or times out, the seller rejects the account entry with `action: \"failed\"`, leaves the prior notification_configs[] set unchanged, and reports `VALIDATION_ERROR` (or `INVALID_REQUEST` for malformed URLs) at the failing `notification_configs[j].url` field.\n\n**Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.", + "description": "Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, optional `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, wholesale feed change payloads, and future account-anchored resource events after those event types are added to `notification-config.json`). Indicator and assignment registrations are prospective: activation does not replay current conditions, so buyers establish a complete baseline through `get_media_buys` by enumerating known IDs or requesting every status and exhausting pagination, without an indicator filter. Durable account lifecycle transitions such as later `payment_required`, `suspended`, `closed`, or recovery to `active` use `account.status_changed` on this surface; the one-shot `sync_accounts.push_notification_config` channel remains scoped to the async result of the original provisioning task. Declarative replace semantics: when this field is present, the buyer sends the full desired array and the seller replaces the account's current set with that array, keyed by account-scoped `subscriber_id`. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Re-sending an existing `subscriber_id` for the account replaces that subscriber's config rather than creating a duplicate; persisted entries whose `subscriber_id` does not appear in the sent array are removed, so the seller MUST NOT merge the new array with persisted state. Paused entries (`active: false`) use the same replacement semantics; a buyer that wants to preserve a paused subscriber MUST re-include it with `active: false`. Duplicate `subscriber_id` values within one submitted array are rejected. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth — see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) or at the agent (today: `capabilities.changed`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry — those events do not belong on this surface. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; canonical product subscribers repair through `list_products(if_feed_version)`, legacy product subscribers through `get_products(if_wholesale_feed_version)`, and signal subscribers through `get_signals(if_wholesale_feed_version)`. Account status change registrations carry the invalidation payload in `/schemas/core/account-status-changed-webhook.json`; receivers use `list_accounts` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.\n\nActivation proof: before activating a new or changed active subscriber, the seller MUST validate the URL, complete the account-level webhook proof-of-control challenge, and only then persist or expose the subscriber as `active: true`. For `account.status_changed`, sellers MUST assign `account_id` before completing proof so subsequent status transitions can identify the account and be repaired through `list_accounts`, even when external approval remains pending. A valid existing proof for the same `(account_id, subscriber_id, normalized url, authentication mode/credential binding, normalized event_types)` tuple MAY be reused; changing any element of that tuple requires fresh proof. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key and MUST include seller_agent_url, delivery_auth, and event_types so the receiver can verify the pending registration before echoing the challenge. New signers use `adcp_use: \"request-signing\"`; deprecated `webhook-signing` keys remain accepted during the compatibility window. Entries sent with `active: false` may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time, and those entries MUST NOT receive fires until reactivated. If proof fails or times out, the seller rejects the account entry with `action: \"failed\"`, leaves the prior notification_configs[] set unchanged, and reports `VALIDATION_ERROR` (or `INVALID_REQUEST` for malformed URLs) at the failing `notification_configs[j].url` field.\n\n**Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.", "items": { "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/notification-config.json" + "$ref": "/schemas/core/notification-config.json" }, { "if": { @@ -117,7 +132,7 @@ "oneOf": [ { "title": "ProvisioningMode", - "description": "Provisioning-mode entry \u2014 natural-key trio is required; account, revision, and operator_identity are forbidden.", + "description": "Provisioning-mode entry — natural-key trio is required; account, revision, and operator_identity are forbidden.", "required": [ "brand", "operator", @@ -156,7 +171,7 @@ }, { "title": "SettingsUpdateMode", - "description": "Settings-update entry \u2014 `account` (AccountRef) is required, provisioning trio fields are forbidden.", + "description": "Settings-update entry — `account` (AccountRef) is required, provisioning trio fields are forbidden.", "required": [ "account" ], @@ -222,7 +237,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", @@ -230,14 +245,14 @@ "description": "When true, preview what would change without applying. Returns what would be created/updated/deactivated." }, "push_notification_config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/push-notification-config.json", + "$ref": "/schemas/core/push-notification-config.json", "description": "Webhook for async notifications when account status changes (e.g., pending_approval transitions to active)." }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/context.json" + "$ref": "/schemas/core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -250,24 +265,21 @@ "description": "Agency syncing multiple advertisers with different billing", "data": { "idempotency_key": "a7f9c2e4-1234-4567-89ab-cdef01234567", - "accounts": [ - { - "brand": { - "domain": "nova-brands.com", - "brand_id": "spark", - "countries": [ - "DE", - "NL" - ] - }, - "operator": "pinnacle-media.com", - "operator_unit": { - "id": "seat_emea_01", - "name": "EMEA" + "accounts": [ + { + "brand": { + "domain": "nova-brands.com", + "brand_id": "spark", + "countries": ["DE", "NL"] + }, + "operator": "pinnacle-media.com", + "operator_unit": { + "id": "seat_emea_01", + "name": "EMEA" + }, + "currency": "EUR", + "billing": "operator" }, - "currency": "EUR", - "billing": "operator" - }, { "brand": { "domain": "nova-brands.com", @@ -361,7 +373,7 @@ } }, { - "description": "Provisioning mode \u2014 register a creative-lifecycle webhook subscription alongside account provisioning", + "description": "Provisioning mode — register a creative-lifecycle webhook subscription alongside account provisioning", "data": { "idempotency_key": "e1b3a6c8-5678-49ab-cdef-1234567890ab", "accounts": [ @@ -387,7 +399,7 @@ } }, { - "description": "Settings-update mode \u2014 register webhook subscribers on an existing account-id namespace account", + "description": "Settings-update mode — register webhook subscribers on an existing account-id namespace account", "data": { "idempotency_key": "f2c4b7d9-6789-49bc-defa-2345678901bc", "accounts": [ @@ -420,7 +432,7 @@ } }, { - "description": "Settings-update mode \u2014 register a wholesale feed mirror webhook subscriber for wholesale product and signal changes", + "description": "Settings-update mode — register a wholesale feed mirror webhook subscriber for wholesale product and signal changes", "data": { "idempotency_key": "a8af8cf1-89bd-41f3-b27d-7ee7e9f8d2e4", "accounts": [ @@ -451,4 +463,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/account/sync-accounts-response.json b/schemas/cache/3.2.0-beta.9/account/sync-accounts-response.json index d00830255..bc5c2714e 100644 --- a/schemas/cache/3.2.0-beta.9/account/sync-accounts-response.json +++ b/schemas/cache/3.2.0-beta.9/account/sync-accounts-response.json @@ -1,14 +1,15 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/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", "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/version-envelope.json" + "$ref": "/schemas/core/version-envelope.json" }, { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/protocol-envelope.json" + "$ref": "/schemas/core/protocol-envelope.json" } ], "oneOf": [ @@ -33,7 +34,7 @@ "x-entity": "account" }, "brand": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-ref.json", + "$ref": "/schemas/core/brand-ref.json", "description": "Current canonical brand reference for the account." }, "operator": { @@ -41,7 +42,7 @@ "description": "Current canonical operator domain. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/operator-unit.json", + "$ref": "/schemas/core/operator-unit.json", "description": "Current canonical operator-owned business unit, agency seat, or platform account. The stable id participates in the natural key; name is mutable display metadata. This is distinct from the seller/storefront account_id. When an identity change is pending or rejected, this remains the current value rather than echoing the requested value." }, "revision": { @@ -50,11 +51,11 @@ "description": "Current account revision after this operation. Incremented by each persisted settings change, identity-change request, or identity-change disposition; not incremented by dry runs, validation failures, or exact idempotency replays. Pass this value in the next settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-identity-change.json", + "$ref": "/schemas/core/account-identity-change.json", "description": "Pending or rejected desired operator identity. The top-level operator and operator_unit remain canonical until an approved change is applied." }, "identity_change_preview": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-identity-change-preview.json", + "$ref": "/schemas/core/account-identity-change-preview.json", "description": "Dry-run-only preview of whether the requested identity would apply, require approval, or be blocked, plus evaluated resource impacts. This value is not persisted; canonical fields and revision remain current." }, "currency": { @@ -94,11 +95,11 @@ "description": "Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). rejected: seller declined the account request. payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: was active, now terminated." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/billing-party.json", + "$ref": "/schemas/enums/billing-party.json", "description": "Who is invoiced on this account. Matches the requested billing model." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/business-entity.json", + "$ref": "/schemas/core/business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Sellers MAY add verified fields, but MUST NOT return data from a different entity. During an operator-domain handoff this remains the current entity until approval applies atomically; destination_billing_entity is staged and write-only. Bank details are omitted (write-only)." }, "destination_billing_entity": { @@ -106,7 +107,7 @@ "not": {} }, "account_scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/account-scope.json" + "$ref": "/schemas/enums/account-scope.json" }, "setup": { "type": "object", @@ -137,7 +138,7 @@ "description": "Rate card applied to this account" }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/payment-terms.json", + "$ref": "/schemas/enums/payment-terms.json", "description": "Payment terms agreed for this account. When the account is active, these are the binding terms for all invoices on this account." }, "credit_limit": { @@ -161,7 +162,7 @@ "type": "array", "description": "Per-account errors (only present when action is 'failed')", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/error.json" + "$ref": "/schemas/core/error.json" } }, "warnings": { @@ -179,13 +180,22 @@ "type": "array", "description": "Applied notification subscribers for this account after declarative replacement and activation-proof checks. Present on `created`, `updated`, and `unchanged` results when the buyer included `notification_configs` in the request or any persisted entries exist on the account. Entries are keyed by account-scoped `subscriber_id`; re-sending an existing `subscriber_id` replaces that subscriber's config rather than creating a duplicate. Only configs that the seller has persisted are echoed. `authentication.credentials` is omitted on every entry (write-only).", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/notification-config.json" + "$ref": "/schemas/core/notification-config.json" + }, + "maxItems": 16 + }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Resolved caller-owned durable reporting delivery configurations after declarative replacement. Each item echoes desired state and reports validation/setup state plus the seller-issued destination_ref when resolved. A setup action may direct an authenticated user to complete a provider grant or Open Sharing activation, but MUST NOT carry credentials or a bearer URL.", + "items": { + "$ref": "/schemas/core/reporting-delivery-config-state.json" }, "maxItems": 16 }, "authorization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-authorization.json", - "description": "Optional. The caller's scope grant against this account after the sync operation. Vendor agents of any type (media-buy, signals, governance, creative, brand) that support scope introspection SHOULD populate this so callers can preempt RBAC errors rather than discovering scope by trial and error. Media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Present on `created`, `updated`, and `unchanged` results; omitted on `failed` results (where the account did not reach a usable state). Absence means the vendor agent does not advertise introspectable scope \u2014 callers MUST NOT infer access from absence." + "$ref": "/schemas/core/account-authorization.json", + "description": "Optional. The caller's scope grant against this account after the sync operation. Vendor agents of any type (media-buy, signals, governance, creative, brand) that support scope introspection SHOULD populate this so callers can preempt RBAC errors rather than discovering scope by trial and error. Media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Present on `created`, `updated`, and `unchanged` results; omitted on `failed` results (where the account did not reach a usable state). Absence means the vendor agent does not advertise introspectable scope — callers MUST NOT infer access from absence." } }, "required": [ @@ -211,10 +221,10 @@ } }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/context.json" + "$ref": "/schemas/core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -276,15 +286,15 @@ "type": "array", "description": "Operation-level errors (e.g., authentication failure, service unavailable)", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/error.json" + "$ref": "/schemas/core/error.json" }, "minItems": 1 }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/context.json" + "$ref": "/schemas/core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -309,7 +319,7 @@ ], "examples": [ { - "description": "Mixed results \u2014 one active, one pending approval", + "description": "Mixed results — one active, one pending approval", "data": { "status": "completed", "accounts": [ @@ -318,10 +328,7 @@ "brand": { "domain": "nova-brands.com", "brand_id": "spark", - "countries": [ - "DE", - "NL" - ] + "countries": ["DE", "NL"] }, "operator": "pinnacle-media.com", "operator_unit": { @@ -357,7 +364,7 @@ } }, { - "description": "Rejected account \u2014 no account_id assigned", + "description": "Rejected account — no account_id assigned", "data": { "status": "completed", "accounts": [ @@ -377,7 +384,7 @@ } }, { - "description": "Unsupported billing \u2014 seller rejects the request", + "description": "Unsupported billing — seller rejects the request", "data": { "status": "completed", "accounts": [ @@ -438,7 +445,7 @@ } }, { - "description": "Unsupported payment terms \u2014 seller rejects the request", + "description": "Unsupported payment terms — seller rejects the request", "data": { "status": "completed", "accounts": [ @@ -461,4 +468,4 @@ } ], "properties": {} -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/account.json b/schemas/cache/3.2.0-beta.9/core/account.json index 8050c4af5..9d0df6fdd 100644 --- a/schemas/cache/3.2.0-beta.9/core/account.json +++ b/schemas/cache/3.2.0-beta.9/core/account.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/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", @@ -22,11 +23,11 @@ "description": "Optional intermediary who receives invoices on behalf of the advertiser (e.g., agency)" }, "status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/account-status.json", + "$ref": "/schemas/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": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-ref.json", + "$ref": "/schemas/core/brand-ref.json", "description": "Brand reference identifying the advertiser" }, "operator": { @@ -36,7 +37,7 @@ "x-entity": "operator" }, "operator_unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/operator-unit.json", + "$ref": "/schemas/core/operator-unit.json", "description": "Operator-owned business unit, agency seat, or platform account associated with this advertiser account. The id round-trips from the natural key; name is mutable display metadata. This is distinct from account_id, which belongs to the seller/storefront namespace." }, "revision": { @@ -45,7 +46,7 @@ "description": "Monotonically increasing optimistic-concurrency token for this account. Incremented on every persisted settings change, identity-change request, and identity-change disposition; reads, dry runs, validation failures, and exact idempotency replays do not increment it. Pass the latest observed value in a sync_accounts settings-update entry to prevent lost updates." }, "identity_change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-identity-change.json", + "$ref": "/schemas/core/account-identity-change.json", "description": "Pending or rejected operator-identity transition. While present, the top-level operator and operator_unit remain the current canonical identity. Re-read list_accounts until the request is applied (canonical fields change and this object disappears) or rejected." }, "currency": { @@ -59,11 +60,11 @@ "description": "Immutable operational timezone for this account, expressed as UTC or an IANA timezone identifier. AdCP 3.2 sellers return it on every account. It is the default calendar-day boundary for account-scoped behavior unless a feature explicitly declares another timezone basis. For buyer-selected account_fixed provisioning it participates in the natural account key." }, "billing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/billing-party.json", + "$ref": "/schemas/enums/billing-party.json", "description": "Who is invoiced on this account. See billing_entity for the invoiced party's business details." }, "billing_entity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/business-entity.json", + "$ref": "/schemas/core/business-entity.json", "description": "Current canonical business entity for the party responsible for payment. Contains the legal name, tax IDs, and address 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 and the request-only destination_billing_entity MUST NOT be exposed." }, "destination_billing_entity": { @@ -75,7 +76,7 @@ "description": "Identifier for the rate card applied to this account" }, "payment_terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/payment-terms.json", + "$ref": "/schemas/enums/payment-terms.json", "description": "Payment terms agreed for this account. Binding for all invoices when the account is active." }, "credit_limit": { @@ -121,11 +122,11 @@ "additionalProperties": true }, "account_scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/account-scope.json" + "$ref": "/schemas/enums/account-scope.json" }, "governance_agents": { "type": "array", - "description": "Governance agent endpoint registered on this account. Exactly one entry per sync_governance's one-agent-per-account invariant. The array shape is preserved for wire compatibility with 3.0; `maxItems: 1` is load-bearing and mirrors the singular `governance_context` on the protocol envelope. Authentication credentials are write-only and not included in responses \u2014 use sync_governance to set or update credentials.", + "description": "Governance agent endpoint registered on this account. Exactly one entry per sync_governance's one-agent-per-account invariant. The array shape is preserved for wire compatibility with 3.0; `maxItems: 1` is load-bearing and mirrors the singular `governance_context` on the protocol envelope. Authentication credentials are write-only and not included in responses — use sync_governance to set or update credentials.", "items": { "type": "object", "properties": { @@ -146,10 +147,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": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/cloud-storage-protocol.json", + "$ref": "/schemas/enums/cloud-storage-protocol.json", "description": "Cloud storage protocol" }, "bucket": { @@ -214,7 +215,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": [ @@ -226,13 +227,22 @@ }, "sandbox": { "type": "boolean", - "description": "When true, this is a sandbox account \u2014 no real platform calls, no real spend. For account-id namespaces, sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts or supplied out-of-band. For buyer-declared 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 account-id namespaces, sandbox accounts are pre-existing test accounts on the platform discovered via list_accounts or supplied out-of-band. For buyer-declared accounts, sandbox is part of the natural key: the same brand/operator pair can have both a production and sandbox account." }, "notification_configs": { "type": "array", - "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, durable account-change wake-ups, and wholesale feed changes. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. account.change_recorded wakes receivers to drain list_account_changes; indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", + "description": "Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, durable account-change wake-ups, wholesale feed changes, and reporting.delivery_ready. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. account.change_recorded wakes receivers to drain list_account_changes; reporting.delivery_ready is repaired through get_reporting_status; indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/notification-config.json" + "$ref": "/schemas/core/notification-config.json" + }, + "maxItems": 16 + }, + "reporting_delivery_configs": { + "type": "array", + "x-status": "experimental", + "description": "Resolved durable reporting delivery configurations owned by the authenticated caller for this account. list_accounts MUST expose only the calling principal's set. State and seller-issued destination_ref are returned; credentials and bearer profiles MUST NOT appear. Any setup URL is a secret-free authenticated entry point, not a bearer credential.", + "items": { + "$ref": "/schemas/core/reporting-delivery-config-state.json" }, "maxItems": 16 }, @@ -240,12 +250,12 @@ "type": "array", "description": "Recent webhook delivery attempts scoped to this account when the caller requested webhook activity on list_accounts and the seller surfaces the log. Includes account-anchored notifications such as account.status_changed and MAY include other account-level fires relevant to this account. Three-state presence follows the shared webhook_activity[] contract: omitted means unsupported or not requested, [] means supported but no retained fires, non-empty lists recent attempts most-recent-first.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/webhook-activity-record.json" + "$ref": "/schemas/core/webhook-activity-record.json" }, "maxItems": 200 }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -384,4 +394,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-configuration-state.json b/schemas/cache/3.2.0-beta.9/core/agent-configuration-state.json new file mode 100644 index 000000000..6407bb3ab --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/agent-configuration-state.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-configuration-state.json", + "title": "Agent Configuration State", + "x-status": "experimental", + "description": "Complete caller-scoped connection configuration visible after sync. Secrets are never returned. The seller keys this state by its own agent identity and the stable authenticated caller principal.", + "type": "object", + "properties": { + "notification_configs": { + "type": "array", + "items": { + "$ref": "/schemas/core/agent-notification-config-state.json" + }, + "maxItems": 16, + "description": "Current agent-level webhook subscribers. authentication.credentials is always omitted because it is write-only." + }, + "reporting_destinations": { + "type": "array", + "items": { + "$ref": "/schemas/core/agent-reporting-destination-state.json" + }, + "maxItems": 64, + "description": "Current reusable reporting destination bindings and setup states. destination_id and destination_ref values MUST each be unique within this caller-scoped array." + } + }, + "required": ["notification_configs", "reporting_destinations"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-notification-config-state.json b/schemas/cache/3.2.0-beta.9/core/agent-notification-config-state.json new file mode 100644 index 000000000..e3adff9a5 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/agent-notification-config-state.json @@ -0,0 +1,53 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-notification-config-state.json", + "title": "Agent Notification Config State", + "description": "Credential-free readback of one caller-scoped agent-level webhook subscription. The optional legacy authentication selector identifies the scheme only; write-only credentials can never appear.", + "type": "object", + "properties": { + "subscriber_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$" + }, + "url": { + "type": "string", + "format": "uri" + }, + "event_types": { + "type": "array", + "items": { + "type": "string", + "enum": ["capabilities.changed"] + }, + "minItems": 1, + "uniqueItems": true + }, + "authentication": { + "type": "object", + "deprecated": true, + "properties": { + "schemes": { + "type": "array", + "items": { + "$ref": "/schemas/enums/auth-scheme.json" + }, + "minItems": 1, + "maxItems": 1 + } + }, + "required": ["schemes"], + "additionalProperties": false + }, + "active": { + "type": "boolean", + "default": true + }, + "ext": { + "$ref": "/schemas/core/ext.json" + } + }, + "required": ["subscriber_id", "url", "event_types"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-notification-config.json b/schemas/cache/3.2.0-beta.9/core/agent-notification-config.json index fb25671b7..1ed738f61 100644 --- a/schemas/cache/3.2.0-beta.9/core/agent-notification-config.json +++ b/schemas/cache/3.2.0-beta.9/core/agent-notification-config.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-notification-config.json", "title": "Agent Notification Config", - "description": "Caller-scoped agent-level webhook subscription for notifications whose lifecycle belongs to the seller agent itself rather than to one account, media buy, creative, or other account-scoped resource. The initial agent-level event type is `capabilities.changed`, registered through `sync_agent_notification_configs` when the seller declares `adcp.capability_changes.notifications.supported: true` in `get_adcp_capabilities`. This surface is intentionally separate from account-level `notification_configs[]`: a registry or buyer can subscribe before it has an account, and one fire invalidates the agent-wide `get_adcp_capabilities` cache. The persisted set is scoped to the authenticated caller or registry identity, so one caller's declarative replacement cannot clear another caller's subscribers. As with other AdCP webhooks, the default signing scheme is the RFC 9421 webhook profile against the seller's brand.json `agents[]` JWKS; the optional `authentication` block opts into the deprecated Bearer / HMAC-SHA256 fallback for compatibility. Credentials and shared secrets in `authentication.credentials` are write-only and MUST NOT be echoed on reads. Sellers MUST verify endpoint control before activating a new or changed active agent-level notification config; delivery-time SSRF validation still applies to every fire.", + "description": "Caller-scoped agent-level webhook subscription for notifications whose lifecycle belongs to the seller agent itself rather than to one account, media buy, creative, or other account-scoped resource. The initial agent-level event type is capabilities.changed, registered through the task declared by get_adcp_capabilities.adcp.capability_changes.notifications.registration_task: sync_agent_configuration when the broader connection surface is supported, or the specialized sync_agent_notification_configs compatibility task. Both tasks operate on one underlying caller-scoped subscriber set. This surface is intentionally separate from account-level notification_configs[]: a registry or buyer can subscribe before it has an account, and one fire invalidates the agent-wide get_adcp_capabilities cache. The persisted set is scoped to the authenticated caller or registry identity, so one caller's declarative replacement cannot clear another caller's subscribers. As with other AdCP webhooks, the default signing scheme is the RFC 9421 webhook profile against the seller's brand.json agents[] JWKS; the optional authentication block opts into the deprecated Bearer / HMAC-SHA256 fallback for compatibility. Credentials and shared secrets in authentication.credentials are write-only and MUST NOT be echoed on reads. Sellers MUST verify endpoint control before activating a new or changed active agent-level notification config; delivery-time SSRF validation still applies to every fire.", "type": "object", "properties": { "subscriber_id": { @@ -36,7 +37,7 @@ "schemes": { "type": "array", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/auth-scheme.json" + "$ref": "/schemas/enums/auth-scheme.json" }, "minItems": 1, "maxItems": 1 @@ -58,7 +59,7 @@ "description": "When false, the seller persists the configuration but suppresses fires. Use to pause a subscriber without losing the registration. Paused configs may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time. Reactivation requires full SSRF validation with connect pinning plus proof-of-control for any tuple without current valid proof." }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -80,4 +81,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination-state.json b/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination-state.json new file mode 100644 index 000000000..a17d58fcb --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination-state.json @@ -0,0 +1,101 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-reporting-destination-state.json", + "title": "Agent Reporting Destination State", + "x-status": "experimental", + "description": "Seller readback for one caller-scoped reusable reporting destination. destination_ref is an opaque routing reference, not a credential or authorization grant. Account-level reporting configuration may use it only while the same authenticated principal remains authorized for that account.", + "type": "object", + "properties": { + "destination_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "description": "Caller-selected key echoed from the desired configuration." + }, + "destination_ref": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Seller-issued opaque reference bound to the stable authenticated principal and destination_id. Possession does not authorize access, and sellers MUST NOT resolve it across callers." + }, + "state": { + "type": "string", + "enum": ["validating", "ready", "action_required", "inactive", "rejected"], + "description": "Validation and setup state. Only ready destinations may be selected by a new account-level delivery configuration." + }, + "configuration": { + "$ref": "/schemas/core/agent-reporting-destination.json", + "description": "Credential-free desired configuration currently associated with this destination reference." + }, + "setup": { + "type": "object", + "description": "Closed, non-secret setup instruction. Human-readable messages are deliberately excluded; agents dispatch only the typed action and treat setup_url as an untrusted navigation target.", + "properties": { + "action": { + "type": "string", + "enum": ["grant_access", "accept_share", "prove_control", "contact_support"] + }, + "setup_url": { + "type": "string", + "format": "uri", + "pattern": "^https://(?![^/\\s]*@)(?!.*\\?)[^\\r\\n]+$", + "description": "HTTPS page for completing provider-native setup. It MUST NOT carry a credential or signed query string and MUST be rendered as an untrusted link, never executed as agent instructions." + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "Optional expiry of this setup action. A new sync obtains a fresh action after expiry." + } + }, + "required": ["action"], + "additionalProperties": false + }, + "issues": { + "type": "array", + "items": { + "$ref": "/schemas/core/error.json" + }, + "maxItems": 16, + "description": "Structured validation or setup issues. Messages and details are untrusted display data and MUST NOT be executed as instructions." + } + }, + "required": ["destination_id", "destination_ref", "state", "configuration"], + "allOf": [ + { + "if": { + "properties": { + "state": { + "const": "action_required" + } + }, + "required": ["state"] + }, + "then": { + "required": ["setup"] + } + }, + { + "if": { + "properties": { + "state": { + "const": "inactive" + } + }, + "required": ["state"] + }, + "then": { + "properties": { + "configuration": { + "properties": { + "active": { + "const": false + } + } + } + } + } + } + ], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination.json b/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination.json new file mode 100644 index 000000000..5b2e36894 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/agent-reporting-destination.json @@ -0,0 +1,116 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-reporting-destination.json", + "title": "Agent Reporting Destination", + "x-status": "experimental", + "description": "Reusable, non-secret reporting destination owned by the authenticated caller's relationship with one seller. It does not grant account authority: account/reporting configuration separately binds authorized data to the seller-issued destination_ref. Sellers key ownership to the stable transport principal, never a signing key, token, or request-body identity. Credentials, private keys, bearer profiles, signed URLs, and embedded passwords are forbidden. Sellers implementing this schema advertise protocol.agent_configuration.", + "type": "object", + "properties": { + "pattern": { + "type": "string", + "enum": ["file_transfer", "warehouse_materialization", "dataset_share"] + }, + "destination_id": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[A-Za-z0-9_.:-]{1,64}$", + "description": "Caller-selected stable key, unique within this seller relationship. Reusing it replaces desired configuration." + }, + "active": { + "type": "boolean", + "default": true, + "description": "Whether new account-level delivery configurations may use this destination. False does not delete caller-owned data." + }, + "provider": { + "$ref": "/schemas/core/delivery-provider.json" + }, + "transport": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Open provider transport name, such as s3, bigquery, delta_sharing, or snowflake_secure_sharing." + }, + "location": { + "type": "string", + "minLength": 1, + "maxLength": 2048, + "pattern": "^(?![A-Za-z][A-Za-z0-9+.-]*://[^/\\s]*@)(?!.*\\?)[^\\r\\n]+$", + "description": "Provider-native bucket/prefix, project/dataset, database/schema, catalog/schema, or equivalent locator. Never a credential or signed URL." + }, + "accepted_formats": { + "type": "array", + "items": { + "type": "string", + "enum": ["jsonl", "csv", "parquet", "avro", "orc"] + }, + "minItems": 1, + "uniqueItems": true, + "description": "Physical formats accepted by a file-transfer destination." + }, + "access_mode": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[a-z][a-z0-9_.-]*$", + "description": "Dataset-share access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing." + }, + "recipient": { + "$ref": "/schemas/core/delivery-recipient.json" + }, + "accepted_verification_profiles": { + "$ref": "/schemas/core/reporting-verification-profile-set.json" + } + }, + "required": ["pattern", "destination_id", "active", "provider", "transport", "accepted_verification_profiles"], + "oneOf": [ + { + "title": "File transfer destination", + "properties": { + "pattern": { "type": "string", "const": "file_transfer" } + }, + "required": ["pattern", "location", "accepted_formats"], + "not": { + "anyOf": [ + { "required": ["access_mode"] }, + { "required": ["recipient"] } + ] + } + }, + { + "title": "Warehouse materialization destination", + "properties": { + "pattern": { "type": "string", "const": "warehouse_materialization" } + }, + "required": ["pattern", "location"], + "not": { + "anyOf": [ + { "required": ["accepted_formats"] }, + { "required": ["access_mode"] }, + { "required": ["recipient"] } + ] + } + }, + { + "title": "Dataset share recipient", + "properties": { + "pattern": { "type": "string", "const": "dataset_share" } + }, + "required": ["pattern", "access_mode", "recipient"], + "not": { + "anyOf": [ + { "required": ["location"] }, + { "required": ["accepted_formats"] } + ] + } + } + ], + "x-adcp-validation": { + "ownership": "Before ready, prove destination or recipient control bound to the stable principal, seller, destination_id, normalized coordinates, and accepted delivery contract.", + "secret_rejection": "Reject credentials, bearer profiles, private keys, signed URLs, password-bearing authorities, and secret query parameters. Exchange access through provider-native control planes or out of band.", + "account_isolation": "Readiness authorizes coordinate reuse only. Each account/feed binding still requires caller authorization. Reject unknown, unauthorized, and cross-principal destination_ref values indistinguishably.", + "replacement": "destination_id values are unique within reporting_destinations. Changing a proof-bound tuple requires fresh proof before ready." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/agent-webhook-challenge.json b/schemas/cache/3.2.0-beta.9/core/agent-webhook-challenge.json index 56247a04b..811ba491d 100644 --- a/schemas/cache/3.2.0-beta.9/core/agent-webhook-challenge.json +++ b/schemas/cache/3.2.0-beta.9/core/agent-webhook-challenge.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/agent-webhook-challenge.json", "title": "Agent Webhook Challenge", - "description": "Proof-of-control challenge payload sent by a seller to an agent-level sync_agent_notification_configs.notification_configs[] URL before activating a new or changed active subscriber. Agent-level challenges are valid before any seller account exists, so they bind the seller agent URL, subscriber ID, requested agent-level event types, delivery auth mode, and challenge nonce instead of an account_id. The seller sends this payload as an HTTPS POST after URL normalization and SSRF validation, and before treating the subscriber as active. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key even when the candidate config selects legacy delivery auth; new signers use `adcp_use: \"request-signing\"` and deprecated `webhook-signing` keys remain accepted during the compatibility window. `delivery_auth` describes the future webhook delivery mode, not the challenge's own signing mode.", + "description": "Proof-of-control challenge payload sent by a seller to an agent-level notification_configs[] URL registered through sync_agent_configuration or sync_agent_notification_configs before activating a new or changed active subscriber. Agent-level challenges are valid before any seller account exists, so they bind the seller agent URL, subscriber ID, requested agent-level event types, delivery auth mode, and challenge nonce instead of an account_id. The seller sends this payload as an HTTPS POST after URL normalization and SSRF validation, and before treating the subscriber as active. The challenge POST itself MUST be signed with the seller's RFC 9421 webhook profile key even when the candidate config selects legacy delivery auth; new signers use adcp_use request-signing and deprecated webhook-signing keys remain accepted during the compatibility window. delivery_auth describes the future webhook delivery mode, not the challenge's own signing mode.", "type": "object", "properties": { "type": { @@ -23,7 +24,7 @@ }, "subscriber_id": { "type": "string", - "description": "Buyer-supplied subscriber identifier from the sync_agent_notification_configs.notification_configs[] entry being challenged.", + "description": "Buyer-supplied subscriber identifier from the caller-scoped notification_configs[] entry being challenged.", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$" @@ -141,4 +142,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/capabilities-changed-webhook.json b/schemas/cache/3.2.0-beta.9/core/capabilities-changed-webhook.json index 31e78b7e4..a2f1d41fa 100644 --- a/schemas/cache/3.2.0-beta.9/core/capabilities-changed-webhook.json +++ b/schemas/cache/3.2.0-beta.9/core/capabilities-changed-webhook.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/capabilities-changed-webhook.json", "title": "Capabilities Changed Webhook", - "description": "Agent-level webhook payload fired when the seller's advertised `get_adcp_capabilities` document materially changes. Registered through `sync_agent_notification_configs` using `event_types: [\"capabilities.changed\"]`. The payload is an invalidation signal, not a replacement capability document: receivers SHOULD re-run `get_adcp_capabilities`, compare the returned `adcp.capability_changes.capabilities_version`, and update their cache from the fresh response. Sellers MUST publish the new capability snapshot before firing so the webhook's `capabilities_version` is observable on read. Sellers SHOULD coalesce bursts of configuration changes and fire once for the post-change revision.", + "description": "Agent-level webhook payload fired when the seller's advertised get_adcp_capabilities document materially changes. Registered through sync_agent_configuration or the specialized sync_agent_notification_configs task using event_types: [capabilities.changed]. The payload is an invalidation signal, not a replacement capability document: receivers SHOULD re-run get_adcp_capabilities, compare the returned adcp.capability_changes.capabilities_version, and update their cache from the fresh response. Sellers MUST publish the new capability snapshot before firing so the webhook's capabilities_version is observable on read. Sellers SHOULD coalesce bursts of configuration changes and fire once for the post-change revision.", "type": "object", "properties": { "idempotency_key": { @@ -30,7 +31,7 @@ }, "subscriber_id": { "type": "string", - "description": "Identifies which `sync_agent_notification_configs.notification_configs[]` entry is receiving this fire. Echoed verbatim from the entry's `subscriber_id`.", + "description": "Identifies which caller-scoped notification_configs[] entry is receiving this fire. Echoed verbatim from the entry's subscriber_id.", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$" @@ -75,7 +76,7 @@ "uniqueItems": true }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -109,4 +110,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/delivery-provider.json b/schemas/cache/3.2.0-beta.9/core/delivery-provider.json new file mode 100644 index 000000000..00011818b --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/delivery-provider.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/delivery-provider.json", + "title": "Delivery Provider", + "description": "Provider namespace for an external delivery or data-sharing service. This identifies a platform; it is not a credential, trust root, or authorization statement.", + "type": "object", + "properties": { + "domain": { + "type": "string", + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$", + "description": "Lowercase dotted provider domain, such as a provider's operating domain. Single-label and localhost-style names are invalid." + } + }, + "required": ["domain"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/delivery-recipient.json b/schemas/cache/3.2.0-beta.9/core/delivery-recipient.json new file mode 100644 index 000000000..28f7a2891 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/delivery-recipient.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/delivery-recipient.json", + "title": "Delivery Recipient", + "description": "Provider-interpreted recipient identity for a seller-hosted share. Examples include a sharing identifier or organization/account pair. The value is an identifier, never a credential.", + "type": "object", + "properties": { + "identity": { + "type": "string", + "minLength": 1, + "maxLength": 512 + }, + "cloud": { + "type": "string", + "enum": ["aws", "azure", "gcp"] + }, + "region": { + "type": "string", + "minLength": 1, + "maxLength": 128 + } + }, + "required": ["identity"], + "dependencies": { + "cloud": ["region"], + "region": ["cloud"] + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/notification-config.json b/schemas/cache/3.2.0-beta.9/core/notification-config.json index 685b625ef..5e33c8ca8 100644 --- a/schemas/cache/3.2.0-beta.9/core/notification-config.json +++ b/schemas/cache/3.2.0-beta.9/core/notification-config.json @@ -1,12 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/notification-config.json", "title": "Notification Config", - "description": "Account-level webhook subscription for notifications whose lifecycle outlives any single media buy \u2014 creative state changes, library purges, account status changes, wholesale feed change webhooks, and future account-anchored resource events after those event types are added to this schema. This is distinct from `push-notification-config.json`, which anchors at a per-resource operation (a single task or media buy). The one-shot `sync_accounts.push_notification_config` channel may report the first async result of a provisioning request, while durable account lifecycle events such as later `payment_required` or `suspended` transitions use `account.status_changed` here. An account MAY register multiple notification configs to fan a single seller's events out to multiple buyer-side endpoints; each entry filters by `event_types`. As with push-notification-config, the default signing scheme is the AdCP RFC 9421 webhook profile against the seller's brand.json `agents[]` JWKS; the optional `authentication` block opts into the deprecated Bearer / HMAC-SHA256 fallback for compatibility. Credentials and shared secrets in `authentication.credentials` are write-only \u2014 sellers MUST NOT echo them back in `list_accounts` responses. Sellers MUST verify endpoint control before activating a new or changed active account-level notification config; delivery-time SSRF validation still applies to every fire.", + "description": "Account-level webhook subscription for notifications whose lifecycle outlives any single media buy — creative state changes, library purges, account status changes, wholesale feed change webhooks, and future account-anchored resource events after those event types are added to this schema. This is distinct from `push-notification-config.json`, which anchors at a per-resource operation (a single task or media buy). The one-shot `sync_accounts.push_notification_config` channel may report the first async result of a provisioning request, while durable account lifecycle events such as later `payment_required` or `suspended` transitions use `account.status_changed` here. An account MAY register multiple notification configs to fan a single seller's events out to multiple buyer-side endpoints; each entry filters by `event_types`. As with push-notification-config, the default signing scheme is the AdCP RFC 9421 webhook profile against the seller's brand.json `agents[]` JWKS; the optional `authentication` block opts into the deprecated Bearer / HMAC-SHA256 fallback for compatibility. Credentials and shared secrets in `authentication.credentials` are write-only — sellers MUST NOT echo them back in `list_accounts` responses. Sellers MUST verify endpoint control before activating a new or changed active account-level notification config; delivery-time SSRF validation still applies to every fire.", "type": "object", "properties": { "subscriber_id": { "type": "string", - "description": "Buyer-supplied identifier for this subscription endpoint. This is the stable logical key within one account's notification_configs[] set: re-sending the same subscriber_id for the same account replaces that subscriber's URL, event_types, authentication selector, and active flag rather than creating a duplicate. Echoed on every webhook payload and on every `webhook_activity[]` record fired against this config so the buyer can attribute fires across multiple endpoints. MUST be unique within the account's `notification_configs[]`. Sending two entries with the same `subscriber_id` in a single `sync_accounts` request array is rejected as a per-account validation failure with `INVALID_REQUEST` or `VALIDATION_ERROR`, and `error.field` MUST point at the duplicate entry. `subscriber_id` is the stable match key for the per-account declarative-replace diff. Always required (even with a single subscriber) so the SDK contract is uniform \u2014 no conditional required-when-multiple rules to trip up implementations. Format is opaque \u2014 recommended values are short kebab-case slugs (`buyer-primary`, `audit-bus`, `dx-team`).", + "description": "Buyer-supplied identifier for this subscription endpoint. This is the stable logical key within one account's notification_configs[] set: re-sending the same subscriber_id for the same account replaces that subscriber's URL, event_types, authentication selector, and active flag rather than creating a duplicate. Echoed on every webhook payload and on every `webhook_activity[]` record fired against this config so the buyer can attribute fires across multiple endpoints. MUST be unique within the account's `notification_configs[]`. Sending two entries with the same `subscriber_id` in a single `sync_accounts` request array is rejected as a per-account validation failure with `INVALID_REQUEST` or `VALIDATION_ERROR`, and `error.field` MUST point at the duplicate entry. `subscriber_id` is the stable match key for the per-account declarative-replace diff. Always required (even with a single subscriber) so the SDK contract is uniform — no conditional required-when-multiple rules to trip up implementations. Format is opaque — recommended values are short kebab-case slugs (`buyer-primary`, `audit-bus`, `dx-team`).", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$" @@ -14,11 +15,11 @@ "url": { "type": "string", "format": "uri", - "description": "Webhook endpoint URL. Same wire contract as `push-notification-config.url` \u2014 `format: \"uri\"`, no destination-port allowlist enforced by the protocol, SSRF protection via the IP-range check defined in docs/building/by-layer/L1/security.mdx#webhook-url-validation-ssrf. Sellers MUST validate URL syntax, HTTPS usage, hostname normalization, and reserved-range rejection when writing any config, including `active: false` configs. Sellers MUST complete an activation challenge or equivalent proof-of-control before treating a new or changed active subscriber as active." + "description": "Webhook endpoint URL. Same wire contract as `push-notification-config.url` — `format: \"uri\"`, no destination-port allowlist enforced by the protocol, SSRF protection via the IP-range check defined in docs/building/by-layer/L1/security.mdx#webhook-url-validation-ssrf. Sellers MUST validate URL syntax, HTTPS usage, hostname normalization, and reserved-range rejection when writing any config, including `active: false` configs. Sellers MUST complete an activation challenge or equivalent proof-of-control before treating a new or changed active subscriber as active." }, "event_types": { "type": "array", - "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, and wholesale feed events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", + "description": "Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, wholesale feed, and reporting.delivery_ready events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.", "items": { "type": "string", "enum": [ @@ -36,7 +37,8 @@ "signal.updated", "signal.priced", "signal.removed", - "wholesale_feed.bulk_change" + "wholesale_feed.bulk_change", + "reporting.delivery_ready" ] }, "minItems": 1, @@ -44,22 +46,19 @@ }, "product_payload_view": { "type": "string", - "enum": [ - "canonical", - "legacy" - ], + "enum": ["canonical", "legacy"], "default": "legacy", "description": "Product webhook representation selected by this subscriber. Use canonical with lifecycle_tools.list_products; legacy is the default for 3.x get_products consumers. Sellers emit exactly canonical_product/canonical_pricing_options or product/pricing_options accordingly. Valid only when event_types includes a product.* event." }, "authentication": { "type": "object", "deprecated": true, - "description": "Legacy authentication selector. Same precedence and semantics as `push-notification-config.authentication` \u2014 presence opts the seller into Bearer or HMAC-SHA256 signing; absence selects the default RFC 9421 webhook profile keyed off the seller's brand.json `agents[]` JWKS. The same signed-registration downgrade-resistance rules apply to accounts[].notification_configs[].authentication. Deprecated; removed in AdCP 4.0. Credentials are write-only and MUST NOT be echoed on `list_accounts` reads.", + "description": "Legacy authentication selector. Same precedence and semantics as `push-notification-config.authentication` — presence opts the seller into Bearer or HMAC-SHA256 signing; absence selects the default RFC 9421 webhook profile keyed off the seller's brand.json `agents[]` JWKS. The same signed-registration downgrade-resistance rules apply to accounts[].notification_configs[].authentication. Deprecated; removed in AdCP 4.0. Credentials are write-only and MUST NOT be echoed on `list_accounts` reads.", "properties": { "schemes": { "type": "array", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/auth-scheme.json" + "$ref": "/schemas/enums/auth-scheme.json" }, "minItems": 1, "maxItems": 1 @@ -78,10 +77,10 @@ "active": { "type": "boolean", "default": true, - "description": "When false, the seller persists the configuration but suppresses fires. Use to pause a noisy subscriber without losing the registration. Sellers MUST NOT skip persisting the entry when `active: false` \u2014 the buyer's next `sync_accounts` MUST observe the same array, otherwise the buyer cannot distinguish pause from drop. Paused configs may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time. Reactivation requires full SSRF validation with connect pinning plus proof-of-control for any tuple without current valid proof." + "description": "When false, the seller persists the configuration but suppresses fires. Use to pause a noisy subscriber without losing the registration. Sellers MUST NOT skip persisting the entry when `active: false` — the buyer's next `sync_accounts` MUST observe the same array, otherwise the buyer cannot distinguish pause from drop. Paused configs may skip only the outbound proof challenge while inactive; sellers MUST still enforce URL parsing, HTTPS, hostname normalization, and reserved-range rejection at write time. Reactivation requires full SSRF validation with connect pinning plus proof-of-control for any tuple without current valid proof." }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, "required": [ @@ -91,22 +90,11 @@ ], "allOf": [ { - "if": { - "required": [ - "product_payload_view" - ] - }, + "if": { "required": ["product_payload_view"] }, "then": { "properties": { "event_types": { - "contains": { - "enum": [ - "product.created", - "product.updated", - "product.priced", - "product.removed" - ] - } + "contains": { "enum": ["product.created", "product.updated", "product.priced", "product.removed"] } } } } @@ -187,4 +175,4 @@ } } ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-canonical-content-digest.json b/schemas/cache/3.2.0-beta.9/core/reporting-canonical-content-digest.json new file mode 100644 index 000000000..81a7f6270 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-canonical-content-digest.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-canonical-content-digest.json", + "title": "Reporting Canonical Content Digest", + "x-status": "experimental", + "description": "Cryptographic digest of logical reporting rows under an immutable canonicalization contract.", + "type": "object", + "properties": { + "algorithm": { "type": "string", "const": "sha256" }, + "value": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" }, + "canonicalization_id": { "type": "string", "minLength": 1, "maxLength": 128 }, + "canonicalization_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", "description": "Location of the exact immutable canonicalization contract. Consumers verify canonicalization_sha256 before applying it." }, + "canonicalization_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" } + }, + "required": ["algorithm", "value", "canonicalization_id", "canonicalization_uri", "canonicalization_sha256"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json b/schemas/cache/3.2.0-beta.9/core/reporting-canonicalization-contract.json similarity index 55% rename from schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json rename to schemas/cache/3.2.0-beta.9/core/reporting-canonicalization-contract.json index 0ab27fc34..33f7c203d 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-canonicalization-contract.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-canonicalization-contract.json @@ -1,34 +1,18 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-canonicalization-contract.json", "title": "Reporting Canonicalization Contract", "x-status": "experimental", "description": "Executable, immutable contract for producing the canonical logical-report bytes hashed by reporting-canonical-content-digest.json. The fetched document uses application/vnd.adcp.reporting-canonicalization+json and is verified by SHA-256 before parsing.", "type": "object", "properties": { - "contract_version": { - "type": "string", - "const": "1.0" - }, - "media_type": { - "type": "string", - "const": "application/vnd.adcp.reporting-canonicalization+json" - }, - "algorithm": { - "type": "string", - "const": "adcp_jcs_rows_v1" - }, - "schema_sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$", - "description": "Digest of the exact row schema to which this contract applies." - }, + "contract_version": { "type": "string", "const": "1.0" }, + "media_type": { "type": "string", "const": "application/vnd.adcp.reporting-canonicalization+json" }, + "algorithm": { "type": "string", "const": "adcp_jcs_rows_v1" }, + "schema_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact row schema to which this contract applies." }, "primary_keys": { "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 128 - }, + "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "minItems": 1, "uniqueItems": true, "description": "Ordered scalar fields used to sort rows and reject duplicate logical rows. This MUST equal the offering's primary_keys." @@ -38,51 +22,22 @@ "items": { "type": "object", "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 128, - "pattern": "^[A-Za-z0-9_.:-]{1,128}$" - }, - "input_rows": { - "type": "array", - "items": { - "type": "object" - } - }, - "canonical_utf8_base64": { - "type": "string", - "minLength": 1, - "description": "Base64 of the exact expected canonical UTF-8 bytes." - }, - "sha256": { - "type": "string", - "pattern": "^[A-Fa-f0-9]{64}$" - } + "name": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$" }, + "input_rows": { "type": "array", "items": { "type": "object" } }, + "canonical_utf8_base64": { "type": "string", "minLength": 1, "description": "Base64 of the exact expected canonical UTF-8 bytes." }, + "sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" } }, - "required": [ - "name", - "input_rows", - "canonical_utf8_base64", - "sha256" - ], + "required": ["name", "input_rows", "canonical_utf8_base64", "sha256"], "additionalProperties": false }, "minItems": 2, "description": "Cross-language conformance vectors. They MUST include an empty report and an ordering/encoding case." } }, - "required": [ - "contract_version", - "media_type", - "algorithm", - "schema_sha256", - "primary_keys", - "golden_vectors" - ], + "required": ["contract_version", "media_type", "algorithm", "schema_sha256", "primary_keys", "golden_vectors"], "x-adcp-validation": { "algorithm": "adcp_jcs_rows_v1 rejects duplicate JSON object keys, non-finite numbers, lone Unicode surrogates, missing/non-scalar primary keys, and duplicate primary-key tuples. Validate every row against the pinned row schema; do not normalize Unicode. RFC 8785-encode each primary-key value array and sort rows by unsigned lexicographic comparison of those UTF-8 bytes. RFC 8785-encode each complete row, then emit the UTF-8 bytes for '[' + the encoded rows joined by ',' + ']'. SHA-256 is computed over exactly those bytes.", "binding": "schema_sha256 and primary_keys MUST exactly equal the selected offering. SDKs MUST reproduce every golden vector's canonical_utf8_base64 and sha256 before using the contract." }, "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-capabilities.json b/schemas/cache/3.2.0-beta.9/core/reporting-capabilities.json index 1bc02ecef..8fbf31353 100644 --- a/schemas/cache/3.2.0-beta.9/core/reporting-capabilities.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-capabilities.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-capabilities.json", "title": "Reporting Capabilities", "description": "Reporting capabilities available for a product", "type": "object", @@ -8,7 +9,7 @@ "type": "array", "description": "Supported reporting frequency options", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/reporting-frequency.json" + "$ref": "/schemas/enums/reporting-frequency.json" }, "minItems": 1, "uniqueItems": true @@ -37,11 +38,23 @@ "type": "boolean", "description": "Whether this product supports webhook-based reporting notifications" }, + "reporting_delivery_offering_ids": { + "type": "array", + "description": "Product-scoped subset of get_adcp_capabilities.media_buy.reporting_delivery.offerings[].offering_id that packages using this product can satisfy. This binds seller-wide managed-delivery offerings to product/package eligibility. An empty array explicitly declares no managed offering; absence means product-level applicability is unknown and MUST NOT be inferred from the seller-wide list. Account, seat, credential, or provider constraints may narrow support further during sync_accounts validation.", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:-]{1,128}$", + "x-entity": "reporting_offering" + }, + "uniqueItems": true + }, "available_metrics": { "type": "array", "description": "Metrics available in reporting. Impressions and spend are always implicitly included. When a creative format declares reported_metrics, buyers receive the intersection of these product-level metrics and the format's reported_metrics.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/available-metric.json" + "$ref": "/schemas/enums/available-metric.json" }, "uniqueItems": true, "examples": [ @@ -60,23 +73,20 @@ }, "vendor_metrics": { "type": "array", - "description": "Vendor-defined metrics this product can report, beyond the closed `available_metrics` enum. Each entry is a pointer (`{ vendor, metric_id }`) into the vendor's metric catalog \u2014 the canonical definition (standard alignment, accreditations, methodology, unit, human-readable description) lives at the vendor's `get_adcp_capabilities.measurement.metrics[]`, queried once per vendor when needed. Use this for proprietary metrics like attention scores, emissions, panel-based demographics, or platform-native social metrics not yet in the standard enum. Sellers populate values in delivery via `delivery-metrics.json#/properties/vendor_metric_values`. The metric is identified by the tuple `(vendor, metric_id)`; identifiers are namespaced by the vendor, so the same `metric_id` may mean different things in different vendors' vocabularies. Semantic uniqueness key is `(vendor.domain, vendor.brand_id, metric_id)`; sellers MUST de-duplicate before emission and MUST NOT declare the same vendor metric twice. Buyers MAY treat duplicate `(vendor, metric_id)` rows as a seller-side conformance bug. (JSON Schema `uniqueItems` is not used here because BrandRef carries optional fields whose absence/presence would defeat deep-equal \u2014 uniqueness is on the semantic key, enforced at build/validation time on the seller side.) Promotion path: when the industry converges on a metric via a published standard, the spec adds it to the closed `available_metrics` enum and the vendor extensions become historical aliases.", + "description": "Vendor-defined metrics this product can report, beyond the closed `available_metrics` enum. Each entry is a pointer (`{ vendor, metric_id }`) into the vendor's metric catalog — the canonical definition (standard alignment, accreditations, methodology, unit, human-readable description) lives at the vendor's `get_adcp_capabilities.measurement.metrics[]`, queried once per vendor when needed. Use this for proprietary metrics like attention scores, emissions, panel-based demographics, or platform-native social metrics not yet in the standard enum. Sellers populate values in delivery via `delivery-metrics.json#/properties/vendor_metric_values`. The metric is identified by the tuple `(vendor, metric_id)`; identifiers are namespaced by the vendor, so the same `metric_id` may mean different things in different vendors' vocabularies. Semantic uniqueness key is `(vendor.domain, vendor.brand_id, metric_id)`; sellers MUST de-duplicate before emission and MUST NOT declare the same vendor metric twice. Buyers MAY treat duplicate `(vendor, metric_id)` rows as a seller-side conformance bug. (JSON Schema `uniqueItems` is not used here because BrandRef carries optional fields whose absence/presence would defeat deep-equal — uniqueness is on the semantic key, enforced at build/validation time on the seller side.) Promotion path: when the industry converges on a metric via a published standard, the spec adds it to the closed `available_metrics` enum and the vendor extensions become historical aliases.", "items": { "type": "object", "properties": { "vendor": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-ref.json", + "$ref": "/schemas/core/brand-ref.json", "description": "Vendor that defines and computes this metric. The vendor's `brand.json` is the discovery anchor for the measurement agent (entry with `type: 'measurement'` in the `agents[]` array); the metric's standard alignment, accreditations, and methodology live at that agent's `get_adcp_capabilities.measurement.metrics[]` and are not duplicated inline here." }, "metric_id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vendor-metric-id.json", + "$ref": "/schemas/core/vendor-metric-id.json", "description": "Identifier for the metric within the vendor's vocabulary (e.g., `attention_units`, `gco2e_per_impression`, `demographic_reach`)." } }, - "required": [ - "vendor", - "metric_id" - ], + "required": ["vendor", "metric_id"], "additionalProperties": false } }, @@ -93,7 +103,7 @@ "description": "Whether this product supports keyword-level metric breakdowns in delivery reporting (by_keyword within by_package)" }, "supports_geo_breakdown": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-breakdown-support.json", + "$ref": "/schemas/core/geo-breakdown-support.json", "description": "Geographic breakdown support for this product. Declares which geo levels and systems are available for by_geo reporting within by_package." }, "supports_device_type_breakdown": { @@ -109,7 +119,7 @@ "description": "Whether this product supports audience segment breakdowns in delivery reporting (by_audience within by_package)" }, "supports_demographic_breakdown": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-reporting-capability.json", + "$ref": "/schemas/core/demographic-reporting-capability.json", "description": "Product-scoped demographic breakdown support for by_demographic reporting. Declares reportable age ranges and measurement systems independently from demographic targeting execution." }, "supports_placement_breakdown": { @@ -130,56 +140,44 @@ }, "supports_collection_property_breakdown": { "type": "boolean", - "description": "Whether this product supports collection \u00d7 property intersection reporting (by_collection_property within by_package)." + "description": "Whether this product supports collection × property intersection reporting (by_collection_property within by_package)." }, "supports_installment_property_breakdown": { "type": "boolean", - "description": "Whether this product supports installment \u00d7 property intersection reporting (by_installment_property within by_package)." + "description": "Whether this product supports installment × property intersection reporting (by_installment_property within by_package)." }, "supports_placement_property_breakdown": { "type": "boolean", - "description": "Whether this product supports placement \u00d7 property intersection reporting (by_placement_property within by_package)." + "description": "Whether this product supports placement × property intersection reporting (by_placement_property within by_package)." }, "supports_spot_breakdown": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/spot-reporting-capability.json", + "$ref": "/schemas/core/spot-reporting-capability.json", "description": "Spot-level as-run airing-log support and metrics available at spot grain for broadcast TV, radio, and other scheduled inventory." }, "date_range_support": { "type": "string", - "enum": [ - "date_range", - "lifetime_only" - ], + "enum": ["date_range", "lifetime_only"], "description": "Whether delivery data can be filtered to arbitrary date ranges. 'date_range' means the platform supports start_date/end_date parameters. 'lifetime_only' means the platform returns campaign lifetime totals and date range parameters are not accepted.", "default": "date_range" }, "windowed_pull_granularities": { "type": "array", - "description": "Granularities at which this product honors per-window pulls on get_media_buy_delivery (via request `time_granularity` + `include_window_breakdown: true`). Closes the GET-side half of the snapshot/log two-paths-parity contract for data-bearing events: a buyer who missed a webhook fire at any granularity listed here can reconstruct an identical payload by polling. Capability-scoped MUST \u2014 sellers MUST honor pulls at any granularity declared here, and MUST return UNSUPPORTED_GRANULARITY for pulls outside the set. Sellers MAY emit higher-frequency webhooks than they expose for pull (common where the webhook is a Kafka tap and historical reads go through a warehouse with coarser granularity); buyers see the gap up front via this capability and treat the webhook as primary for those frequencies. Absent or empty means the product only supports cumulative date-range pulls and full per-window recovery via GET is unavailable \u2014 see snapshot-and-log Rule 4.", + "description": "Granularities at which this product honors per-window pulls on get_media_buy_delivery (via request `time_granularity` + `include_window_breakdown: true`). Closes the GET-side half of the snapshot/log two-paths-parity contract for data-bearing events: a buyer who missed a webhook fire at any granularity listed here can reconstruct an identical payload by polling. Capability-scoped MUST — sellers MUST honor pulls at any granularity declared here, and MUST return UNSUPPORTED_GRANULARITY for pulls outside the set. Sellers MAY emit higher-frequency webhooks than they expose for pull (common where the webhook is a Kafka tap and historical reads go through a warehouse with coarser granularity); buyers see the gap up front via this capability and treat the webhook as primary for those frequencies. Absent or empty means the product only supports cumulative date-range pulls and full per-window recovery via GET is unavailable — see snapshot-and-log Rule 4.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/reporting-frequency.json" + "$ref": "/schemas/enums/reporting-frequency.json" }, "uniqueItems": true, "examples": [ - [ - "daily" - ], - [ - "hourly", - "daily" - ], - [ - "hourly", - "daily", - "monthly" - ] + ["daily"], + ["hourly", "daily"], + ["hourly", "daily", "monthly"] ] }, "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": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/measurement-window.json" + "$ref": "/schemas/core/measurement-window.json" }, "minItems": 1, "uniqueItems": true @@ -194,4 +192,4 @@ "date_range_support" ], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-control-total.json b/schemas/cache/3.2.0-beta.9/core/reporting-control-total.json similarity index 88% rename from schemas/cache/3.2.0-beta.6/core/reporting-control-total.json rename to schemas/cache/3.2.0-beta.9/core/reporting-control-total.json index a5bdec01a..3ba54b97d 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-control-total.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-control-total.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-control-total.json", "title": "Reporting Control Total", "x-status": "experimental", "description": "One profile-defined aggregate used to reconcile a reporting revision without rereading every row. Names and units are defined by the immutable report definition. Values use canonical strings so currency and large integer comparisons are exact across SDKs.", @@ -18,10 +19,7 @@ }, "value_type": { "type": "string", - "enum": [ - "integer", - "decimal" - ] + "enum": ["integer", "decimal"] }, "unit": { "type": "string", @@ -30,10 +28,6 @@ "description": "Profile-defined unit such as impressions or an ISO 4217 currency code." } }, - "required": [ - "name", - "value", - "value_type" - ], + "required": ["name", "value", "value_type"], "additionalProperties": false -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-coverage.json b/schemas/cache/3.2.0-beta.9/core/reporting-coverage.json new file mode 100644 index 000000000..3ca9c867b --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-coverage.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-coverage.json", + "title": "Reporting Coverage", + "x-status": "experimental", + "description": "Exact reporting-support denominator for one offering at one evaluation boundary. Coverage is independent of freshness, finality, and delivery health. It prevents a covered subset from being represented as a complete media-buy or campaign total.", + "type": "object", + "properties": { + "status": { "type": "string", "enum": ["full", "partial", "none", "unknown"] }, + "evaluated_at": { "type": "string", "format": "date-time" }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true, "description": "Exact media-buy denominator, including unsupported and unknown buys. An empty array is an explicitly evaluated zero-buy scope." }, + "fully_covered_media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true }, + "partially_covered_media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true }, + "unsupported_media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true }, + "unknown_media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true }, + "package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "uniqueItems": true, "description": "Exact package denominator for the evaluated media buys." }, + "covered_package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "uniqueItems": true }, + "unsupported_package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "uniqueItems": true }, + "unknown_package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "uniqueItems": true }, + "limitations": { + "type": "array", + "description": "Stable reasons that some requested scope is not covered by the exact selected offering. These are capability facts, not delivery failures.", + "items": { + "type": "object", + "properties": { + "reason": { "type": "string", "enum": ["offering_unsupported", "account_entitlement_unavailable", "credential_scope_insufficient", "provider_limitation", "capability_unknown"] }, + "media_buy_id": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, + "package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "minItems": 1, "uniqueItems": true } + }, + "required": ["reason", "media_buy_id"], + "additionalProperties": false + } + } + }, + "required": ["status", "evaluated_at", "media_buy_ids", "fully_covered_media_buy_ids", "partially_covered_media_buy_ids", "unsupported_media_buy_ids", "unknown_media_buy_ids", "package_ids", "covered_package_ids", "unsupported_package_ids", "unknown_package_ids", "limitations"], + "x-adcp-validation": { + "partition": "The four media-buy classification arrays MUST be pairwise disjoint and their union MUST equal media_buy_ids. The three package classification arrays MUST be pairwise disjoint and their union MUST equal package_ids. Every limitation media_buy_id and package_id MUST belong to those denominators.", + "status": "full requires every media buy to be fully covered and every package covered; the explicit empty denominator is full. partial requires at least one covered package or fully covered media buy and at least one partial, unsupported, or unknown item. none requires a nonempty denominator, no covered item, at least one unsupported item, and no unknown item. unknown requires a nonempty denominator, no covered item, and at least one unknown item.", + "aggregation": "Metrics computed only over covered_package_ids MUST be labeled partial whenever status is not full and MUST NOT be represented as complete media-buy or campaign totals. Implementations MUST NOT weaken the selected report definition to create an undeclared lowest-common-denominator profile." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json b/schemas/cache/3.2.0-beta.9/core/reporting-dataset-share-destination.json similarity index 54% rename from schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json rename to schemas/cache/3.2.0-beta.9/core/reporting-dataset-share-destination.json index a9c95f45e..a0a2d3ab9 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-dataset-share-destination.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-dataset-share-destination.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-dataset-share-destination.json", "title": "Reporting Dataset Share Destination", "x-status": "experimental", "description": "Recipient configuration for a producer-hosted reporting share. The caller either references an existing seller-issued immutable recipient/destination generation or asks the seller to provision one for the named recipient. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes disclosure of its feed and scope. Changing proof-bound recipient coordinates or the accepted delivery contract produces a new destination_ref. No bearer profile, token, private key, password, or other credential may appear here.", @@ -8,95 +9,35 @@ { "title": "Existing binding", "properties": { - "mode": { - "type": "string", - "const": "existing" - }, - "destination_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "x-entity": "reporting_destination", - "description": "Seller-issued immutable recipient/destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." - } + "mode": { "type": "string", "const": "existing" }, + "destination_ref": { "type": "string", "minLength": 1, "maxLength": 255, "x-entity": "reporting_destination", "description": "Seller-issued immutable recipient/destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." } }, - "required": [ - "mode", - "destination_ref" - ], + "required": ["mode", "destination_ref"], "additionalProperties": false }, { "title": "Provision recipient", "properties": { - "mode": { - "type": "string", - "const": "provision" - }, - "provider": { - "type": "object", - "description": "Data-sharing platform, such as databricks.com or snowflake.com.", - "properties": { - "domain": { - "type": "string", - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" - } - }, - "required": [ - "domain" - ], - "additionalProperties": false - }, - "access_mode": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$", - "description": "Provider access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing." - }, + "mode": { "type": "string", "const": "provision" }, + "provider": { "type": "object", "description": "Data-sharing platform, such as databricks.com or snowflake.com.", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "access_mode": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Provider access family, such as databricks_to_databricks, open_sharing, or secure_data_sharing." }, "recipient": { "type": "object", "description": "Intended buyer principal. The identity is interpreted by the provider and access mode; for example, a Databricks sharing identifier, Snowflake organization/account pair, or Open Sharing recipient email. It is an identifier, never a credential.", "properties": { - "identity": { - "type": "string", - "minLength": 1, - "maxLength": 512 - }, - "cloud": { - "type": "string", - "enum": [ - "aws", - "azure", - "gcp" - ] - }, - "region": { - "type": "string", - "minLength": 1, - "maxLength": 128 - } + "identity": { "type": "string", "minLength": 1, "maxLength": 512 }, + "cloud": { "type": "string", "enum": ["aws", "azure", "gcp"] }, + "region": { "type": "string", "minLength": 1, "maxLength": 128 } }, - "required": [ - "identity" - ], + "required": ["identity"], "dependencies": { - "cloud": [ - "region" - ], - "region": [ - "cloud" - ] + "cloud": ["region"], + "region": ["cloud"] }, "additionalProperties": false } }, - "required": [ - "mode", - "provider", - "access_mode", - "recipient" - ], + "required": ["mode", "provider", "access_mode", "recipient"], "additionalProperties": false } ], @@ -104,4 +45,4 @@ "authorization": "Bind every destination_ref to the stable authenticated caller. Reuse across that caller's accounts is permitted only after each account configuration independently verifies disclosure authority for its feed and media-buy scope. Reject unknown, unauthorized, and cross-caller refs indistinguishably.", "recipient_proof": "Before ready, prove recipient control and caller authority to disclose every selected account, feed, and media-buy scope. A proof-bound recipient or delivery-contract change creates a new destination_ref; old references remain stable for retained configurations and history. Voluntary configuration deactivation stops new publication but may preserve still-authorized historical access through seller_managed_access_ends_at. Caller authorization loss, account closure, or recipient revocation overrides that window and revokes the grant within authorization_revocation_seconds." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-capabilities.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-capabilities.json new file mode 100644 index 000000000..f9eba1df6 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-capabilities.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-capabilities.json", + "title": "Reporting Delivery Capabilities", + "x-status": "experimental", + "description": "Managed reporting status and durable delivery support. Each offerings entry is an atomic supported combination; buyers MUST NOT construct an unsupported cross-product. Presence requires media_buy.reporting_delivery in experimental_features and an RFC 9421 webhook-signing capability. Polling get_media_buy_delivery remains the compatibility baseline when this block is absent.", + "type": "object", + "properties": { + "supported": { "type": "boolean", "const": true }, + "configuration_task": { "type": "string", "const": "sync_accounts" }, + "status_task": { "type": "string", "const": "get_reporting_status" }, + "receipt_task": { "type": "string", "const": "sync_reporting_receipts" }, + "readiness_notification": { "type": "string", "const": "reporting.delivery_ready" }, + "offerings": { "type": "array", "items": { "$ref": "/schemas/core/reporting-delivery-offering.json" }, "minItems": 1, "description": "Atomic supported feed/profile/schedule/finality/method combinations. offering_id values MUST be unique." }, + "automated_recovery_window_seconds": { "type": "integer", "minimum": 0, "description": "Maximum late interval during which a due obligation may remain delayed while automated recovery continues before action_required." }, + "status_retention_days": { "type": "integer", "minimum": 1, "description": "Minimum period for which obligation, revision, and materialization metadata remain queryable." }, + "resource_retention_days": { "type": "integer", "minimum": 1, "description": "Minimum period after publication for which at least one verified exact materialization remains readable to every still-authorized intended consumer." }, + "supports_webhook_activity": { "type": "boolean", "default": false }, + "authorization_revocation_seconds": { "type": "integer", "minimum": 0, "description": "Maximum delay after caller/account authorization ends before seller-controlled transport access, provider grants, and write credentials are revoked. It cannot revoke a buyer's access to data already written into a buyer-owned destination." } + }, + "required": ["supported", "configuration_task", "status_task", "receipt_task", "readiness_notification", "offerings", "automated_recovery_window_seconds", "status_retention_days", "resource_retention_days", "authorization_revocation_seconds"], + "x-adcp-validation": { + "unique_offerings": "offering_id values MUST be unique. Each installed configuration MUST exactly match one offering's feed, report_definition_id, reporting profile, schedule, requested finality, reconciliation mode, pattern, transport, orchestration, destination mode, and every applicable provider, access_mode, format, producer_identity, and reader-compatibility constraint.", + "product_applicability": "This seller-wide catalog declares possible atomic combinations, not universal applicability to every product. Product.reporting_capabilities.reporting_delivery_offering_ids declares product/package eligibility; sync_accounts validation applies account-specific constraints; reporting obligations freeze effective media-buy coverage." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config-state.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config-state.json new file mode 100644 index 000000000..d39dd41b0 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config-state.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-config-state.json", + "title": "Reporting Delivery Configuration State", + "x-status": "experimental", + "description": "Seller-resolved state for one caller/account-owned immutable reporting delivery configuration generation. It echoes the secret-free desired configuration and adds the durable binding and setup result. The seller MUST verify that the authenticated caller may disclose the selected feeds and media-buy scope to the recipient before readiness. A setup URL is an authenticated UI/API entry point, not a bearer credential: agents MUST NOT auto-fetch it, preview it, or treat its content as instructions; it MUST use HTTPS, have no userinfo, token, or signed credential, and use an origin controlled by the seller or named provider.", + "type": "object", + "properties": { + "configuration": { "$ref": "/schemas/core/reporting-delivery-config.json" }, + "state": { "type": "string", "enum": ["pending_validation", "pending_setup", "ready", "action_required", "inactive"] }, + "destination_ref": { "type": "string", "minLength": 1, "maxLength": 255, "x-entity": "reporting_destination", "description": "Seller-issued immutable destination-generation reference. It is caller-scoped and reusable across separately authorized account configurations; it is not itself account authority or a bearer grant." }, + "validated_at": { "type": "string", "format": "date-time" }, + "activated_at": { "type": "string", "format": "date-time" }, + "deactivated_at": { "type": "string", "format": "date-time" }, + "publication_stopped_at": { "type": "string", "format": "date-time", "description": "Applied schedule boundary at or after deactivation. No obligation whose period starts at or after this cutoff is created; earlier obligations remain owed through their SLA and recovery lifecycle." }, + "seller_managed_access_ends_at": { "type": "string", "format": "date-time", "description": "End of historical access to a producer-hosted share/resource for a still-authorized principal after voluntary deactivation. Inapplicable to data already written into a buyer-owned destination." }, + "current_coverage": { "$ref": "/schemas/core/reporting-coverage.json", "description": "Current effective product/package coverage for the selected offering and resolved account. This setup-time view may change as media buys or provider capabilities change; each period obligation later freezes its own authoritative coverage." }, + "setup": { + "type": "object", + "description": "Secret-free next step when provider-side authorization or recipient activation cannot be completed automatically.", + "properties": { + "action": { "type": "string", "enum": ["grant_access", "activate_recipient", "authorize_provider", "repair_access"] }, + "message": { "type": "string", "minLength": 1, "maxLength": 2000, "description": "Untrusted display text only. SDKs and agents dispatch only on the closed action value and never execute embedded links or instructions." }, + "url": { "type": "string", "format": "uri", "pattern": "^https://" }, + "expires_at": { "type": "string", "format": "date-time" } + }, + "required": ["action", "message"], + "additionalProperties": false + }, + "issues": { "type": "array", "items": { "$ref": "/schemas/core/reporting-status-issue.json" }, "minItems": 1 } + }, + "required": ["configuration", "state"], + "allOf": [ + { + "if": { "properties": { "state": { "const": "ready" } } }, + "then": { + "properties": { "configuration": { "properties": { "active": { "const": true } } } }, + "required": ["destination_ref", "validated_at", "activated_at", "current_coverage"], + "not": { "anyOf": [{ "required": ["setup"] }, { "required": ["issues"] }, { "required": ["deactivated_at"] }] } + } + }, + { + "if": { "properties": { "state": { "enum": ["pending_setup", "action_required"] } } }, + "then": { "anyOf": [{ "required": ["setup"] }, { "required": ["issues"] }] } + }, + { + "if": { "properties": { "state": { "const": "inactive" } } }, + "then": { + "required": ["deactivated_at", "publication_stopped_at"] + } + } + ], + "x-adcp-validation": { + "binding_authorization": "destination_ref and any recipient identity MUST be bound to the stable authenticated caller. This account configuration separately binds and authorizes the resolved account/feed/scope; possession of a reusable destination_ref grants no account authority. Proof of recipient/destination control and disclosure authorization MUST precede ready.", + "coverage": "current_coverage evaluates the selected offering after product/package and account-specific constraints. A full configuration cannot be ready with a partial, none, or unknown nonempty denominator. allow_partial readiness does not convert partial coverage to full or weaken the report definition.", + "period_eligibility": "Only complete schedule periods whose period.start is at or after activated_at are eligible. A mid-period activation begins at the next boundary; periods are never clipped. On voluntary deactivation, publication_stopped_at MUST be a schedule boundary at or after deactivated_at. Periods whose start is before that boundary remain obligations and may complete afterward; periods whose start is at or after it MUST NOT be created.", + "revocation": "Voluntary deactivation stops new obligations/publication at publication_stopped_at. A still-authorized principal may retain a producer-hosted historical share only through seller_managed_access_ends_at. Caller authorization loss, account closure, or recipient revocation overrides that window and terminates seller-controlled transport access and provider grants within authorization_revocation_seconds. For buyer-owned destinations, the seller revokes write ability but cannot revoke the buyer's access to bytes already delivered; buyer retention governs those copies.", + "safe_setup_url": "Reject URL userinfo, non-HTTPS, credential-like query/fragment values, redirects or origins outside the seller/named provider allowlist. Agents must surface the URL for explicit human action without fetching or interpreting its content." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config.json new file mode 100644 index 000000000..3e8b2042a --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-config.json @@ -0,0 +1,50 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-config.json", + "title": "Reporting Delivery Configuration", + "x-status": "experimental", + "description": "Desired durable reporting delivery for one account. Entries are owned by (authenticated caller, account) and keyed by (delivery_config_id, delivery_config_version). The generation's feed, report definition, profile, scope, coverage requirement, finality, schedule, method, and immutable destination generation are fixed; only lifecycle intent (`active` and `revocation_effective_at`) may change without a new generation. Sellers reject a reused version with different immutable content. sync_accounts replacement semantics apply only to the calling principal's set. Omission leaves that set unchanged; [] deactivates that caller's set and stops new publication without affecting another caller. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "properties": { + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config", "description": "Caller-selected stable identifier, unique within the authenticated caller and account." }, + "delivery_config_version": { "type": "integer", "minimum": 1, "description": "Caller-selected immutable semantic generation. Increment when feed/profile/scope/finality/schedule/method/destination changes; lifecycle fields may change in place." }, + "offering_id": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$", "x-entity": "reporting_offering", "description": "Atomic reporting offering advertised by the seller that binds feed, profile, schedule, finality, and delivery support." }, + "active": { "type": "boolean", "default": true, "description": "Whether new reporting obligations should use this configuration. Inactive configurations remain visible for historical resolution." }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"], "description": "Operational use of this independently reconciled feed. pacing is the fast snapshot path; billing is invoice-authoritative. Event-level exposure is intentionally deferred until a privacy and authorization contract exists." }, + "report_definition_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_definition", "description": "Exact immutable semantic definition selected from the offering. This makes the expected obligation identity independently derivable and prevents attribution, timezone, source-mapping, or restatement-policy drift behind a profile label." }, + "reporting_profile": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$", "description": "Versioned semantic profile for the aggregate report, such as media_buy_delivery_v1. It MUST match the selected offering." }, + "scope": { + "type": "object", + "description": "Media buys covered by this configuration.", + "properties": { + "all_media_buys": { "type": "boolean", "const": true }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "minItems": 1, "uniqueItems": true } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + }, + "coverage_requirement": { "type": "string", "enum": ["full", "allow_partial"], "description": "Whether every package in the resolved media-buy scope must support the exact selected offering. full fails closed when any package is unsupported or unknown. allow_partial permits publication only for the explicitly covered package denominator; every revision and status response still exposes partial coverage and MUST NOT present covered-subset totals as whole-buy totals." }, + "required_finality": { "$ref": "/schemas/enums/reporting-finality.json", "description": "Finality the durable path must ultimately provide. Snapshot delivery may still precede an official requirement." }, + "reconciliation_mode": { "$ref": "/schemas/core/reporting-reconciliation-mode.json", "description": "Whether producer-side delivery evidence is sufficient or the selected consumer must submit an authenticated matching receipt. Billing MUST use consumer_receipt." }, + "schedule": { "$ref": "/schemas/core/reporting-schedule.json" }, + "method": { "$ref": "/schemas/core/reporting-delivery-method.json" }, + "revocation_effective_at": { "type": "string", "format": "date-time", "description": "Optional requested cutoff for deactivation. No new publication may begin after the applied cutoff; historical access is limited to the contracted recovery window." } + }, + "required": ["delivery_config_id", "delivery_config_version", "offering_id", "active", "feed_purpose", "report_definition_id", "reporting_profile", "scope", "coverage_requirement", "required_finality", "reconciliation_mode", "schedule", "method"], + "allOf": [ + { + "if": { "properties": { "feed_purpose": { "const": "billing" } }, "required": ["feed_purpose"] }, + "then": { "properties": { "reconciliation_mode": { "const": "consumer_receipt" } } } + }, + { + "if": { "properties": { "feed_purpose": { "const": "billing" } }, "required": ["feed_purpose"] }, + "then": { "properties": { "required_finality": { "const": "official" } } } + } + ], + "x-adcp-validation": { + "offering_applicability": "Resolve the seller-wide offering through every selected product's reporting_capabilities.reporting_delivery_offering_ids, then apply account, seat, credential, provider, and API constraints. Seller-wide advertisement alone is not proof that an individual package is eligible.", + "coverage_requirement": "A full configuration MUST NOT become ready for a current nonempty partial, none, or unknown scope and any later incomplete period becomes action_required with REPORTING_COVERAGE_INCOMPLETE. allow_partial MAY become ready when some scope is covered, but every obligation and revision freezes exact coverage and aggregate consumers keep the partial label." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-method.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-method.json new file mode 100644 index 000000000..b8283a584 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-method.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-method.json", + "title": "Reporting Delivery Method", + "x-status": "experimental", + "description": "Provider-neutral durable reporting delivery method. The caller may request protocol-managed provisioning or reuse an existing seller-issued binding. Transport names are open so new platforms do not require an AdCP enum change. Credentials, bearer profiles, and private keys MUST NOT appear. Sellers implementing this schema MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "oneOf": [ + { + "title": "File transfer", + "type": "object", + "properties": { + "pattern": { "type": "string", "const": "file_transfer", "description": "Immutable file/object publication with a manifest-last commit boundary." }, + "transport": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Storage transport such as s3, gcs, azure_blob, or sftp." }, + "orchestration": { "type": "string", "enum": ["producer_managed", "consumer_managed"], "description": "Party responsible for starting and monitoring the transfer. Independent of destination ownership and the service that copies bytes." }, + "destination": { "$ref": "/schemas/core/reporting-write-destination.json" }, + "format": { "type": "string", "enum": ["jsonl", "csv", "parquet", "avro", "orc"], "description": "Physical file format." } + }, + "required": ["pattern", "transport", "orchestration", "destination", "format"], + "additionalProperties": false + }, + { + "title": "Dataset share", + "type": "object", + "properties": { + "pattern": { "type": "string", "const": "dataset_share", "description": "Producer-hosted relation or share read through the intended recipient's access path." }, + "transport": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Sharing transport such as delta_sharing, snowflake_secure_sharing, or bigquery_authorized_view." }, + "orchestration": { "type": "string", "enum": ["producer_managed", "consumer_managed"], "description": "Party responsible for configuring and monitoring the share." }, + "destination": { "$ref": "/schemas/core/reporting-dataset-share-destination.json" } + }, + "required": ["pattern", "transport", "orchestration", "destination"], + "additionalProperties": false + }, + { + "title": "Warehouse materialization", + "type": "object", + "properties": { + "pattern": { "type": "string", "const": "warehouse_materialization", "description": "Exact-revision publication into a warehouse relation or partition." }, + "transport": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Warehouse or transfer transport such as bigquery, snowflake, databricks_sql, or gam_bigquery_transfer." }, + "orchestration": { "type": "string", "enum": ["producer_managed", "consumer_managed"], "description": "Party responsible for starting and monitoring materialization. consumer_managed covers platform transfer services that physically write consumer-owned tables." }, + "destination": { "$ref": "/schemas/core/reporting-write-destination.json" } + }, + "required": ["pattern", "transport", "orchestration", "destination"], + "additionalProperties": false + } + ] +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-offering.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-offering.json new file mode 100644 index 000000000..0d83f3108 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-offering.json @@ -0,0 +1,93 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-offering.json", + "title": "Reporting Delivery Offering", + "x-status": "experimental", + "description": "One atomic combination a seller can honor. Buyers MUST NOT form a cross-product from separate capability arrays; each installed configuration selects one offering_id and values within that offering.", + "type": "object", + "properties": { + "offering_id": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$", "x-entity": "reporting_offering" }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"], "description": "Operational use of this independently scheduled offering. pacing commonly selects short-period snapshot revisions; billing requires official revisions and consumer reconciliation." }, + "report_definition_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_definition", "description": "Immutable semantic definition for metric, grain, attribution, action-report-time, timezone/calendar, source/API mapping, and restatement/finality policy. Configurations and revisions MUST echo this exact value." }, + "report_definition_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", "description": "Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin." }, + "report_definition_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact report-definition bytes. SDKs verify this before parsing and cache by digest." }, + "reporting_profile": { + "type": "object", + "description": "Machine-readable semantic and validation contract for delivered rows.", + "properties": { + "id": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9_.:-]{1,128}$" }, + "version": { "type": "string", "minLength": 1, "maxLength": 64 }, + "schema_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", "description": "Authenticated seller/provider or AdCP-registry HTTPS origin only; never an IP literal, userinfo URL, redirect target, or mutable validation authority." }, + "schema_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact schema bytes. SDKs verify this before parsing and cache by digest." }, + "schema_dialect": { "type": "string", "const": "https://json-schema.org/draft/2020-12/schema", "description": "Closed SDK-bundled dialect. The SDK never resolves a metaschema over the network, and the fetched document's $schema MUST equal this value." }, + "schema_ref_policy": { "type": "string", "const": "local_fragment_only", "description": "The fetched schema is a self-contained bundle. Every $ref is a local # fragment; remote and relative-document dependencies are forbidden." }, + "grain": { "type": "string", "minLength": 1, "maxLength": 128, "description": "Stable description of what one logical row represents." }, + "primary_keys": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "minItems": 1, "uniqueItems": true }, + "canonicalization_id": { "type": "string", "minLength": 1, "maxLength": 128, "description": "Rules for stable logical row ordering, value encoding, nulls, and schema used by canonical_content_digest." }, + "canonicalization_contract_version": { "type": "string", "const": "1.0" }, + "canonicalization_media_type": { "type": "string", "const": "application/vnd.adcp.reporting-canonicalization+json" }, + "canonicalization_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", "description": "Retrievable exact canonicalization contract on the authenticated seller/provider or AdCP-registry origin. SDKs apply the same bounded, redirect-free SSRF controls as schema_uri and verify canonicalization_sha256 before use." }, + "canonicalization_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact canonicalization contract identified by canonicalization_id." } + }, + "required": ["id", "version", "schema_uri", "schema_sha256", "schema_dialect", "schema_ref_policy", "grain", "primary_keys", "canonicalization_id", "canonicalization_contract_version", "canonicalization_media_type", "canonicalization_uri", "canonicalization_sha256"], + "additionalProperties": false + }, + "schedule": { "$ref": "/schemas/core/reporting-schedule-offering.json", "description": "Period and availability SLA this offering can honor. For example, PT1H with snapshot finality explicitly advertises hourly provisional snapshots; a separate P1D official offering advertises daily finalized reporting." }, + "supported_finality": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "minItems": 1, "uniqueItems": true, "description": "Finality classes available under this exact report definition, schedule, and delivery method. snapshot is an explicit provisional capability, not inferred from poll frequency. Use separate atomic offerings when snapshot and official schedules or methods differ." }, + "reconciliation_mode": { "$ref": "/schemas/core/reporting-reconciliation-mode.json", "description": "Receipt contract included in this atomic offering. Billing offerings MUST require consumer_receipt." }, + "method": { + "type": "object", + "properties": { + "pattern": { "type": "string", "enum": ["file_transfer", "dataset_share", "warehouse_materialization"] }, + "transport": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$" }, + "orchestration": { "type": "string", "enum": ["producer_managed", "consumer_managed"] }, + "destination_modes": { "type": "array", "items": { "type": "string", "enum": ["provision", "existing"] }, "minItems": 1, "uniqueItems": true }, + "provider": { "type": "object", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "format": { "type": "string", "enum": ["jsonl", "csv", "parquet", "avro", "orc"] }, + "access_mode": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$" }, + "producer_identity": { + "type": "object", + "description": "Seller principal a buyer grants access to for this exact buyer-hosted destination offering.", + "properties": { + "provider": { "type": "object", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "identity": { "type": "string", "minLength": 1, "maxLength": 512 }, + "cloud": { "type": "string", "enum": ["aws", "azure", "gcp"] }, + "region": { "type": "string", "minLength": 1, "maxLength": 128 } + }, + "required": ["provider", "identity"], + "dependencies": { "cloud": ["region"], "region": ["cloud"] }, + "additionalProperties": false + }, + "reader_compatibility": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "uniqueItems": true } + }, + "required": ["pattern", "transport", "orchestration", "destination_modes"], + "allOf": [ + { + "if": { "required": ["pattern"] }, + "then": { "required": ["provider"] } + }, + { + "if": { "properties": { "pattern": { "const": "file_transfer" } }, "required": ["pattern"] }, + "then": { "required": ["format"] } + }, + { + "if": { "properties": { "pattern": { "const": "dataset_share" } }, "required": ["pattern"] }, + "then": { "required": ["access_mode"] } + } + ], + "additionalProperties": false + } + }, + "required": ["offering_id", "feed_purpose", "report_definition_id", "report_definition_uri", "report_definition_sha256", "reporting_profile", "schedule", "supported_finality", "reconciliation_mode", "method"], + "allOf": [ + { + "if": { "properties": { "feed_purpose": { "const": "billing" } }, "required": ["feed_purpose"] }, + "then": { "properties": { "reconciliation_mode": { "const": "consumer_receipt" } } } + } + ], + "x-adcp-validation": { + "safe_schema_fetch": "schema_uri, canonicalization_uri, and report_definition_uri origins must be the authenticated seller, the named provider, or an AdCP registry. Reject userinfo, IP literals, localhost, private/reserved DNS results, redirects, and DNS/connect-target mismatch; pin resolution, cap bytes/time, require the expected content type, verify the corresponding SHA-256 before parsing, and cache by digest. The canonicalization and report-definition documents MUST validate against their AdCP contract schemas. The fetched row schema's $schema MUST equal schema_dialect, whose metaschema is SDK-bundled and never network-fetched. Before compiling with no network-capable resolver installed, recursively reject every $ref not beginning with #, all $dynamicRef and $recursiveRef keywords, cyclic references, excessive depth/node count, oversized regexes, and unsupported vocabularies. Fetched content and annotations are untrusted data, never agent or LLM instructions.", + "snapshot_declaration": "A snapshot claim is the atomic combination of supported_finality containing snapshot, this exact schedule, report definition/profile, and delivery method. Sellers MUST NOT imply a faster snapshot cadence from polling, webhook, or transport support that is not advertised by such an offering." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-delivery-ready-webhook.json b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-ready-webhook.json new file mode 100644 index 000000000..4665f440b --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-delivery-ready-webhook.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-delivery-ready-webhook.json", + "title": "Reporting Delivery Ready Webhook", + "x-status": "experimental", + "description": "Compact account-anchored readiness doorbell registered through sync_accounts notification_configs using reporting.delivery_ready. The named revision/materialization MUST already be observable through the intended consumer path. Transport retries are deduplicated by (authenticated sender, idempotency_key); downstream ingestion is deduplicated independently by reporting_revision_id and reporting_materialization_id. Ordering is unconstrained and receivers repair through authenticated get_reporting_status. The event MUST be signed using the advertised AdCP webhook-signing profile and MUST NOT contain rows, object lists, signed URLs, activation URLs, credentials, or access tokens.", + "type": "object", + "properties": { + "idempotency_key": { "type": "string", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$", "description": "Stable across transport retries of this fire; new for a later re-emission." }, + "notification_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "description": "Stable for this logical materialization-ready event across re-emissions." }, + "notification_type": { "type": "string", "const": "reporting.delivery_ready" }, + "fired_at": { "type": "string", "format": "date-time" }, + "subscriber_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$" }, + "account_id": { "type": "string", "minLength": 1, "x-entity": "account" }, + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config" }, + "delivery_config_version": { "type": "integer", "minimum": 1 }, + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, + "reporting_materialization_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_materialization" }, + "readiness": { "type": "string", "enum": ["available", "delivered"] }, + "finality": { "$ref": "/schemas/enums/reporting-finality.json" }, + "data_through": { "type": ["string", "null"], "format": "date-time" }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"] } + }, + "required": ["idempotency_key", "notification_id", "notification_type", "fired_at", "subscriber_id", "account_id", "delivery_config_id", "delivery_config_version", "feed_purpose", "reporting_revision_id", "reporting_materialization_id", "readiness", "finality", "data_through"], + "x-adcp-validation": { + "authorization": "The authenticated webhook signer, subscriber_id, account_id, configuration generation, revision, and materialization MUST belong to one caller/account binding; receivers MUST repair through an authenticated status read rather than trusting event contents alone.", + "deduplication": "Deduplicate transport retries by (authenticated sender, idempotency_key), then deduplicate ingestion independently by reporting_revision_id and reporting_materialization_id." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json b/schemas/cache/3.2.0-beta.9/core/reporting-file-compression.json similarity index 70% rename from schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json rename to schemas/cache/3.2.0-beta.9/core/reporting-file-compression.json index 03fa71674..78fef9c62 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-file-compression.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-file-compression.json @@ -1,13 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-file-compression.json", "title": "Reporting File Compression", "x-status": "experimental", "description": "Physical compression applied to each data object listed by a reporting file manifest.", "type": "string", - "enum": [ - "none", - "gzip", - "zstd", - "snappy" - ] -} \ No newline at end of file + "enum": ["none", "gzip", "zstd", "snappy"] +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-file-entry.json b/schemas/cache/3.2.0-beta.9/core/reporting-file-entry.json new file mode 100644 index 000000000..e622eeef2 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-file-entry.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-file-entry.json", + "title": "Reporting File Entry", + "x-status": "experimental", + "description": "One immutable data object committed by a reporting file manifest.", + "type": "object", + "properties": { + "object_ref": { "type": "string", "minLength": 1, "maxLength": 1024, "description": "Credential-free object identifier resolved through the configured destination." }, + "size_bytes": { "type": "integer", "minimum": 0 }, + "sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" }, + "row_count": { "type": "integer", "minimum": 0 }, + "partition": { + "type": "object", + "additionalProperties": { "type": "string", "maxLength": 512 }, + "maxProperties": 32 + } + }, + "required": ["object_ref", "size_bytes", "sha256", "row_count"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-file-manifest.json b/schemas/cache/3.2.0-beta.9/core/reporting-file-manifest.json new file mode 100644 index 000000000..f1747cfed --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-file-manifest.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-file-manifest.json", + "title": "Reporting File Manifest", + "x-status": "experimental", + "description": "Normative manifest for one completed file-transfer materialization. Producers write every data object first and publish this manifest last. Its appearance is the commit point: consumers MUST ignore unlisted objects and MUST NOT process the materialization before a digest-valid complete manifest is visible.", + "type": "object", + "properties": { + "manifest_version": { "type": "string", "const": "1.0" }, + "complete": { "type": "boolean", "const": true }, + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, + "reporting_obligation_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_obligation" }, + "reporting_materialization_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_materialization" }, + "period": { + "type": "object", + "properties": { + "start": { "type": "string", "format": "date-time" }, + "end": { "type": "string", "format": "date-time" }, + "source_timezone": { "type": "string", "minLength": 1 } + }, + "required": ["start", "end", "source_timezone"], + "additionalProperties": false + }, + "format": { "type": "string", "enum": ["jsonl", "csv", "parquet", "avro", "orc"] }, + "compression": { "$ref": "/schemas/core/reporting-file-compression.json" }, + "files": { + "type": "array", + "items": { "$ref": "/schemas/core/reporting-file-entry.json" }, + "minItems": 1 + }, + "total_size_bytes": { "type": "integer", "minimum": 0 }, + "row_count": { "type": "integer", "minimum": 0 }, + "control_totals": { + "type": "array", + "items": { "$ref": "/schemas/core/reporting-control-total.json" }, + "uniqueItems": true + }, + "created_at": { "type": "string", "format": "date-time" } + }, + "required": ["manifest_version", "complete", "reporting_revision_id", "reporting_obligation_id", "reporting_materialization_id", "period", "format", "compression", "files", "total_size_bytes", "row_count", "control_totals", "created_at"], + "x-adcp-validation": { + "manifest_digest": "reporting_resource.manifest_sha256 MUST equal SHA-256 over the exact manifest bytes before parsing.", + "object_set": "object_ref values MUST be unique. total_size_bytes and row_count MUST equal the sums across files. Every file checksum MUST be verified before downstream commit.", + "identity_match": "The revision, obligation, materialization, period, format, row count, and control totals MUST equal the referenced ledger records and verification evidence." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-materialization.json b/schemas/cache/3.2.0-beta.9/core/reporting-materialization.json new file mode 100644 index 000000000..b8ac21ea7 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-materialization.json @@ -0,0 +1,75 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-materialization.json", + "title": "Reporting Materialization", + "x-status": "experimental", + "description": "One attempt to expose an immutable reporting revision through a configured durable delivery method. Automated retry creates a new materialization and attempt number while preserving reporting_revision_id. available is a verified producer-hosted pull/share claim; delivered is a verified recipient/destination claim. Existing per-buy inline reporting remains on its existing data API and is outside this v1 managed ledger.", + "type": "object", + "properties": { + "reporting_materialization_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_materialization" }, + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, + "reporting_obligation_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_obligation", "description": "Destination-specific obligation this materialization attempts to satisfy." }, + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config", "description": "Durable configuration that requested this materialization." }, + "delivery_config_version": { "type": "integer", "minimum": 1 }, + "destination_ref": { "type": "string", "minLength": 1, "maxLength": 255, "x-entity": "reporting_destination", "description": "Immutable caller-owned destination generation selected by the account-authorized obligation. It may be reused by the same caller across other independently authorized accounts." }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"] }, + "method": { "type": "string", "enum": ["file_transfer", "dataset_share", "warehouse_materialization"] }, + "transport": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$" }, + "attempt": { "type": "integer", "minimum": 1 }, + "status": { "type": "string", "enum": ["pending", "available", "delivered", "failed"], "description": "Lifecycle of this attempt. pending may transition once to available, delivered, or failed; terminal evidence is immutable. Staleness is evaluated in get_reporting_status health, not stored as a materialization state." }, + "ready_at": { "type": "string", "format": "date-time", "description": "When consumer-path or destination verification completed." }, + "failed_at": { "type": "string", "format": "date-time" }, + "failure_code": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Z][A-Z0-9_]*$", "description": "Stable safe failure classification. MUST NOT include credentials or provider response bodies." }, + "resource": { "$ref": "/schemas/core/reporting-resource.json" }, + "verification": { "$ref": "/schemas/core/reporting-verification.json" }, + "created_at": { "type": "string", "format": "date-time" } + }, + "required": ["reporting_materialization_id", "reporting_revision_id", "reporting_obligation_id", "delivery_config_id", "delivery_config_version", "destination_ref", "feed_purpose", "method", "attempt", "status", "created_at"], + "allOf": [ + { + "if": { "properties": { "status": { "enum": ["available", "delivered"] } }, "required": ["status"] }, + "then": { "required": ["ready_at", "resource", "verification"] } + }, + { + "if": { "properties": { "status": { "const": "failed" } }, "required": ["status"] }, + "then": { "required": ["failed_at", "failure_code"] } + }, + { + "if": { "properties": { "method": { "const": "file_transfer" } }, "required": ["method"] }, + "then": { + "properties": { + "resource": { "properties": { "kind": { "const": "manifest" } } }, + "verification": { "properties": { "physical_checksums": { "minItems": 1 } }, "required": ["physical_checksums"] } + } + } + }, + { + "if": { "properties": { "method": { "const": "dataset_share" } }, "required": ["method"] }, + "then": { + "properties": { + "resource": { "properties": { "kind": { "const": "dataset" } } }, + "verification": { "properties": { "verification_path": { "const": "representative_consumer" } } } + } + } + }, + { + "if": { "properties": { "method": { "const": "warehouse_materialization" } }, "required": ["method"] }, + "then": { + "properties": { + "resource": { "properties": { "kind": { "const": "warehouse_relation" } } }, + "verification": { "properties": { "verification_path": { "const": "destination" } } } + } + } + }, + { + "if": { "properties": { "feed_purpose": { "const": "billing" }, "status": { "enum": ["available", "delivered"] } }, "required": ["feed_purpose", "status"] }, + "then": { "properties": { "verification": { "properties": { "verification_profile": { "const": "canonical_digest" } }, "required": ["canonical_content_digest", "verification_profile"] } } } + } + ], + "x-adcp-validation": { + "revision_match": "reporting_revision_id names destination-independent content. verification.row_count and control_totals MUST equal that revision; canonical_content_digest MUST also equal it when present.", + "obligation_match": "reporting_obligation_id, delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method MUST match one caller/account-bound obligation. This join is what permits one revision to fan out to many destinations and principals.", + "authorization": "The caller MUST be authorized for the referenced account and destination binding. Cross-caller and cross-account identifiers MUST be rejected without revealing whether they exist." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-obligation.json b/schemas/cache/3.2.0-beta.9/core/reporting-obligation.json new file mode 100644 index 000000000..2fce6543a --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-obligation.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-obligation.json", + "title": "Reporting Obligation", + "x-status": "experimental", + "description": "Period-level status joining what reporting was expected to any produced immutable revisions and delivery materializations. An obligation exists before its first revision or webhook, making missing-first-report detection possible. All nested revisions and materializations MUST match this obligation's authenticated caller/account, configuration generation, report definition, feed, period, and scope.", + "type": "object", + "properties": { + "reporting_obligation_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_obligation" }, + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config" }, + "delivery_config_version": { "type": "integer", "minimum": 1 }, + "report_definition_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_definition" }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"] }, + "reporting_profile": { "type": "string", "minLength": 1, "maxLength": 128 }, + "account_id": { "type": "string", "minLength": 1, "x-entity": "account" }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true, "description": "Exact frozen media-buy denominator resolved for this period, including buys with zero rows. An empty array is the definitive zero-buy set; omission is never used to mean all, empty, or unknown." }, + "scope_resolved_at": { "type": "string", "format": "date-time", "description": "Instant at which the configured scope was resolved and frozen for this obligation. For all_media_buys, include every caller-authorized account media buy whose effective flight overlaps the half-open period and was known by this cutoff. Later-created or backdated buys do not rewrite this obligation." }, + "coverage": { "$ref": "/schemas/core/reporting-coverage.json", "description": "Immutable effective coverage of the exact selected offering at this period boundary. Delivery health is evaluated separately over the covered denominator." }, + "period": { + "type": "object", + "properties": { + "start": { "type": "string", "format": "date-time" }, + "end": { "type": "string", "format": "date-time" }, + "source_timezone": { "type": "string", "minLength": 1 } + }, + "required": ["start", "end", "source_timezone"], + "additionalProperties": false + }, + "expected_at": { "type": "string", "format": "date-time" }, + "schedule": { "$ref": "/schemas/core/reporting-schedule.json", "description": "Resolved immutable schedule generation that created this obligation." }, + "destination_ref": { "type": "string", "minLength": 1, "maxLength": 255, "x-entity": "reporting_destination", "description": "Immutable caller-owned destination generation selected by this account-authorized obligation. The account/configuration join—not possession of this reusable reference—authorizes disclosure." }, + "required_finality": { "$ref": "/schemas/enums/reporting-finality.json" }, + "reconciliation_mode": { "$ref": "/schemas/core/reporting-reconciliation-mode.json" }, + "reconciliation_status": { "type": "string", "enum": ["not_required", "pending", "accepted", "rejected"], "description": "Consumer agreement state for the current required revision. A later superseding revision returns a receipt-required obligation to pending until that revision is accepted." }, + "health": { "$ref": "/schemas/enums/reporting-health.json" }, + "production_status": { "type": "string", "enum": ["not_due", "pending", "published", "failed"], "description": "Whether any revision has been produced for this obligation. published includes zero-row revisions." }, + "revision_count": { "type": "integer", "minimum": 0, "description": "Number of revision records for this obligation in the consistent ledger snapshot." }, + "materialization_count": { "type": "integer", "minimum": 0, "description": "Number of materialization records for this obligation's revisions in the consistent ledger snapshot." }, + "successful_materialization_count": { "type": "integer", "minimum": 0, "description": "Number of available/delivered verified materializations in the consistent ledger snapshot." }, + "receipt_count": { "type": "integer", "minimum": 0, "description": "Complete number of authenticated receipts associated with this obligation in the ledger snapshot." }, + "accepted_receipt_count": { "type": "integer", "minimum": 0, "description": "Number of accepted receipts. At most one current accepted receipt per consumer and revision contributes to reconciliation_status." }, + "issues": { "type": "array", "items": { "$ref": "/schemas/core/reporting-status-issue.json" } }, + "resource_retained_until": { "type": "string", "format": "date-time", "description": "Minimum time through which at least one verified materialization for a completed obligation remains readable." } + }, + "required": ["reporting_obligation_id", "delivery_config_id", "delivery_config_version", "report_definition_id", "feed_purpose", "reporting_profile", "account_id", "media_buy_ids", "scope_resolved_at", "coverage", "period", "expected_at", "schedule", "destination_ref", "required_finality", "reconciliation_mode", "reconciliation_status", "health", "production_status", "revision_count", "materialization_count", "successful_materialization_count", "receipt_count", "accepted_receipt_count", "issues"], + "allOf": [ + { + "if": { "properties": { "health": { "enum": ["healthy", "complete"] } }, "required": ["health"] }, + "then": { + "properties": { + "production_status": { "const": "published" }, + "revision_count": { "minimum": 1 }, + "materialization_count": { "minimum": 1 }, + "successful_materialization_count": { "minimum": 1 }, + "issues": { "maxItems": 0 } + }, + "required": ["resource_retained_until"] + } + }, + { + "if": { "properties": { "production_status": { "const": "published" } }, "required": ["production_status"] }, + "then": { "properties": { "revision_count": { "minimum": 1 } } } + }, + { + "if": { "properties": { "reconciliation_mode": { "const": "delivery_only" } }, "required": ["reconciliation_mode"] }, + "then": { "properties": { "reconciliation_status": { "const": "not_required" } } } + }, + { + "if": { "properties": { "reconciliation_mode": { "const": "consumer_receipt" }, "health": { "enum": ["healthy", "complete"] } }, "required": ["reconciliation_mode", "health"] }, + "then": { + "properties": { + "reconciliation_status": { "const": "accepted" }, + "receipt_count": { "minimum": 1 }, + "accepted_receipt_count": { "minimum": 1 } + } + } + }, + { + "if": { "properties": { "health": { "enum": ["delayed", "action_required"] } }, "required": ["health"] }, + "then": { "properties": { "issues": { "minItems": 1 } } } + }, + { + "if": { "properties": { "production_status": { "const": "failed" } }, "required": ["production_status"] }, + "then": { "properties": { "issues": { "minItems": 1 } } } + } + ], + "x-adcp-validation": { + "scope_resolution": "scope_resolved_at MUST equal period.end. all_media_buys membership is frozen from the caller-authorized AdCP media buys known at that instant whose effective flights overlap [period.start, period.end); explicit configured media_buy_ids are echoed even when they produce zero rows. Provider object deletion does not remove a buy. Later-created or backdated buys do not alter the obligation.", + "coverage_resolution": "coverage.evaluated_at MUST equal scope_resolved_at and coverage.media_buy_ids MUST equal media_buy_ids. A configuration requiring full coverage makes incomplete coverage action_required with REPORTING_COVERAGE_INCOMPLETE. allow_partial evaluates delivery health over covered_package_ids but never changes coverage.status or represents covered-subset aggregates as whole-scope totals.", + "nested_identity": "Every materialization associated with this obligation MUST equal its delivery_config_id, delivery_config_version, destination_ref, feed_purpose, and method; its destination-independent revision MUST equal account_id, report_definition_id, reporting_profile, period, and applicable media_buy_ids.", + "complete_finality": "complete requires a published revision at required_finality and at least one verified readable materialization for that revision through resource_retained_until. consumer_receipt additionally requires an accepted matching receipt for the current revision. A snapshot-required pacing obligation may therefore become complete from a snapshot revision.", + "revision_chain": "Supersession MUST be acyclic, remain within this logical slice, and every supersedes_reporting_revision_id MUST name the immediately prior retained revision.", + "record_counts": "revision_count is the number of distinct revisions referenced by this obligation's materializations. revision_count, materialization_count, successful_materialization_count, receipt_count, and accepted_receipt_count MUST equal the complete associated record totals in ledger_snapshot_id, even when records appear on different pages." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-receipt.json b/schemas/cache/3.2.0-beta.9/core/reporting-receipt.json new file mode 100644 index 000000000..ac897ab5f --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-receipt.json @@ -0,0 +1,59 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-receipt.json", + "title": "Reporting Receipt", + "x-status": "experimental", + "description": "Authenticated consumer evidence for one materialization. A receipt closes the knowledge gap between producer availability and consumer reconciliation. Buyer and governance consumers submit independently; neither consumer's receipt implies acceptance by another principal.", + "type": "object", + "properties": { + "reporting_receipt_id": { "type": "string", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$", "x-entity": "reporting_receipt" }, + "reporting_obligation_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_obligation" }, + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision" }, + "reporting_materialization_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_materialization" }, + "status": { "type": "string", "enum": ["accepted", "rejected"] }, + "verification_profile": { "$ref": "/schemas/core/reporting-verification-profile.json" }, + "observed_row_count": { "type": "integer", "minimum": 0 }, + "observed_control_totals": { + "type": "array", + "items": { "$ref": "/schemas/core/reporting-control-total.json" }, + "uniqueItems": true + }, + "observed_canonical_content_digest": { "$ref": "/schemas/core/reporting-canonical-content-digest.json" }, + "observed_manifest_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" }, + "observed_native_version_ref": { "type": "string", "minLength": 1, "maxLength": 512, "description": "Immutable provider-native version observed by the consumer for native_commit verification." }, + "consumer_commit_ref": { "type": "string", "minLength": 1, "maxLength": 512, "description": "Optional non-secret consumer checkpoint, transaction, or load identifier. It is evidence for operations, not authorization or a credential." }, + "rejection_codes": { + "type": "array", + "items": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Z][A-Z0-9_]*$" }, + "minItems": 1, + "uniqueItems": true + }, + "observed_at": { "type": "string", "format": "date-time" }, + "received_at": { "type": "string", "format": "date-time", "readOnly": true } + }, + "required": ["reporting_receipt_id", "reporting_obligation_id", "reporting_revision_id", "reporting_materialization_id", "status", "verification_profile", "observed_row_count", "observed_control_totals", "observed_at"], + "allOf": [ + { + "if": { "properties": { "status": { "const": "rejected" } }, "required": ["status"] }, + "then": { "required": ["rejection_codes"] } + }, + { + "if": { "properties": { "verification_profile": { "const": "canonical_digest" }, "status": { "const": "accepted" } }, "required": ["verification_profile", "status"] }, + "then": { "required": ["observed_canonical_content_digest"] } + }, + { + "if": { "properties": { "verification_profile": { "const": "manifest_checksums" }, "status": { "const": "accepted" } }, "required": ["verification_profile", "status"] }, + "then": { "required": ["observed_manifest_sha256"] } + }, + { + "if": { "properties": { "verification_profile": { "const": "native_commit" }, "status": { "const": "accepted" } }, "required": ["verification_profile", "status"] }, + "then": { "required": ["observed_native_version_ref"] } + } + ], + "x-adcp-validation": { + "authorization": "The seller derives the consumer principal from authenticated transport and accepts receipts only for that principal's account-bound obligation and materialization. Unknown, unauthorized, cross-account, and cross-caller identifiers are indistinguishable.", + "acceptance_match": "accepted requires exact equality with the selected materialization verification evidence: row count and control totals always; canonical digest or manifest digest when selected. A mismatch MUST be submitted or recorded as rejected.", + "immutability": "A reporting_receipt_id is immutable. Exact retries are idempotent; reuse with different content is a conflict." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json b/schemas/cache/3.2.0-beta.9/core/reporting-reconciliation-mode.json similarity index 70% rename from schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json rename to schemas/cache/3.2.0-beta.9/core/reporting-reconciliation-mode.json index ee6bdf231..7c6509126 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-reconciliation-mode.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-reconciliation-mode.json @@ -1,11 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-reconciliation-mode.json", "title": "Reporting Reconciliation Mode", "x-status": "experimental", "description": "Whether producer delivery evidence is sufficient or an authenticated consumer receipt is required.", "type": "string", - "enum": [ - "delivery_only", - "consumer_receipt" - ] -} \ No newline at end of file + "enum": ["delivery_only", "consumer_receipt"] +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-report-definition.json b/schemas/cache/3.2.0-beta.9/core/reporting-report-definition.json new file mode 100644 index 000000000..df56bbf76 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-report-definition.json @@ -0,0 +1,108 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-report-definition.json", + "title": "Reporting Report Definition", + "x-status": "experimental", + "description": "Immutable, inspectable semantic contract for how a reporting feed is produced and finalized. Its exact bytes are pinned by report_definition_sha256.", + "type": "object", + "properties": { + "contract_version": { "type": "string", "const": "1.0" }, + "media_type": { "type": "string", "const": "application/vnd.adcp.reporting-definition+json" }, + "report_definition_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, + "reporting_profile": { "type": "string", "minLength": 1, "maxLength": 128 }, + "grain": { "type": "string", "minLength": 1, "maxLength": 128 }, + "source": { + "type": "object", + "properties": { + "provider": { "type": "object", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "system": { "type": "string", "minLength": 1, "maxLength": 128 }, + "api_version": { "type": "string", "minLength": 1, "maxLength": 128 }, + "query_semantics": { "type": "object", "description": "Canonical JSON object containing every source option that can change the numbers, including attribution settings, action-report-time, filters, and mapping version." } + }, + "required": ["provider", "system", "api_version", "query_semantics"], + "additionalProperties": false + }, + "calendar": { + "type": "object", + "properties": { + "timezone_basis": { "type": "string", "enum": ["utc", "account_timezone", "configured_timezone"] }, + "timezone": { "type": "string", "minLength": 1, "maxLength": 255 } + }, + "required": ["timezone_basis"], + "allOf": [ + { "if": { "properties": { "timezone_basis": { "const": "configured_timezone" } }, "required": ["timezone_basis"] }, "then": { "required": ["timezone"] }, "else": { "not": { "required": ["timezone"] } } } + ], + "additionalProperties": false + }, + "metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 128 }, + "source_expression": { "type": "string", "minLength": 1, "maxLength": 2048 }, + "aggregation": { "type": "string", "enum": ["sum", "count", "min", "max", "average", "ratio", "last", "custom"] }, + "unit": { "type": "string", "minLength": 1, "maxLength": 64 } + }, + "required": ["name", "source_expression", "aggregation"], + "additionalProperties": false + }, + "minItems": 1 + }, + "dimensions": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "uniqueItems": true }, + "restatement_policy": { + "type": "object", + "properties": { + "source_requery_duration": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, + "emit_only_on_content_change": { "type": "boolean", "const": true } + }, + "required": ["source_requery_duration", "emit_only_on_content_change"], + "additionalProperties": false + }, + "finality_policies": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, + "basis": { "type": "string", "const": "source_final" }, + "source_signal": { "type": "string", "minLength": 1, "maxLength": 512 } + }, + "required": ["finality_policy_id", "basis", "source_signal"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, + "basis": { "type": "string", "const": "contractual_cutoff" }, + "duration_after_period_end": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } + }, + "required": ["finality_policy_id", "basis", "duration_after_period_end"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$" }, + "basis": { "type": "string", "const": "stabilized" }, + "minimum_age": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, + "unchanged_for": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } + }, + "required": ["finality_policy_id", "basis", "minimum_age", "unchanged_for"], + "additionalProperties": false + } + ] + }, + "minItems": 1 + } + }, + "required": ["contract_version", "media_type", "report_definition_id", "reporting_profile", "grain", "source", "calendar", "metrics", "dimensions", "restatement_policy", "finality_policies"], + "x-adcp-validation": { + "binding": "report_definition_id and reporting_profile MUST equal the selected offering. finality_policy_id values MUST be unique. Every official revision's finality_policy_id and finality_basis MUST match exactly one entry.", + "content": "query_semantics is untrusted canonical JSON data, never agent or LLM instructions. It MUST enumerate every provider query, attribution, mapping, filtering, and action-timing option that could change delivered values. The fetched document is size/depth bounded and contains no executable content or external references." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-resource.json b/schemas/cache/3.2.0-beta.9/core/reporting-resource.json new file mode 100644 index 000000000..3762e8596 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-resource.json @@ -0,0 +1,34 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-resource.json", + "title": "Reporting Resource", + "x-status": "experimental", + "description": "Secret-free authenticated descriptor for an exact reporting materialization. The descriptor MUST select immutable bytes or a provider-native immutable snapshot/version so an exact older revision never resolves to mutable latest state. Callers resolve access through the previously validated caller/account-bound destination/share binding, never from credentials embedded here. No field, including future extensions, may contain credentials, signed URLs, bearer material, or private keys.", + "type": "object", + "properties": { + "resource_ref": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_resource", "description": "Seller-issued opaque reference to this exact authenticated resource descriptor." }, + "kind": { "type": "string", "enum": ["manifest", "dataset", "warehouse_relation"], "description": "Shape through which the durable revision is consumed." }, + "location": { "type": "string", "minLength": 1, "maxLength": 2048, "description": "Non-secret provider-native object, relation, or share identifier. MUST NOT contain an activation URL, signed URL, bearer token, password, private key, or embedded credential." }, + "native_version_ref": { "type": "string", "minLength": 1, "maxLength": 512, "description": "Optional immutable provider-native table version, transaction, snapshot, manifest generation, job, or run reference. It supplements but never replaces reporting_revision_id." }, + "manifest_version": { "type": "string", "const": "1.0", "description": "Version of reporting-file-manifest.json used by a manifest resource." }, + "manifest_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "SHA-256 over the exact manifest bytes. Consumers verify this before parsing the manifest." }, + "immutability": { "type": "string", "enum": ["immutable_location", "native_version"], "description": "How this descriptor selects the exact immutable materialization." }, + "expires_at": { "type": "string", "format": "date-time", "description": "Mandatory finite lower-bound endpoint through which this exact resource remains resolvable; it cannot be earlier than the advertised retention contract." }, + "reader_compatibility": { "type": "array", "description": "Reader features or format constraints required to consume this resource. Readiness verification MUST use a representative supported reader.", "items": { "type": "string", "minLength": 1, "maxLength": 128 }, "uniqueItems": true } + }, + "required": ["resource_ref", "kind", "location", "immutability", "expires_at"], + "allOf": [ + { + "if": { "properties": { "kind": { "const": "manifest" } }, "required": ["kind"] }, + "then": { "required": ["manifest_version", "manifest_sha256"] } + }, + { + "if": { "properties": { "immutability": { "const": "native_version" } }, "required": ["immutability"] }, + "then": { "required": ["native_version_ref"] } + } + ], + "x-adcp-validation": { + "retention": "expires_at MUST be no earlier than the owning obligation.resource_retained_until and publication plus advertised resource_retention_days. A completed obligation cannot rely on deterministic rematerialization in place of a readable exact resource." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-revision.json b/schemas/cache/3.2.0-beta.9/core/reporting-revision.json new file mode 100644 index 000000000..160363e10 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-revision.json @@ -0,0 +1,74 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-revision.json", + "title": "Reporting Revision", + "x-status": "experimental", + "description": "One immutable emitted version of logical reporting content. The revision is destination-independent: one canonical revision may fan out through many caller/account-bound obligations and materializations, including file, warehouse, and dataset-share destinations. The report_definition_id plus period and scope identify the logical slice; restatements create a new revision and preserve the superseded revision for the advertised retention window.", + "type": "object", + "properties": { + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision", "description": "Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions." }, + "report_definition_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_definition", "description": "Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics." }, + "report_definition_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)" }, + "report_definition_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$" }, + "reporting_profile": { "type": "string", "minLength": 1, "maxLength": 128 }, + "schema_version": { "type": "string", "minLength": 1, "maxLength": 64 }, + "schema_uri": { "type": "string", "format": "uri", "pattern": "^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)", "description": "Machine-readable schema on the authenticated seller/provider or AdCP-registry origin." }, + "schema_sha256": { "type": "string", "pattern": "^[A-Fa-f0-9]{64}$", "description": "Digest of the exact schema bytes used to validate this immutable revision." }, + "schema_dialect": { "type": "string", "const": "https://json-schema.org/draft/2020-12/schema", "description": "Closed SDK-bundled dialect; the metaschema is never network-fetched." }, + "schema_ref_policy": { "type": "string", "const": "local_fragment_only", "description": "The fetched schema is self-contained and every $ref is a local # fragment." }, + "account_id": { "type": "string", "minLength": 1, "x-entity": "account" }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true, "description": "Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator." }, + "coverage": { "$ref": "/schemas/core/reporting-coverage.json", "description": "Frozen product/package denominator represented by this logical content. The same coverage follows the revision to every destination." }, + "period": { + "type": "object", + "description": "Half-open reporting interval with its source calendar boundary.", + "properties": { + "start": { "type": "string", "format": "date-time" }, + "end": { "type": "string", "format": "date-time" }, + "source_timezone": { "type": "string", "minLength": 1 } + }, + "required": ["start", "end", "source_timezone"], + "additionalProperties": false + }, + "finality": { "$ref": "/schemas/enums/reporting-finality.json" }, + "finality_basis": { "type": "string", "enum": ["source_final", "contractual_cutoff", "stabilized"], "description": "Why an official revision is considered final: an authoritative source signal, a versioned contractual cutoff, or a versioned stabilization rule." }, + "finality_policy_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "description": "Immutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id." }, + "finalized_at": { "type": "string", "format": "date-time", "description": "When the producer applied the declared finality basis to this official revision." }, + "observed_at": { "type": "string", "format": "date-time", "description": "When the seller obtained or committed this source observation." }, + "data_through": { "type": ["string", "null"], "format": "date-time", "description": "Latest event time conservatively included, or null when precision is unknown." }, + "data_through_precision": { "type": "string", "enum": ["exact", "lower_bound", "unknown"] }, + "supersedes_reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision", "description": "Immediately superseded revision of the same logical slice. Both snapshot and official revisions may be superseded." }, + "row_count": { "type": "integer", "minimum": 0, "description": "Logical row count, including zero for a successfully evaluated empty report." }, + "control_totals": { + "type": "array", + "items": { "$ref": "/schemas/core/reporting-control-total.json" }, + "uniqueItems": true, + "description": "Profile-defined totals computed from the canonical logical revision. Names MUST be unique." + }, + "canonical_content_digest": { "$ref": "/schemas/core/reporting-canonical-content-digest.json" }, + "created_at": { "type": "string", "format": "date-time" } + }, + "required": ["reporting_revision_id", "report_definition_id", "report_definition_uri", "report_definition_sha256", "reporting_profile", "schema_version", "schema_uri", "schema_sha256", "schema_dialect", "schema_ref_policy", "account_id", "media_buy_ids", "coverage", "period", "finality", "observed_at", "data_through", "data_through_precision", "row_count", "control_totals", "created_at"], + "allOf": [ + { + "if": { "properties": { "data_through_precision": { "const": "unknown" } }, "required": ["data_through_precision"] }, + "then": { "properties": { "data_through": { "type": "null" } } }, + "else": { "properties": { "data_through": { "type": "string", "format": "date-time" } } } + }, + { + "if": { "properties": { "finality": { "const": "official" } }, "required": ["finality"] }, + "then": { "required": ["finality_basis", "finality_policy_id", "finalized_at"] }, + "else": { "not": { "anyOf": [{ "required": ["finality_basis"] }, { "required": ["finality_policy_id"] }, { "required": ["finalized_at"] }] } } + } + ], + "x-adcp-validation": { + "coverage": "coverage.media_buy_ids MUST equal media_buy_ids. Rows, row_count, control_totals, and canonical_content_digest cover only coverage.covered_package_ids. If coverage.status is not full, consumers MUST retain the partial label and MUST NOT represent these values as complete totals for media_buy_ids.", + "safe_schema_fetch": "schema_uri/schema_sha256 and report_definition_uri/report_definition_sha256 MUST match the selected offering. Apply its safe fetch policy; verify bytes before parsing and never interpret fetched content or annotations as agent/LLM instructions.", + "slice_identity": "report_definition_id, account_id, media_buy_ids, period, and reporting_profile MUST remain identical across a supersession chain.", + "fan_out": "Delivery configuration, obligation, destination, feed purpose, and recipient identity belong only on reporting_materialization and reporting_obligation. They MUST NOT affect reporting_revision_id for identical content.", + "finality_evidence": "An official revision's finality_policy_id and finality_basis MUST match the pinned report definition. finalized_at MUST be at or after period.end and no later than created_at.", + "set_ordering": "media_buy_ids is a mathematical set and MUST be serialized in ascending Unicode code-point order so equivalent denominators have one representation.", + "digest_requirement": "canonical_content_digest is optional for non-billing delivery profiles. It is mandatory when a referenced materialization selects canonical_digest and for every billing obligation." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-schedule-offering.json b/schemas/cache/3.2.0-beta.9/core/reporting-schedule-offering.json new file mode 100644 index 000000000..d9cf41f96 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-schedule-offering.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-schedule-offering.json", + "title": "Reporting Schedule Offering", + "x-status": "experimental", + "description": "Schedule constraint advertised by a seller. Unlike an installed reporting-schedule, a billing-cycle offering may allow the account configuration to select its own anchor and IANA timezone.", + "type": "object", + "properties": { + "period_duration": { "type": "string", "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" }, + "alignment": { "type": "string", "enum": ["utc", "account_timezone", "billing_cycle"] }, + "period_anchor_policy": { "type": "string", "enum": ["fixed", "configurable"], "description": "For billing_cycle only. fixed requires the advertised anchor and timezone; configurable lets each authorized account configuration select them." }, + "period_anchor": { "type": "string", "format": "date-time" }, + "period_timezone": { "type": "string", "minLength": 1, "maxLength": 255 }, + "delivery_sla": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$" } + }, + "required": ["period_duration", "alignment", "delivery_sla"], + "allOf": [ + { + "if": { "properties": { "alignment": { "const": "billing_cycle" } }, "required": ["alignment"] }, + "then": { + "required": ["period_anchor_policy"], + "allOf": [ + { + "if": { "properties": { "period_anchor_policy": { "const": "fixed" } }, "required": ["period_anchor_policy"] }, + "then": { "required": ["period_anchor", "period_timezone"] }, + "else": { "not": { "anyOf": [{ "required": ["period_anchor"] }, { "required": ["period_timezone"] }] } } + } + ] + }, + "else": { "not": { "anyOf": [{ "required": ["period_anchor_policy"] }, { "required": ["period_anchor"] }, { "required": ["period_timezone"] }] } } + } + ], + "x-adcp-validation": { + "installed_schedule_match": "period_duration, alignment, and delivery_sla MUST equal the installed configuration. For fixed billing_cycle offerings, period_anchor and period_timezone MUST also equal it. For configurable billing_cycle offerings, the installed configuration supplies both values. utc and account_timezone use the normative origins in reporting-schedule.json, so even multi-unit durations have one independently derivable phase." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-schedule.json b/schemas/cache/3.2.0-beta.9/core/reporting-schedule.json new file mode 100644 index 000000000..20b038ee4 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-schedule.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-schedule.json", + "title": "Reporting Schedule", + "x-status": "experimental", + "description": "The period and deadline contract from which reporting obligations are created. Every elapsed period produces an obligation even when it has zero rows or production fails, so a consumer can distinguish empty from missing.", + "type": "object", + "properties": { + "period_duration": { "type": "string", "pattern": "^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Strictly positive ISO 8601 duration of each reporting period, such as PT15M, P1D, or P1M." }, + "alignment": { "type": "string", "enum": ["utc", "account_timezone", "billing_cycle"], "description": "Calendar used to establish exact period boundaries. The obligation echoes resolved timestamps and source timezone." }, + "period_anchor": { "type": "string", "format": "date-time", "description": "Required for billing_cycle alignment. This immutable instant anchors the recurring half-open billing periods so producer and consumer derive the same month, quarter, or other contractual cycle." }, + "period_timezone": { "type": "string", "minLength": 1, "maxLength": 255, "description": "Required IANA timezone for billing_cycle calendar arithmetic. A numeric UTC offset is not sufficient because it does not define DST transitions." }, + "delivery_sla": { "type": "string", "pattern": "^P(?=\\d|T)(?=.*\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$", "description": "Non-negative maximum time after period end before the required revision is due. PT0S means due at period close; expected_at equals the resolved period end plus this duration." } + }, + "required": ["period_duration", "alignment", "delivery_sla"], + "allOf": [ + { + "if": { "properties": { "alignment": { "const": "billing_cycle" } }, "required": ["alignment"] }, + "then": { "required": ["period_anchor", "period_timezone"] }, + "else": { "not": { "anyOf": [{ "required": ["period_anchor"] }, { "required": ["period_timezone"] }] } } + } + ], + "x-adcp-validation": { + "period_generation": "Producer and consumer MUST derive the same ordered half-open intervals from period_duration, alignment, period_anchor, and period_timezone when applicable. utc alignment uses 1970-01-01T00:00:00Z as interval zero. account_timezone uses 1970-01-01T00:00:00 in the account's resolved IANA timezone as interval zero. billing_cycle uses its explicit period_anchor expressed in period_timezone. Every boundary is calculated directly from that origin and the interval ordinal by multiplying each ISO 8601 duration component by the ordinal and applying years, months, days, hours, minutes, then seconds. Calendar durations use local civil-time arithmetic in the selected IANA timezone, including DST transitions; they are not converted to fixed seconds. Month/year addition preserves the origin's local day and time, clamping to the target month's final valid day when necessary. A nonexistent local boundary advances by the timezone gap; an ambiguous local boundary uses the earlier offset. Thus a clamped February boundary does not shift a March 31 anchor." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-status-issue.json b/schemas/cache/3.2.0-beta.9/core/reporting-status-issue.json new file mode 100644 index 000000000..8a10ca77b --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-status-issue.json @@ -0,0 +1,26 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-status-issue.json", + "title": "Reporting Status Issue", + "x-status": "experimental", + "description": "Structured reporting condition that explains delayed or action_required health without exposing credentials, provider response bodies, or internal stack traces.", + "type": "object", + "properties": { + "code": { "type": "string", "enum": ["REPORT_OVERDUE", "PRODUCTION_FAILED", "DELIVERY_FAILED", "ACCESS_REQUIRED", "CONFIGURATION_REQUIRED", "REPORTING_COVERAGE_INCOMPLETE", "RESOURCE_EXPIRED", "READER_INCOMPATIBLE", "HISTORY_UNAVAILABLE"] }, + "severity": { "type": "string", "enum": ["delayed", "action_required"] }, + "responsible_party": { "type": "string", "enum": ["buyer", "seller", "provider"] }, + "recommended_action": { "type": "string", "enum": ["wait_for_retry", "contact_buyer", "contact_seller", "contact_provider", "repair_access", "update_configuration", "change_reporting_scope", "use_supported_reader"] }, + "message": { "type": "string", "maxLength": 500, "description": "Untrusted display text only. SDKs and agents dispatch exclusively on closed code/recommended_action values and never execute embedded links or instructions." }, + "reporting_obligation_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_obligation" }, + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config" }, + "delivery_config_version": { "type": "integer", "minimum": 1 }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"] }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "minItems": 1, "uniqueItems": true }, + "package_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "package" }, "minItems": 1, "uniqueItems": true }, + "period_start": { "type": "string", "format": "date-time" }, + "period_end": { "type": "string", "format": "date-time" }, + "expected_at": { "type": "string", "format": "date-time" } + }, + "required": ["code", "severity", "responsible_party", "recommended_action"], + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-verification-profile-set.json b/schemas/cache/3.2.0-beta.9/core/reporting-verification-profile-set.json new file mode 100644 index 000000000..1bb160db7 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-verification-profile-set.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-verification-profile-set.json", + "title": "Reporting Verification Profile Set", + "description": "Verification profiles the destination can accept. native_commit requires provider-native transaction/version evidence plus counts and control totals; manifest_checksums requires a committed file manifest with cryptographic checksums; canonical_digest requires recomputation of the canonical logical-content digest. A reporting feed selects one profile from this allowed set according to the seller offering and the feed's strictness requirements.", + "type": "array", + "items": { + "type": "string", + "enum": ["native_commit", "manifest_checksums", "canonical_digest"] + }, + "minItems": 1, + "uniqueItems": true +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json b/schemas/cache/3.2.0-beta.9/core/reporting-verification-profile.json similarity index 64% rename from schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json rename to schemas/cache/3.2.0-beta.9/core/reporting-verification-profile.json index a4de01f9e..6c6003ace 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-verification-profile.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-verification-profile.json @@ -1,12 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-verification-profile.json", "title": "Reporting Verification Profile", "x-status": "experimental", "description": "Assurance evidence used for one reporting materialization or receipt.", "type": "string", - "enum": [ - "native_commit", - "manifest_checksums", - "canonical_digest" - ] -} \ No newline at end of file + "enum": ["native_commit", "manifest_checksums", "canonical_digest"] +} diff --git a/schemas/cache/3.2.0-beta.9/core/reporting-verification.json b/schemas/cache/3.2.0-beta.9/core/reporting-verification.json new file mode 100644 index 000000000..634b83d80 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/core/reporting-verification.json @@ -0,0 +1,68 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-verification.json", + "title": "Reporting Verification", + "x-status": "experimental", + "description": "Producer evidence for one materialization, with an explicit assurance profile. Native commit and manifest profiles prove a committed destination plus row counts and control totals without claiming full logical-content equality. canonical_digest adds exact logical equality and is required for billing. A separate authenticated consumer receipt records what the consumer actually reconciled.", + "type": "object", + "properties": { + "verified_at": { "type": "string", "format": "date-time", "description": "When the producer completed verification through the claimed consumer/destination path." }, + "verification_path": { "type": "string", "enum": ["producer", "representative_consumer", "destination"], "description": "Path on which verification succeeded. dataset_share readiness requires representative_consumer; delivered warehouse state requires destination." }, + "verification_profile": { "$ref": "/schemas/core/reporting-verification-profile.json" }, + "row_count": { "type": "integer", "minimum": 0, "description": "Verified row count. Zero explicitly distinguishes an empty committed revision from a missing revision." }, + "control_totals": { + "type": "array", + "items": { "$ref": "/schemas/core/reporting-control-total.json" }, + "uniqueItems": true, + "description": "Profile-defined totals recomputed through verification_path. Names MUST be unique." + }, + "canonical_content_digest": { "$ref": "/schemas/core/reporting-canonical-content-digest.json" }, + "physical_checksums": { + "type": "array", + "description": "Method-specific byte/object checksums. Different encodings of the same logical revision normally have different values.", + "items": { + "type": "object", + "properties": { + "object_ref": { "type": "string", "minLength": 1, "maxLength": 1024 }, + "algorithm": { "type": "string", "enum": ["sha256", "sha512"] }, + "value": { "type": "string", "pattern": "^(?:[A-Fa-f0-9]{64}|[A-Fa-f0-9]{128})$" } + }, + "required": ["object_ref", "algorithm", "value"], + "additionalProperties": false + }, + "minItems": 1 + }, + "native_commit_evidence": { + "type": "object", + "description": "Provider-native immutable version evidence observed through the named consumer or destination path.", + "properties": { + "native_version_ref": { "type": "string", "minLength": 1, "maxLength": 512 }, + "observed_through": { "type": "string", "enum": ["representative_consumer", "destination"] } + }, + "required": ["native_version_ref", "observed_through"], + "additionalProperties": false + } + }, + "required": ["verified_at", "verification_path", "verification_profile", "row_count", "control_totals"], + "allOf": [ + { + "if": { "properties": { "verification_profile": { "const": "native_commit" } }, "required": ["verification_profile"] }, + "then": { "required": ["native_commit_evidence"] } + }, + { + "if": { "properties": { "verification_profile": { "const": "manifest_checksums" } }, "required": ["verification_profile"] }, + "then": { "required": ["physical_checksums"] } + }, + { + "if": { "properties": { "verification_profile": { "const": "canonical_digest" } }, "required": ["verification_profile"] }, + "then": { "required": ["canonical_content_digest"] } + } + ], + "x-adcp-validation": { + "revision_match": "row_count and control_totals MUST equal the referenced revision. canonical_digest additionally requires a digest equal to the revision digest.", + "assurance_boundary": "native_commit and manifest_checksums prove committed delivery evidence but MUST NOT be described as cryptographic logical-content equality. That claim requires canonical_digest.", + "native_version_match": "When native_commit_evidence is present, native_version_ref MUST equal resource.native_version_ref and observed_through MUST match the consumer/destination verification path.", + "checksum_binding": "Every physical_checksums.object_ref MUST be an object selected by this exact immutable resource/manifest; algorithm and value length MUST agree." + }, + "additionalProperties": false +} diff --git a/schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json b/schemas/cache/3.2.0-beta.9/core/reporting-write-destination.json similarity index 52% rename from schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json rename to schemas/cache/3.2.0-beta.9/core/reporting-write-destination.json index df0dfee17..378f053be 100644 --- a/schemas/cache/3.2.0-beta.6/core/reporting-write-destination.json +++ b/schemas/cache/3.2.0-beta.9/core/reporting-write-destination.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/reporting-write-destination.json", "title": "Reporting Write Destination", "x-status": "experimental", "description": "Storage or warehouse destination for durable reporting. The caller either references an existing seller-issued immutable destination generation or asks the seller to validate and bind a provider-native location. A destination_ref is owned by the stable authenticated principal's relationship with this seller and may be reused across accounts; each account delivery configuration separately authorizes its feed and scope. Changing proof-bound coordinates or the accepted delivery contract produces a new destination_ref. Access grants name advertised producer identities; credentials never transit AdCP.", @@ -8,64 +9,21 @@ { "title": "Existing binding", "properties": { - "mode": { - "type": "string", - "const": "existing" - }, - "destination_ref": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "x-entity": "reporting_destination", - "description": "Seller-issued immutable destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." - } + "mode": { "type": "string", "const": "existing" }, + "destination_ref": { "type": "string", "minLength": 1, "maxLength": 255, "x-entity": "reporting_destination", "description": "Seller-issued immutable destination-generation reference returned by sync_agent_configuration, an earlier sync, or bilateral setup." } }, - "required": [ - "mode", - "destination_ref" - ], + "required": ["mode", "destination_ref"], "additionalProperties": false }, { "title": "Provision binding", "properties": { - "mode": { - "type": "string", - "const": "provision" - }, - "provider": { - "type": "object", - "description": "Platform hosting the destination.", - "properties": { - "domain": { - "type": "string", - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" - } - }, - "required": [ - "domain" - ], - "additionalProperties": false - }, - "location": { - "type": "string", - "minLength": 1, - "maxLength": 2048, - "description": "Provider-native bucket, prefix, project/dataset, catalog/schema, or equivalent locator. It MUST NOT contain an embedded credential or signed URL." - }, - "access_mode": { - "type": "string", - "minLength": 1, - "maxLength": 64, - "pattern": "^[a-z][a-z0-9_.-]*$", - "description": "Optional provider access family used for capability matching." - } + "mode": { "type": "string", "const": "provision" }, + "provider": { "type": "object", "description": "Platform hosting the destination.", "properties": { "domain": { "type": "string", "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$" } }, "required": ["domain"], "additionalProperties": false }, + "location": { "type": "string", "minLength": 1, "maxLength": 2048, "description": "Provider-native bucket, prefix, project/dataset, catalog/schema, or equivalent locator. It MUST NOT contain an embedded credential or signed URL." }, + "access_mode": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9_.-]*$", "description": "Optional provider access family used for capability matching." } }, - "required": [ - "mode", - "provider", - "location" - ], + "required": ["mode", "provider", "location"], "additionalProperties": false } ], @@ -73,4 +31,4 @@ "authorization": "Bind every destination_ref to the stable authenticated caller. Reuse across that caller's accounts is permitted only after each account configuration independently verifies disclosure authority for its feed and media-buy scope. Reject unknown, unauthorized, and cross-caller refs indistinguishably.", "destination_proof": "Before ready, prove destination control and caller authority for every selected account, feed, and media-buy scope. A proof-bound coordinate or delivery-contract change creates a new destination_ref; old references remain stable for retained configurations and history. Revoke grants when the configuration, caller authorization, or account becomes inactive." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/core/x-entity-types.json b/schemas/cache/3.2.0-beta.9/core/x-entity-types.json index 0565e7546..42313593d 100644 --- a/schemas/cache/3.2.0-beta.9/core/x-entity-types.json +++ b/schemas/cache/3.2.0-beta.9/core/x-entity-types.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/core/x-entity-types.json", "title": "x-entity types", "description": "Registry of valid `x-entity` annotation values. Each value tags a schema field whose contents carry identity of the named entity type. The context-entity lint reads this registry to reject unknown `x-entity` values and to catch mismatches between storyboard capture and consume sites. See docs/contributing/x-entity-annotation.md for authoring guidance. To add a value, PR this file and extend the authoring doc.", "type": "string", @@ -68,14 +69,23 @@ "si_session", "offering", "vendor_metric", + "reporting_destination", + "reporting_offering", + "reporting_delivery_config", + "reporting_definition", + "reporting_obligation", + "reporting_revision", + "reporting_materialization", + "reporting_receipt", + "reporting_resource", "identity_relying_party" ], "x-entity-definitions": { - "advertiser_brand": "A brand in an advertiser's house portfolio. Identified by the advertiser \u2014 e.g., the `brand_id` on get_brand_identity, the `brand_id` inside core/brand-ref.json (buyer_brand, buyer), and core/account.json `brand`. If you `$ref` core/brand-id.json you are asserting advertiser scope; talent-roster ids must use a separate type even if the string shape is identical.", - "rights_holder_brand": "A brand in a rights agent's roster (talent, music artist, stock-media owner). Identified by the rights agent \u2014 e.g., `brand_id` on get_rights-response items, acquire_rights-response, and the rights-filter `brand_id` on get_rights-request.", - "rights_grant": "A rights grant identifier covering any lifecycle state (acquired, pending_approval, rejected). `rights_id` across brand/* schemas. Named `grant` rather than `contract` because the identifier is issued at request time \u2014 a bilateral contract may or may not exist yet.", + "advertiser_brand": "A brand in an advertiser's house portfolio. Identified by the advertiser — e.g., the `brand_id` on get_brand_identity, the `brand_id` inside core/brand-ref.json (buyer_brand, buyer), and core/account.json `brand`. If you `$ref` core/brand-id.json you are asserting advertiser scope; talent-roster ids must use a separate type even if the string shape is identical.", + "rights_holder_brand": "A brand in a rights agent's roster (talent, music artist, stock-media owner). Identified by the rights agent — e.g., `brand_id` on get_rights-response items, acquire_rights-response, and the rights-filter `brand_id` on get_rights-request.", + "rights_grant": "A rights grant identifier covering any lifecycle state (acquired, pending_approval, rejected). `rights_id` across brand/* schemas. Named `grant` rather than `contract` because the identifier is issued at request time — a bilateral contract may or may not exist yet.", "account": "Billing/scope account in the seller's namespace. `account_id` or the natural-key `{brand, operator}` form; both resolve to the same entity.", - "operator": "An operator (seller) identity, typically by domain. Distinct from `account` \u2014 one operator issues many accounts.", + "operator": "An operator (seller) identity, typically by domain. Distinct from `account` — one operator issues many accounts.", "operator_unit": "An operator-owned buying context beneath one operator domain, such as a business unit, agency seat, or platform account. Identity is the tuple `(operator domain, operator_unit.id)`; `operator_unit.name` is mutable display metadata and never participates in identity.", "media_buy": "A media buy / campaign. `media_buy_id` across media-buy/* schemas.", "package": "A line item within a media buy. `package_id` across media-buy/* schemas.", @@ -83,7 +93,7 @@ "proposal": "A seller-issued immutable media-plan snapshot. `proposal_id` is returned by request_proposals or refine_proposals; drafts are revised or finalized through refine_proposals, while committed snapshots are consumed by accept_proposal or the create_media_buy compatibility facade. Scoped to the issuing seller and authenticated principal.", "opportunity": "A buyer-assigned planning cycle spanning proposal request, decline, and media-buy creation. `opportunity_id` is scoped to the seller and account and is not proposal identity.", "placement": "A public ad placement. Self-contained identity is discriminated in core/placement-identity.json: publisher-catalog placements use (publisher_domain, placement_id), while seller-inline placements use (seller_agent, placement_id). Legacy product-context placement_id and core/placement-ref.json shapes remain valid but are not globally self-contained.", - "product_pricing_option": "A pricing tier on a seller's inventory product (CPM / CPC / CPCV / etc). `pricing_option_id` inside `core/package.json` and `media-buy/package-request.json`. Scoped to the seller's product rate card \u2014 not interchangeable with `vendor_pricing_option`.", + "product_pricing_option": "A pricing tier on a seller's inventory product (CPM / CPC / CPCV / etc). `pricing_option_id` inside `core/package.json` and `media-buy/package-request.json`. Scoped to the seller's product rate card — not interchangeable with `vendor_pricing_option`.", "vendor_pricing_option": "A pricing tier offered by a vendor agent (rights agent, signals agent, creative agent, governance agent) for its own services. `pricing_option_id` via `core/vendor-pricing-option.json`, also surfaced in `brand/acquire-rights-*`, `signals/activate-signal-request`, `media-buy/build-creative-response`, and `creative/get-creative-features-response`. Scoped to the issuing agent; not interchangeable with `product_pricing_option`.", "creative": "A creative asset (library entry, buyer-assigned). `creative_id` across creative/*, brand/creative-approval-*, and media-buy/package-request.", "creative_revision": "A buyer-assigned immutable input-content state beneath one durable creative. Identity is the tuple `(creative_id, revision_id)`. `revision_id` round-trips through sync_creatives, list_creatives, creative status webhooks, and delivery readback. Seller transcoding, normalization, and alternate delivery representations do not create a new revision.", @@ -92,9 +102,9 @@ "tracker_execution_selector": "One stable first-class tracker commitment inside an effective Product tracker execution contract. `selector_id` is scoped to the materialized contract, is retained unchanged in the immutable PackageFormatSnapshot, and is later used to attribute contract matching and execution evidence. It is not globally unique without the product or package snapshot identity.", "creative_locale_variant": "A buyer-assigned stable locale execution within one localized creative. `locale_variant_id` round-trips from core/creative-localization.json into sync_creatives and list_creatives readback, then attributes localized executions in get_creative_delivery. Scoped to the parent creative and deliberately distinct from build_variant (a build_creative output leaf) and variant_id (a provider execution observed in reporting).", "creative_format": "A format spec identified by the composite of `agent_url` + `id` (see core/format-id.json).", - "transformer": "An account-scoped creative build capability offered by a creative agent (the creative analog of a product) \u2014 a voice, model, style, or director with typed config params and per-account pricing. `transformer_id` via `core/transformer.json`, discovered in `creative/list-transformers-response` and selected in `media-buy/build-creative-request`. Scoped to the issuing creative agent.", + "transformer": "An account-scoped creative build capability offered by a creative agent (the creative analog of a product) — a voice, model, style, or director with typed config params and per-account pricing. `transformer_id` via `core/transformer.json`, discovered in `creative/list-transformers-response` and selected in `media-buy/build-creative-request`. Scoped to the issuing creative agent.", "evaluator": "An account-scoped house evaluator preset a buyer attaches to `build_creative` to rank best_of_n variants - the rank-side of the get_creative_features feature oracle. `evaluator_id` on `core/evaluator-spec.json`, selected in `media-buy/build-creative-request`. The evaluator_id itself is pre-provisioned/account-arranged; only the feature vocabulary it emits is discovered via get_adcp_capabilities governance.creative_features. Scoped to the issuing creative agent.", - "build_variant": "A single produced creative variant leaf from build_creative \u2014 the leaf-level lineage anchor. `build_variant_id` on `media-buy/build-creative-response` BuildCreativeVariantSuccess `creatives[].variants[]`. Distinct from a served `variant_id` (delivery) and a `preview_id` (preview renders), and distinct from the call-level grouping `build_creative_id`. On the canonical promotion path, the kept build_variant_id becomes the durable creative_id; delivery joins then use creative_id.", + "build_variant": "A single produced creative variant leaf from build_creative — the leaf-level lineage anchor. `build_variant_id` on `media-buy/build-creative-response` BuildCreativeVariantSuccess `creatives[].variants[]`. Distinct from a served `variant_id` (delivery) and a `preview_id` (preview renders), and distinct from the call-level grouping `build_creative_id`. On the canonical promotion path, the kept build_variant_id becomes the durable creative_id; delivery joins then use creative_id.", "served_variant": "An agent-assigned immutable creative execution observed in delivery reporting. `variant_id` is unique within the issuing agent and round-trips from get_creative_delivery into preview_creative variant replay when that capability is supported. A distinct source revision, locale, or rendered manifest receives a distinct AdCP variant_id even when the underlying ad platform reuses a native identifier. Distinct from build_variant, creative_revision, and creative_locale_variant.", "audience": "A buyer-managed audience (CRM, lookalike seed, suppression). `audience_id` in media-buy/sync-audiences-request.", "audience_evidence": "A provider-scoped logical series of population-level audience evidence. `evidence_id` in core/audience-evidence.json and core/audience-evidence-selection.json remains stable while immutable snapshots receive distinct snapshot ids and content digests.", @@ -104,25 +114,25 @@ "demographic_interval_id": "A seller-scoped enumerated demographic interval exposed by Product.demographic_targeting and echoed by Package.targeting_resolution.demographics. The identifier is meaningful only with the seller product that published the interval; its authoritative age bounds travel alongside it in the product capability.", "spot_airing": "A seller-scoped scheduled spot occurrence. `spot_id` remains stable when the same airing is re-reported across measurement windows and may be referenced by later preemption or makegood workflows. It is occurrence identity, not creative identity.", "event_source": "A conversion pixel or event feed. `event_source_id` in media-buy/sync-event-sources-request, media-buy/log-event-request, and core/event.json.", - "impairment": "An open dependency-impact entry on a media buy \u2014 `impairment_id` in core/impairment.json. Stable for the lifetime of the open impairment; doubles as `notification_id` on the impairment webhook so receivers dedupe across at-least-once delivery.", + "impairment": "An open dependency-impact entry on a media buy — `impairment_id` in core/impairment.json. Stable for the lifetime of the open impairment; doubles as `notification_id` on the impairment webhook so receivers dedupe across at-least-once delivery.", "collection": "A publisher-scoped content collection declared in adagents.json. Identity is the tuple (publisher_domain, collection_id), represented by core/collection-ref.json.", "installment": "One installment within a publisher-scoped collection. Identity is the tuple (collection_ref, installment_id), represented by core/installment-ref.json.", "collection_list": "A buyer-managed collection list. `list_id` on collection/* schemas.", - "property_list": "A buyer-managed property list. `list_id` on property/* schemas. Same field name as collection_list \u2014 annotation distinguishes them.", + "property_list": "A buyer-managed property list. `list_id` on property/* schemas. Same field name as collection_list — annotation distinguishes them.", "catalog": "A buyer catalog feed (product, inventory, promotion, offering). `catalog_id` in media-buy/sync-catalogs-request and core/catalog.json.", "catalog_generation": "One immutable incarnation of a buyer catalog under a resolved account and catalog_id. The seller-issued `catalog_generation` remains stable across ordinary upserts and feed refreshes, changes after deletion and recreation, and is never reused for the same account and catalog_id.", "catalog_item": "One item in an immutable buyer-catalog incarnation. Identity is the tuple `(resolved account, catalog_id, catalog_generation, item_id)`; item_id alone is never globally unique and may use a type-specific source key.", "property": "A publisher property declared in adagents.json. Canonical cross-document identity is the tuple (publisher_domain, property_id), represented by core/property-ref.json; a property object inside its own adagents.json may rely on file context for publisher scope.", - "media_plan": "A media plan \u2014 distinct from media_buy (a plan can have multiple buys or precede a buy). Reserved for future media-plan schemas; no currently-shipped schemas use this value. Do not confuse with `governance_plan`, which owns every `plan_id` in governance/* schemas today.", + "media_plan": "A media plan — distinct from media_buy (a plan can have multiple buys or precede a buy). Reserved for future media-plan schemas; no currently-shipped schemas use this value. Do not confuse with `governance_plan`, which owns every `plan_id` in governance/* schemas today.", "governance_plan": "A governance plan (AI Act, consent, suitability). `plan_id` in governance/* schemas, plus media-buy/create-media-buy-request.plan_id (which flows into check_governance).", - "governance_registry_policy": "A governance policy identifier resolved against the shared AdCP policy registry (e.g., 'uk_hfss', 'us_coppa', 'garm:brand_safety:violence'). Globally unique and stable across organizations. Referenced as `policy_id` in governance/policy-ref.json, governance/sync-plans-request (plans[].policy_ids[], portfolio.shared_policy_ids[]), governance/sync-plans-response (resolved_policies[]), governance/policy-category-definition (regulatory_frameworks[].policy_ids[]), plus property/validation-result, error-details/policy-violation, and content-standards/* result breakdowns. Not interchangeable with `governance_inline_policy` \u2014 a registry id fed into an inline consumer (or vice versa) is the kind of cross-namespace conflation this split exists to catch.", + "governance_registry_policy": "A governance policy identifier resolved against the shared AdCP policy registry (e.g., 'uk_hfss', 'us_coppa', 'garm:brand_safety:violence'). Globally unique and stable across organizations. Referenced as `policy_id` in governance/policy-ref.json, governance/sync-plans-request (plans[].policy_ids[], portfolio.shared_policy_ids[]), governance/sync-plans-response (resolved_policies[]), governance/policy-category-definition (regulatory_frameworks[].policy_ids[]), plus property/validation-result, error-details/policy-violation, and content-standards/* result breakdowns. Not interchangeable with `governance_inline_policy` — a registry id fed into an inline consumer (or vice versa) is the kind of cross-namespace conflation this split exists to catch.", "governance_policy_category": "A shared policy-registry category such as political_advertising. Declared by governance/policy-category-definition.json and referenced by acceptance-policy rules and buyer acceptance context.", "governance_policy_category_facet": "A facet defined inside one policy-registry category, such as issue_advocacy within political_advertising. Identity is the tuple (category_id, facet_id).", "acceptance_policy_profile": "A seller-issued acceptance-policy profile identifier. Declared in a versioned acceptance-policy catalog and referenced from seller capability defaults and Product projections; stable within the catalog publisher's namespace.", "acceptance_policy_rule": "A seller-issued rule inside an acceptance-policy profile. Stable within the catalog publisher and profile version so seller errors and audit records can cite the same rule.", "media_buy_change_term": "A proposal-bound media-buy change term. The term_id is covered by terms_digest and may be referenced by the resulting media buy's available_actions[].change_term_id (or deprecated 3.1 terms_ref compatibility alias).", - "governance_inline_policy": "A bespoke, plan-scoped policy authored inline via governance/policy-entry.json. Scoped to the authoring container (plan, portfolio, or content-standards configuration) \u2014 the same id string in a different container refers to a different rule. Used for campaign-specific exclusions, custom brand rules, and ad-hoc additions to registry-sourced policies (inline policies can only add restrictions; they cannot relax registry-sourced enforcement). Every `$ref` to policy-entry.json inside an AdCP task schema is an inline usage \u2014 registry policies are served by a separate out-of-band endpoint, not embedded in task payloads.", - "governance_check": "A governance check result identifier. `check_id` in governance/check-governance-response and governance/report-plan-outcome-request \u2014 it round-trips between the two, so entity-identity tracking is required.", + "governance_inline_policy": "A bespoke, plan-scoped policy authored inline via governance/policy-entry.json. Scoped to the authoring container (plan, portfolio, or content-standards configuration) — the same id string in a different container refers to a different rule. Used for campaign-specific exclusions, custom brand rules, and ad-hoc additions to registry-sourced policies (inline policies can only add restrictions; they cannot relax registry-sourced enforcement). Every `$ref` to policy-entry.json inside an AdCP task schema is an inline usage — registry policies are served by a separate out-of-band endpoint, not embedded in task payloads.", + "governance_check": "A governance check result identifier. `check_id` in governance/check-governance-response and governance/report-plan-outcome-request — it round-trips between the two, so entity-identity tracking is required.", "governance_delivery_statement": "An immutable seller-issued delivery statement retained by the governance agent. `statement_id` is unique in the authenticated seller's namespace and bound to one governed action; buyer observations cite it as `seller_statement_id` so governance can detect seller equivocation or measurement disagreement.", "governance_delivery_observation": "An append-only buyer-issued delivery observation retained by the governance agent. `observation_id` identifies a separately attributed buyer measurement or a copy of a seller statement; newer observations can reconcile a dispute without deleting earlier evidence.", "governance_outcome": "A terminal governance outcome record. `outcome_id` is issued by governance/report-plan-outcome-response, consumed by governance/report-plan-adjustment-request, and retained on adjustment audit entries. It is scoped to the governance agent and plan owner.", @@ -134,7 +144,16 @@ "attestation_credential": "A credential issued by an attestor and referenced through core/attestation-reference.json. `credential_id` is scoped by the complete AttestationIssuer identity plus the evaluator-published `resolver_id`; the same credential_id under another issuer or resolver is a different credential.", "si_session": "A sponsored-intelligence conversation session. `session_id` in sponsored-intelligence/* schemas.", "offering": "A brand-published offering (campaign, promotion, product set, service) promoted via traditional creatives or SI conversations. `offering_id` in core/offering.json, sponsored-intelligence/si-get-offering-*, and sponsored-intelligence/si-initiate-session-request. Also appears as a catalog item-type id when `core/catalog.json::type` is `offering`.", - "vendor_metric": "A vendor-defined metric within a measurement vendor's vocabulary. `metric_id` in core/vendor-metric-id.json \u2014 used by reporting-capabilities.vendor_metrics declarations, delivery-metrics.vendor_metric_values emissions, and required_vendor_metrics filters. Identity is the tuple `(vendor.domain, vendor.brand_id, metric_id)` \u2014 the identifier is namespaced by the vendor's BrandRef, not globally unique. Vendor catalog (category, methodology, standard alignment) lives at the vendor's brand.json `agents[type='measurement']`.", - "identity_relying_party": "A verified-identity relying party an entity operates for attestation provenance in TMP Identity Match. `relying_party_id` in brand.json identity_relying_parties[] and trusted-match/identity-match-request.json attestation. Namespaced by the issuer (a vendor BrandRef, `core/brand-ref.json`) \u2014 identity is the tuple `(issuer.domain, issuer.brand_id, relying_party_id)`, mirroring vendor_metric's `(vendor.domain, vendor.brand_id, metric_id)`; the same string under a different issuer is a different relying party. The publishing owner (whose brand.json lists it) asserts ownership, and the receiver matches a forwarded attestation's `(issuer, relying_party_id)` against the claimed owner's published list; the issuer's own relying-party registry (e.g. World ID on-chain) is the authoritative root. One entity may operate many relying parties (scope=entity vs scope=property) \u2014 not 1:1 with an entity." + "vendor_metric": "A vendor-defined metric within a measurement vendor's vocabulary. `metric_id` in core/vendor-metric-id.json — used by reporting-capabilities.vendor_metrics declarations, delivery-metrics.vendor_metric_values emissions, and required_vendor_metrics filters. Identity is the tuple `(vendor.domain, vendor.brand_id, metric_id)` — the identifier is namespaced by the vendor's BrandRef, not globally unique. Vendor catalog (category, methodology, standard alignment) lives at the vendor's brand.json `agents[type='measurement']`.", + "reporting_destination": "A seller-resolved durable reporting destination, recipient, share, or grant binding. It may be provisioned through sync_accounts or established bilaterally; destination_ref is opaque within one authenticated caller and seller/account relationship and never contains a credential.", + "reporting_offering": "One seller-advertised atomic reporting feed/profile/schema/schedule/finality/method combination, selected by offering_id during durable delivery configuration.", + "reporting_delivery_config": "One caller-owned durable reporting policy on an account. delivery_config_id is unique within (authenticated caller, account) and persists when inactive so historical materializations remain resolvable.", + "reporting_definition": "An immutable normalized reporting query/profile definition. report_definition_id binds metric, grain, attribution, breakdown, action-definition, schema, and calendar/timezone semantics so unlike logical slices cannot collide.", + "reporting_obligation": "One expected report slice and due time. reporting_obligation_id exists before a revision or webhook and is what makes a missing first report observable.", + "reporting_revision": "One immutable emitted version of a reporting obligation's logical content. reporting_revision_id remains stable across materializations; a restatement receives a new id and points to the immediately superseded revision.", + "reporting_materialization": "One attempt to expose an exact reporting revision through one delivery path. A retry receives a new reporting_materialization_id while preserving reporting_revision_id.", + "reporting_receipt": "One authenticated consumer reconciliation outcome for an exact reporting materialization.", + "reporting_resource": "One seller-issued secret-free descriptor for an exact reporting materialization, resolved by resource_ref through get_reporting_status. Native platform versions supplement but do not replace this identity.", + "identity_relying_party": "A verified-identity relying party an entity operates for attestation provenance in TMP Identity Match. `relying_party_id` in brand.json identity_relying_parties[] and trusted-match/identity-match-request.json attestation. Namespaced by the issuer (a vendor BrandRef, `core/brand-ref.json`) — identity is the tuple `(issuer.domain, issuer.brand_id, relying_party_id)`, mirroring vendor_metric's `(vendor.domain, vendor.brand_id, metric_id)`; the same string under a different issuer is a different relying party. The publishing owner (whose brand.json lists it) asserts ownership, and the receiver matches a forwarded attestation's `(issuer, relying_party_id)` against the claimed owner's published list; the issuer's own relying-party registry (e.g. World ID on-chain) is the authoritative root. One entity may operate many relying parties (scope=entity vs scope=property) — not 1:1 with an entity." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/enums/notification-type.json b/schemas/cache/3.2.0-beta.9/enums/notification-type.json index af1025a37..3f40e35cc 100644 --- a/schemas/cache/3.2.0-beta.9/enums/notification-type.json +++ b/schemas/cache/3.2.0-beta.9/enums/notification-type.json @@ -1,7 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/enums/notification-type.json", "title": "Notification Type", - "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `account.change_recorded`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`) fire against an account's `notification_configs[]` entries whose `event_types` include the value \u2014 these outlive any single media buy and anchor at the account. `account.change_recorded` is the generic wake-up for the durable `list_account_changes` feed; specialized account notifications remain valid and may overlap it. `indicators.changed` and `creative.assignment_changed` are invalidations repaired completely through `get_media_buys`; `list_creatives` may provide a bounded reverse projection. Agent-anchored notifications (`capabilities.changed`) fire against the agent-level subscriber set managed by `sync_agent_notification_configs`; they are valid before a buyer has any account. Account status changes use `account.status_changed` as an invalidation signal; receivers repair by re-reading `list_accounts`. Wholesale feed notifications carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; product mirrors repair through `list_products` using `if_feed_version` and signal mirrors through `get_signals` using `if_wholesale_feed_version` (`get_products` remains the deprecated 3.x product fallback). Capability-change notifications carry only an invalidation payload in `/schemas/core/capabilities-changed-webhook.json`; receivers repair by re-reading `get_adcp_capabilities`. New notification types added to this enum MUST declare their anchor (media-buy, account, or agent), logical `notification_id` semantics, and repair key in the enumDescription. Sellers MUST reject `notification_configs[]` entries whose `event_types` include any media-buy-anchored or agent-anchored type, MUST reject `sync_agent_notification_configs` entries whose `event_types` include any media-buy-anchored or account-anchored type, and MUST reject `push_notification_config` registrations for persistent account-anchored or agent-anchored types.", + "description": "Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.assignment_changed`, `indicators.changed`, `creative.purged`, `account.status_changed`, `account.change_recorded`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`, `reporting.delivery_ready`) fire against an account's `notification_configs[]` entries whose `event_types` include the value — these outlive any single media buy and anchor at the account. `account.change_recorded` is the generic wake-up for the durable `list_account_changes` feed; specialized account notifications remain valid and may overlap it. `reporting.delivery_ready` is a compact doorbell repaired through `get_reporting_status`. `indicators.changed` and `creative.assignment_changed` are invalidations repaired completely through `get_media_buys`; `list_creatives` may provide a bounded reverse projection. Agent-anchored notifications (`capabilities.changed`) fire against the caller-scoped subscriber set managed by `sync_agent_configuration` or the specialized `sync_agent_notification_configs` compatibility task; they are valid before a buyer has any account. Account status changes use `account.status_changed` as an invalidation signal; receivers repair by re-reading `list_accounts`. Wholesale feed notifications carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; product mirrors repair through `list_products` using `if_feed_version` and signal mirrors through `get_signals` using `if_wholesale_feed_version` (`get_products` remains the deprecated 3.x product fallback). Capability-change notifications carry only an invalidation payload in `/schemas/core/capabilities-changed-webhook.json`; receivers repair by re-reading `get_adcp_capabilities`. New notification types added to this enum MUST declare their anchor (media-buy, account, or agent), logical `notification_id` semantics, and repair key in the enumDescription. Sellers MUST reject account-level `notification_configs[]` entries whose `event_types` include any media-buy-anchored or agent-anchored type, MUST reject agent-level entries from either sync task whose `event_types` include any media-buy-anchored or account-anchored type, and MUST reject `push_notification_config` registrations for persistent account-anchored or agent-anchored types.", "type": "string", "enum": [ "scheduled", @@ -25,20 +26,21 @@ "signal.priced", "signal.removed", "wholesale_feed.bulk_change", - "capabilities.changed" + "capabilities.changed", + "reporting.delivery_ready" ], "enumDescriptions": { - "scheduled": "Scheduled delivery report fire. Fired at the cadence the buyer registered on reporting_webhook (e.g., hourly, daily). Carries the window's delivery metrics. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", - "final": "Terminal delivery report fire. Sent once after the media buy reaches a terminal lifecycle state (completed, canceled, rejected). Carries final delivery aggregates. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", - "delayed": "Off-cadence delivery report fire indicating that the seller has detected late-arriving data for a prior window. Buyers SHOULD reconcile the affected window against this fire. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", - "adjusted": "Off-cadence delivery report fire indicating that the seller has revised a prior window's metrics (e.g., IVT filtering applied, attribution model run, makegood adjustment). Buyers SHOULD replace prior values for the affected window. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", - "window_update": "Off-cadence delivery report fire indicating that a wider measurement window supersedes an earlier window for the same reporting period (for example, C3 superseding live or C7 superseding C3). Buyers SHOULD replace the slice named by `supersedes_window` with the new `measurement_window` data. **notification_id**: absent \u2014 point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", + "scheduled": "Scheduled delivery report fire. Fired at the cadence the buyer registered on reporting_webhook (e.g., hourly, daily). Carries the window's delivery metrics. **notification_id**: absent — point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", + "final": "Terminal delivery report fire. Sent once after the media buy reaches a terminal lifecycle state (completed, canceled, rejected). Carries final delivery aggregates. **notification_id**: absent — point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", + "delayed": "Off-cadence delivery report fire indicating that the seller has detected late-arriving data for a prior window. Buyers SHOULD reconcile the affected window against this fire. **notification_id**: absent — point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", + "adjusted": "Off-cadence delivery report fire indicating that the seller has revised a prior window's metrics (e.g., IVT filtering applied, attribution model run, makegood adjustment). Buyers SHOULD replace prior values for the affected window. **notification_id**: absent — point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", + "window_update": "Off-cadence delivery report fire indicating that a wider measurement window supersedes an earlier window for the same reporting period (for example, C3 superseding live or C7 superseding C3). Buyers SHOULD replace the slice named by `supersedes_window` with the new `measurement_window` data. **notification_id**: absent — point-in-time data event with no persistent state id (snapshot-and-log Rule 1). Dedupe by `idempotency_key` only.", "impairment": "Dependency state change fire. Sent when a resource referenced by the buy enters an offline state that affects delivery for at least one package. Payload carries the impairment object and the buy's updated health. See impairment.json and the impairment.coherence assertion. **notification_id**: equals `impairment.impairment_id`. Stable across re-emissions of the same open impairment and across the closing fire that signals resolution; a new impairment for the same resource after closure receives a new id.", - "creative.status_changed": "Account-anchored fire. Sent when a creative in the account's library transitions status by seller or system initiative \u2014 `pending_review \u2192 approved`/`rejected`, `approved \u2192 pending_review` (re-review), `approved \u2192 suspended` (recoverable dependency/authorization loss), `suspended \u2192 approved` (recovery), `suspended \u2192 rejected` (terminal dependency/authorization loss), `approved \u2192 rejected` (post-approval revocation), `approved \u2192 archived` (seller-initiated). Fires per subscriber against each `notification_configs[]` entry whose `event_types` includes this value. Buyer-initiated transitions (archive, unarchive, resubmit) do NOT fire \u2014 those are acknowledged on the `sync_creatives` response path. Payload: `creative-status-changed-webhook.json`. **notification_id**: stable per (creative_id, transition) \u2014 re-emissions reuse the id; a fresh transition gets a new id.", - "creative.assignment_changed": "Optional account-anchored invalidation for any seller that can detect assignment or approval changes, including inline-only sellers without an indicator catalog. Sent when a package\u2013creative relationship is assigned, unassigned, or its aggregate/scoped approval outcome changes. Payload identifies account, media buy, package, and creative; receivers repair through get_media_buys. list_creatives may provide a bounded reverse projection but is not required. **notification_id**: stable per logical assignment change across re-emissions.", - "indicators.changed": "Account-anchored invalidation. Sent to subscribed buyers when the semantic indicator assertion set or evaluated coverage changes on a media buy, package, or package\u2013creative assignment, including invalidation after a material in-place creative update. A timestamp-only reevaluation does not fire. Payload identifies the relationship and affected types; get_media_buys is the universal repair path and creative-library sellers may additionally declare list_creatives. **notification_id**: stable per logical snapshot change across re-emissions.", + "creative.status_changed": "Account-anchored fire. Sent when a creative in the account's library transitions status by seller or system initiative — `pending_review → approved`/`rejected`, `approved → pending_review` (re-review), `approved → suspended` (recoverable dependency/authorization loss), `suspended → approved` (recovery), `suspended → rejected` (terminal dependency/authorization loss), `approved → rejected` (post-approval revocation), `approved → archived` (seller-initiated). Fires per subscriber against each `notification_configs[]` entry whose `event_types` includes this value. Buyer-initiated transitions (archive, unarchive, resubmit) do NOT fire — those are acknowledged on the `sync_creatives` response path. Payload: `creative-status-changed-webhook.json`. **notification_id**: stable per (creative_id, transition) — re-emissions reuse the id; a fresh transition gets a new id.", + "creative.assignment_changed": "Optional account-anchored invalidation for any seller that can detect assignment or approval changes, including inline-only sellers without an indicator catalog. Sent when a package–creative relationship is assigned, unassigned, or its aggregate/scoped approval outcome changes. Payload identifies account, media buy, package, and creative; receivers repair through get_media_buys. list_creatives may provide a bounded reverse projection but is not required. **notification_id**: stable per logical assignment change across re-emissions.", + "indicators.changed": "Account-anchored invalidation. Sent to subscribed buyers when the semantic indicator assertion set or evaluated coverage changes on a media buy, package, or package–creative assignment, including invalidation after a material in-place creative update. A timestamp-only reevaluation does not fire. Payload identifies the relationship and affected types; get_media_buys is the universal repair path and creative-library sellers may additionally declare list_creatives. **notification_id**: stable per logical snapshot change across re-emissions.", "creative.purged": "Account-anchored fire. Sent when a creative is destroyed from the seller's library (retention sweep, takedown, legal erasure). Fires per subscriber against each `notification_configs[]` entry whose `event_types` includes this value. Soft purges retain a tombstone on `list_creatives` (with `include_purged: true`) for the webhook retention window and form a conformant snapshot/log pair. Hard purges do not retain a tombstone because compelled legal erasure forbids read-side recovery; they are explicitly outside the snapshot/log contract, and the webhook is the buyer's only signal. Payload: `creative-purged-webhook.json`. **notification_id**: stable per (creative_id, purge event); not coalesced (purge is a discrete destruction event).", - "account.status_changed": "Account-anchored fire. Sent when an account lifecycle status changes after the initial sync_accounts result, including `pending_approval -> active`, `pending_approval -> rejected`, `active -> payment_required`, `active -> suspended`, recovery back to `active`, and terminal `closed`. Fires per subscriber against each `notification_configs[]` entry whose `event_types` includes this value. Payload: `account-status-changed-webhook.json`. The payload does not include the full account document or setup.url; receivers SHOULD re-run `list_accounts` for the account_id and reconcile from the authoritative account snapshot. **notification_id**: stable per (account_id, previous_status, status, observed_at) \u2014 re-emissions reuse the id; a fresh transition cycle receives a new id.", + "account.status_changed": "Account-anchored fire. Sent when an account lifecycle status changes after the initial sync_accounts result, including `pending_approval -> active`, `pending_approval -> rejected`, `active -> payment_required`, `active -> suspended`, recovery back to `active`, and terminal `closed`. Fires per subscriber against each `notification_configs[]` entry whose `event_types` includes this value. Payload: `account-status-changed-webhook.json`. The payload does not include the full account document or setup.url; receivers SHOULD re-run `list_accounts` for the account_id and reconcile from the authoritative account snapshot. **notification_id**: stable per (account_id, previous_status, status, observed_at) — re-emissions reuse the id; a fresh transition cycle receives a new id.", "account.change_recorded": "Account-anchored invalidation. Sent once per committed material change represented in `list_account_changes`, including changes made through AdCP, a seller operator or system, another authorized principal, or a connected platform. Payload: `account-change-recorded-webhook.json`. Receivers drain from their own persisted feed cursor and then call the change record's repair task; the webhook is not authoritative current state. **notification_id**: equals `change_id`. Transport retries reuse one `idempotency_key`; deliberate re-emission uses a new delivery key with the same notification_id.", "product.created": "Sent when a new product is added to the seller's wholesale product feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `product.created` event with the full post-change Product object. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "product.updated": "Sent when product metadata changes in the seller's wholesale product feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `product.updated` event with the changed Product object when available and indicator `changed_fields[]`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", @@ -49,6 +51,7 @@ "signal.priced": "Sent when signal pricing changes in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.priced` event with the full post-change `pricing_options[]`, optional retired pricing ids, and optional `effective_at`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "signal.removed": "Sent when a signal is no longer available in the seller's wholesale signals feed for the subscriber's account scope. Payload: `wholesale-feed-webhook.json` carrying a `signal.removed` event with the signal id, optional removal reason, and cache scope. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", "wholesale_feed.bulk_change": "Sent when one operation changes too many wholesale product-feed or wholesale signals-feed entities for useful per-entity pushes. Payload: `wholesale-feed-webhook.json` carrying a `wholesale_feed.bulk_change` event with one affected entity type, approximate count, and repair recommendation. Receivers repair products through `list_products` (or deprecated 3.x `get_products`) and signals through `get_signals`. **notification_id**: equals `event.event_id`; re-emissions of the same logical change reuse the same value under a new `idempotency_key`.", - "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each `sync_agent_notification_configs.notification_configs[]` entry whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id." + "capabilities.changed": "Agent-anchored fire. Sent when the seller's advertised `get_adcp_capabilities` document materially changes. Fires per subscriber against each caller-scoped agent `notification_configs[]` entry managed through `sync_agent_configuration` or `sync_agent_notification_configs` whose `event_types` includes this value. Payload: `capabilities-changed-webhook.json`. The payload does not include the full capability document; receivers SHOULD re-run `get_adcp_capabilities`, compare `adcp.capability_changes.capabilities_version` or `last_modified` when present, and update their cache from that fresh response. **notification_id**: stable per material capability revision; re-emissions of the same revision reuse the id, and a later material revision receives a new id.", + "reporting.delivery_ready": "Experimental account-anchored readiness doorbell. Fires after one immutable reporting materialization is observable through the intended consumer path. Payload: `reporting-delivery-ready-webhook.json`; it carries identities and readiness metadata, never report rows or credentials. Receivers repair missed, duplicate, or out-of-order fires through `get_reporting_status`. **notification_id**: stable per reporting_materialization_id reaching its ready state across re-emissions; a new retry/materialization receives a new id." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.6/enums/reporting-finality.json b/schemas/cache/3.2.0-beta.9/enums/reporting-finality.json similarity index 87% rename from schemas/cache/3.2.0-beta.6/enums/reporting-finality.json rename to schemas/cache/3.2.0-beta.9/enums/reporting-finality.json index 8683a4d2d..3dee6752f 100644 --- a/schemas/cache/3.2.0-beta.6/enums/reporting-finality.json +++ b/schemas/cache/3.2.0-beta.9/enums/reporting-finality.json @@ -1,14 +1,12 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/enums/reporting-finality.json", "title": "Reporting Finality", "description": "Finality of a reporting revision, aligned with the delivery-revision vocabulary proposed in #6122. Finality is independent of immutable revision identity: both snapshot and official revisions may be superseded by later revisions.", "type": "string", - "enum": [ - "snapshot", - "official" - ], + "enum": ["snapshot", "official"], "enumDescriptions": { "snapshot": "Provisional seller/source reporting evidence; not sufficient by itself for billing.", "official": "The seller considers the represented period finalized, subject to separate measurement, billing, and settlement terms." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.6/enums/reporting-health.json b/schemas/cache/3.2.0-beta.9/enums/reporting-health.json similarity index 89% rename from schemas/cache/3.2.0-beta.6/enums/reporting-health.json rename to schemas/cache/3.2.0-beta.9/enums/reporting-health.json index aead93da8..139f24cca 100644 --- a/schemas/cache/3.2.0-beta.6/enums/reporting-health.json +++ b/schemas/cache/3.2.0-beta.9/enums/reporting-health.json @@ -1,15 +1,10 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/enums/reporting-health.json", "title": "Reporting Health", "description": "Operational health for an explicitly echoed reporting scope. Aggregate precedence is action_required, delayed, then healthy. waiting applies only when no active obligation is due. complete applies only when the queried scope is closed, retained coverage is complete, and every obligation has its configured required finality plus a verified readable materialization.", "type": "string", - "enum": [ - "healthy", - "waiting", - "delayed", - "action_required", - "complete" - ], + "enum": ["healthy", "waiting", "delayed", "action_required", "complete"], "enumDescriptions": { "healthy": "Due obligations in the queried active scope are current and automated delivery is working.", "waiting": "No obligation in the queried active scope is due yet.", @@ -17,4 +12,4 @@ "action_required": "A delivery, SLA, or retry boundary was crossed and at least one structured human action is supplied.", "complete": "The queried scope is closed, retained coverage is complete, and every obligation has its configured required finality plus a verified readable materialization." } -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/enums/task-type.json b/schemas/cache/3.2.0-beta.9/enums/task-type.json index 7b294045e..d3c69651e 100644 --- a/schemas/cache/3.2.0-beta.9/enums/task-type.json +++ b/schemas/cache/3.2.0-beta.9/enums/task-type.json @@ -1,5 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/enums/task-type.json", "title": "Task Type", "description": "Valid AdCP task types across all domains. These represent the complete set of operations that can be tracked via the task management system.", "type": "string", @@ -36,7 +37,9 @@ "get_rights", "acquire_rights", "update_rights", - "sync_agent_notification_configs" + "sync_agent_notification_configs", + "sync_agent_configuration", + "sync_reporting_receipts" ], "enumDescriptions": { "create_media_buy": "Media-buy domain: Create a new advertising campaign with one or more packages", @@ -71,7 +74,9 @@ "get_rights": "Brand domain: Search for licensable rights across a brand agent's roster with pricing", "acquire_rights": "Brand domain: Acquire rights from a brand agent with contractual clearance and generation credentials", "update_rights": "Brand domain: Update an existing rights grant, including its term, impression cap, pricing option, or pause state", - "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications" + "sync_agent_notification_configs": "Protocol domain: Register agent-level webhook subscribers such as capabilities.changed cache-invalidation notifications", + "sync_agent_configuration": "Protocol domain: Synchronize caller-scoped agent connection configuration, including webhooks and reusable reporting destinations", + "sync_reporting_receipts": "Media-buy domain: Submit authenticated consumer reconciliation outcomes for reporting materializations" }, "x-task-result-schema-overrides": { "media_buy_delivery": "media-buy/media-buy-delivery-webhook-result.json" @@ -82,4 +87,4 @@ "This enum is used in task management APIs (tasks/list, tasks/get) and webhook payloads", "New task types require a minor version bump per semantic versioning" ] -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/index.json b/schemas/cache/3.2.0-beta.9/index.json index 26b156273..279b6d03a 100644 --- a/schemas/cache/3.2.0-beta.9/index.json +++ b/schemas/cache/3.2.0-beta.9/index.json @@ -1,16 +1,17 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/index.json", "title": "AdCP Schema Registry", "version": "1.0.0", "description": "Registry of all AdCP JSON schemas for validation and discovery", "adcp_version": "3.2.0-beta.9", "versioning": { - "note": "AdCP uses build-time versioning. This directory contains schemas for AdCP 3.2.0-beta.9. Full semantic versions are available at /schemas/{version}/ (e.g., /schemas/2.5.0/). Major version aliases point to the latest stable release in that major line; use /schemas/index.json or /schemas/latest.json for the canonical file-based pointer." + "note": "AdCP uses path-based versioning. The schema URL path (/schemas/) indicates the version. Individual request/response schemas do NOT include adcp_version fields. Compatibility follows semantic versioning rules." }, - "lastUpdated": "2026-08-28", - "baseUrl": "/schemas/3.2.0-beta.9", - "stability": "beta", - "prerelease": true, + "lastUpdated": "2026-06-05", + "baseUrl": "/schemas/latest", + "stability": "development", + "prerelease": false, "deprecated": false, "protocol_layers": [ { @@ -41,1009 +42,1037 @@ "description": "Core data models used throughout AdCP", "schemas": { "product": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product.json", + "$ref": "/schemas/core/product.json", "description": "Represents available advertising inventory" }, "canonical-product": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-product.json", + "$ref": "/schemas/core/canonical-product.json", "description": "Canonical-only product view for the AdCP 3.2 split product and proposal tools" }, "inventory-list-application": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/inventory-list-application.json", + "$ref": "/schemas/core/inventory-list-application.json", "description": "Product-scoped receipt for property- and collection-list matching" }, "canonical-format-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-format-option.json", + "$ref": "/schemas/core/canonical-format-option.json", "description": "Compact canonical format declaration without legacy named-format links" }, "creative-operation-format-declaration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-operation-format-declaration.json", + "$ref": "/schemas/core/creative-operation-format-declaration.json", "description": "Authority-free canonical declaration for creative-agent build, validation, and preview capabilities" }, "canonical-placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-placement.json", + "$ref": "/schemas/core/canonical-placement.json", "description": "Compact canonical product placement" }, "canonical-product-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-product-action.json", + "$ref": "/schemas/core/canonical-product-action.json", "description": "Fine-grained action template for compact products" }, "canonical-proposal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-proposal.json", + "$ref": "/schemas/core/canonical-proposal.json", "description": "Compact immutable proposal with a typed commercial envelope" }, "canonical-account-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-account-ref.json", + "$ref": "/schemas/core/canonical-account-ref.json", "description": "Compact account identity without inline brand documents" }, "canonical-budget-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-budget-allocation.json", + "$ref": "/schemas/core/canonical-budget-allocation.json", "description": "Compact budget allocation for canonical MediaBuy tools" }, "canonical-optimization-goal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-optimization-goal.json", + "$ref": "/schemas/core/canonical-optimization-goal.json", "description": "Compact optimization goal without legacy targets or inline vendor brands" }, "canonical-metric-qualifier": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-metric-qualifier.json", + "$ref": "/schemas/core/canonical-metric-qualifier.json", "description": "Compact reporting metric qualifier" }, "canonical-reporting-commitment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-reporting-commitment.json", + "$ref": "/schemas/core/canonical-reporting-commitment.json", "description": "Compact standard or vendor reporting commitment" }, "canonical-media-buy-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-media-buy-action.json", + "$ref": "/schemas/core/canonical-media-buy-action.json", "description": "Available MediaBuy action routed to its compact-lifecycle task" }, "keyword-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/keyword-target.json", + "$ref": "/schemas/core/keyword-target.json", "description": "Compact keyword targeting mutation" }, "compact-task-submitted": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/compact-task-submitted.json", + "$ref": "/schemas/core/compact-task-submitted.json", "description": "Shared submitted envelope for compact lifecycle tools" }, "compact-task-working": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/compact-task-working.json", + "$ref": "/schemas/core/compact-task-working.json", "description": "Shared progress payload for compact lifecycle tools" }, "compact-task-input-required": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/compact-task-input-required.json", + "$ref": "/schemas/core/compact-task-input-required.json", "description": "Shared input-required payload for compact lifecycle tools" }, "media-buy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/media-buy.json", + "$ref": "/schemas/core/media-buy.json", "description": "Represents a purchased advertising campaign" }, "package": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package.json", + "$ref": "/schemas/core/package.json", "description": "A specific product within a media buy (line item)" }, "package-format-snapshot": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package-format-snapshot.json", + "$ref": "/schemas/core/package-format-snapshot.json", "description": "Immutable package-time selected product format, placement, execution-version, and tracker-contract binding" }, "committed-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/committed-metric.json", + "$ref": "/schemas/core/committed-metric.json", "description": "One metric in a package's binding reporting contract" }, "creative-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-asset.json", + "$ref": "/schemas/core/creative-asset.json", "description": "Creative asset for upload to library - supports static assets, generative formats, and third-party ad serving (VAST, DAAST, HTML, JavaScript)" }, "locale-tag": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/locale-tag.json", - "description": "BCP 47 language-identity tag using the AdCP canonical wire profile \u2014 required shared primitive for new language-bearing fields" + "$ref": "/schemas/core/locale-tag.json", + "description": "BCP 47 language-identity tag using the AdCP canonical wire profile — required shared primitive for new language-bearing fields" }, "creative-localization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-localization.json", + "$ref": "/schemas/core/creative-localization.json", "description": "Explicit source and target locale variants requested on a creative" }, "localized-creative-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/localized-creative-asset.json", + "$ref": "/schemas/core/localized-creative-asset.json", "description": "Creative variant asset with contextual language-tag conformance" }, "creative-localization-readback": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-localization-readback.json", + "$ref": "/schemas/core/creative-localization-readback.json", "description": "Exact materialized locale assets, buyer-assigned identities, and matching policy" }, "account": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account.json", + "$ref": "/schemas/core/account.json", "description": "Billing account representing who pays for advertising. Accounts have rate cards, payment terms, and platform mappings." }, "operator-identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/operator-identity.json", + "$ref": "/schemas/core/operator-identity.json", "description": "Complete buyer-desired operator domain and optional operator-owned unit for an advertiser account" }, "account-identity-change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-identity-change.json", + "$ref": "/schemas/core/account-identity-change.json", "description": "Pending or rejected operator-identity transition on an existing account" }, "account-identity-change-preview": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-identity-change-preview.json", + "$ref": "/schemas/core/account-identity-change-preview.json", "description": "Non-persisted impact and disposition preview for a dry-run account identity transition" }, "account-with-authorization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-with-authorization.json", + "$ref": "/schemas/core/account-with-authorization.json", "description": "List-accounts response item combining Account with caller-specific authorization metadata" }, "targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/targeting.json", + "$ref": "/schemas/core/targeting.json", "description": "Audience targeting criteria" }, "targeting-overlay-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/targeting-overlay-support.json", + "$ref": "/schemas/core/targeting-overlay-support.json", "description": "Product-scoped targeting dimensions whose values may be supplied on packages later" }, "targeting-overlay-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/targeting-overlay-requirements.json", + "$ref": "/schemas/core/targeting-overlay-requirements.json", "description": "Buyer requirements for product-scoped targeting dimensions that must remain selectable on packages" }, "geo-region-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-region-requirement.json", + "$ref": "/schemas/core/geo-region-requirement.json", "description": "Buyer country/value requirements for ISO subdivision targeting selected later" }, "geo-region-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-region-support.json", + "$ref": "/schemas/core/geo-region-support.json", "description": "Country- and value-aware selectable ISO subdivision targeting support" }, "product-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-targeting-resolution.json", + "$ref": "/schemas/core/product-targeting-resolution.json", "description": "Discovery-time targeting modifications bound to a configured product" }, "package-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package-targeting-resolution.json", + "$ref": "/schemas/core/package-targeting-resolution.json", "description": "Execution details for targeting accepted on a booked package" }, "targeting-modification": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/targeting-modification.json", + "$ref": "/schemas/core/targeting-modification.json", "description": "One buyer-reviewable targeting modification on a configured product" }, "placement-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement-selection.json", + "$ref": "/schemas/core/placement-selection.json", "description": "Purchased placement inventory selection within a product" }, "demographic-age-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-age-range.json", + "$ref": "/schemas/core/demographic-age-range.json", "description": "Canonical inclusive age interval with explicit unknown-age membership" }, "demographic-predicate": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-predicate.json", + "$ref": "/schemas/core/demographic-predicate.json", "description": "Portable demographic audience intent, beginning with age in AdCP 3.2" }, "demographic-targeting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-targeting-capability.json", + "$ref": "/schemas/core/demographic-targeting-capability.json", "description": "Product-scoped demographic execution modes and exact interval capabilities" }, "demographic-reporting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-reporting-capability.json", + "$ref": "/schemas/core/demographic-reporting-capability.json", "description": "Product-scoped demographic reporting ranges, systems, and suppression posture" }, "demographic-targeting-resolution": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/demographic-targeting-resolution.json", + "$ref": "/schemas/core/demographic-targeting-resolution.json", "description": "Requested, applied, execution, and exact-equivalence demographic readback" }, "audience-characteristic": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-characteristic.json", + "$ref": "/schemas/core/audience-characteristic.json", "description": "Machine-comparable audience dimension and value or range" }, "audience-evidence": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-evidence.json", + "$ref": "/schemas/core/audience-evidence.json", "description": "Immutable population-level audience composition, affinity, or reach evidence" }, "audience-evidence-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-evidence-requirements.json", + "$ref": "/schemas/core/audience-evidence-requirements.json", "description": "Buyer-authored audience-evidence admissibility and ranking policy" }, "audience-evidence-pin": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-evidence-pin.json", + "$ref": "/schemas/core/audience-evidence-pin.json", "description": "Buyer commitment pin for an exact immutable audience-evidence snapshot" }, "audience-evidence-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-evidence-selection.json", + "$ref": "/schemas/core/audience-evidence-selection.json", "description": "Digest-pinned package readback for evidence used in a decision" }, "duration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/duration.json", + "$ref": "/schemas/core/duration.json", "description": "A time duration with value and unit (hours or days)" }, "feature-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/feature-requirement.json", - "description": "A feature-based requirement \u2014 reusable predicate over a feature value. Used by property list filters, designed for reuse across governance surfaces." + "$ref": "/schemas/core/feature-requirement.json", + "description": "A feature-based requirement — reusable predicate over a feature value. Used by property list filters, designed for reuse across governance surfaces." }, "frequency-cap": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/frequency-cap.json", + "$ref": "/schemas/core/frequency-cap.json", "description": "Frequency capping settings" }, "planned-delivery": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/planned-delivery.json", + "$ref": "/schemas/core/planned-delivery.json", "description": "The seller's interpreted delivery parameters for a media buy" }, "geo-breakdown-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-breakdown-support.json", + "$ref": "/schemas/core/geo-breakdown-support.json", "description": "Geographic breakdown capability declaration for reporting" }, "spot-reporting-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/spot-reporting-capability.json", + "$ref": "/schemas/core/spot-reporting-capability.json", "description": "Spot-level as-run reporting support and available spot-grain metrics" }, "format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/format.json", + "$ref": "/schemas/core/format.json", "description": "Deprecated 3.x named-format compatibility definition; use ProductFormatDeclaration canonical contracts for new integrations.", "deprecated": true }, "overlay": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/overlay.json", + "$ref": "/schemas/core/overlay.json", "description": "A publisher-controlled element that renders on top of buyer creative content within an ad placement" }, "outcome-measurement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/outcome-measurement.json", + "$ref": "/schemas/core/outcome-measurement.json", "description": "Business outcome measurement capabilities included with a product" }, "delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/delivery-metrics.json", + "$ref": "/schemas/core/delivery-metrics.json", "description": "Standard delivery metrics for reporting" }, "delivery-metric-aggregate": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/delivery-metric-aggregate.json", + "$ref": "/schemas/core/delivery-metric-aggregate.json", "description": "Cross-buy delivery aggregate partitioned by metric scope and qualifier" }, "placement-evidence": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement-evidence.json", + "$ref": "/schemas/core/placement-evidence.json", "description": "Seller-attested evidence artifact proving a physical placement ran (posting photo, tearsheet)" }, "missing-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/missing-metric.json", + "$ref": "/schemas/core/missing-metric.json", "description": "Metric from the binding reporting contract that is absent from a delivery report" }, "catalog-item-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/catalog-item-delivery-metrics.json", + "$ref": "/schemas/core/catalog-item-delivery-metrics.json", "description": "Delivery metrics row for one catalog item" }, "creative-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-delivery-metrics.json", + "$ref": "/schemas/core/creative-delivery-metrics.json", "description": "Delivery metrics row for one creative" }, "keyword-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/keyword-delivery-metrics.json", + "$ref": "/schemas/core/keyword-delivery-metrics.json", "description": "Delivery metrics row for one keyword and match type" }, "geo-delivery-metrics": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-delivery-metrics.json", + "$ref": "/schemas/core/geo-delivery-metrics.json", "description": "Delivery metrics row for one geographic area" }, "creative-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-policy.json", + "$ref": "/schemas/core/creative-policy.json", "description": "Creative requirements and restrictions for a product" }, "deadline-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/deadline-policy.json", + "$ref": "/schemas/core/deadline-policy.json", "description": "Default deadline rules for installments based on lead times from scheduled_at" }, "installment-deadlines": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/installment-deadlines.json", + "$ref": "/schemas/core/installment-deadlines.json", "description": "Booking, cancellation, and material submission deadlines for an installment" }, "material-deadline": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/material-deadline.json", + "$ref": "/schemas/core/material-deadline.json", "description": "A deadline for creative material submission at a specific stage" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/response.json", + "$ref": "/schemas/core/response.json", "description": "Standard response structure (MCP)" }, "error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/error.json", + "$ref": "/schemas/core/error.json", "description": "Standard error structure" }, "generation-credential": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/generation-credential.json", + "$ref": "/schemas/core/generation-credential.json", "description": "Scoped credential for generating rights-cleared content via LLM providers" }, "attestation-issuer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-issuer.json", + "$ref": "/schemas/core/attestation-issuer.json", "description": "Typed canonical identity of an attestation credential issuer" }, "attestation-subject": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-subject.json", + "$ref": "/schemas/core/attestation-subject.json", "description": "Typed identity of the entity or object an attestation concerns" }, "attestation-reference": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-reference.json", + "$ref": "/schemas/core/attestation-reference.json", "description": "Reference-first presentation of an independently issued claim" }, "attestation-capabilities": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-capabilities.json", + "$ref": "/schemas/core/attestation-capabilities.json", "description": "Evaluator allowlist and supported attestation delivery and proof formats" }, "attestation-evaluation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-evaluation.json", + "$ref": "/schemas/core/attestation-evaluation.json", "description": "Evaluator-of-record result bound to an exact attestation presentation" }, "rights-attestation-evaluation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/rights-attestation-evaluation.json", + "$ref": "/schemas/core/rights-attestation-evaluation.json", "description": "Seller-produced rights-grant presentation and evaluation readback" }, "rights-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/rights-constraint.json", + "$ref": "/schemas/core/rights-constraint.json", "description": "Digest-pinned rights metadata and portable issuer-attestation references attached to creatives" }, "pagination-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/pagination-request.json", + "$ref": "/schemas/core/pagination-request.json", "description": "Standard cursor-based pagination parameters for list request schemas" }, "pagination-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/pagination-response.json", + "$ref": "/schemas/core/pagination-response.json", "description": "Standard cursor-based pagination metadata for list response schemas" }, "date-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/date-range.json", + "$ref": "/schemas/core/date-range.json", "description": "Date range with inclusive start and end calendar dates" }, "opportunity-context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/opportunity-context.json", + "$ref": "/schemas/core/opportunity-context.json", "description": "Buyer planning-cycle context shared across proposal request, decline, and purchase" }, "datetime-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/datetime-range.json", + "$ref": "/schemas/core/datetime-range.json", "description": "Datetime range with inclusive start and end timestamps" }, "creative-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-item.json", + "$ref": "/schemas/core/creative-item.json", "description": "Item within a multi-asset creative format" }, "creative-assignment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-assignment.json", + "$ref": "/schemas/core/creative-assignment.json", "description": "Assignment of a creative asset to a package" }, "creative-manifest": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-manifest.json", + "$ref": "/schemas/core/creative-manifest.json", "description": "Complete specification of a creative with all assets needed for rendering" }, "creative-representation-set": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-representation-set.json", + "$ref": "/schemas/core/creative-representation-set.json", "description": "Complete immutable creative revision containing equivalent pre-binding trafficking representations" }, "creative-representation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-representation.json", + "$ref": "/schemas/core/creative-representation.json", "description": "One canonical pre-binding trafficking representation within a representation set" }, "representation-destination": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/representation-destination.json", + "$ref": "/schemas/core/representation-destination.json", "description": "Seller-owned product and format context for deterministic representation resolution" }, "representation-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/representation-selection.json", + "$ref": "/schemas/core/representation-selection.json", "description": "Source-revision, selected-representation, strategy, and derived-output lineage" }, "representation-rejection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/representation-rejection.json", + "$ref": "/schemas/core/representation-rejection.json", "description": "Structured incompatibility reason for one rejected representation" }, "macro-bearing-url": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-bearing-url.json", + "$ref": "/schemas/core/macro-bearing-url.json", "description": "HTTP(S) URL or legacy URI template that may contain declared or opaque macro tokens" }, "macro-declaration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-declaration.json", + "$ref": "/schemas/core/macro-declaration.json", "description": "Occurrence-level source token, semantic, actor, context, and encoding contract" }, "macro-encoding": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-encoding.json", + "$ref": "/schemas/core/macro-encoding.json", "description": "Exact macro value encoding kind and pass depth" }, "macro-resolution-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-resolution-capability.json", + "$ref": "/schemas/core/macro-resolution-capability.json", "description": "Exact dialect-semantic macro processing capability tuple" }, "macro-resolution-result": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-resolution-result.json", + "$ref": "/schemas/core/macro-resolution-result.json", "description": "Path-addressable macro compatibility result for one declaration" }, "macro-translation-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-translation-target.json", + "$ref": "/schemas/core/macro-translation-target.json", "description": "Native token contract emitted by a macro translation operation" }, "performance-feedback": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/performance-feedback.json", + "$ref": "/schemas/core/performance-feedback.json", "description": "Stored processing record for performance feedback" }, "performance-feedback-assertion": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/performance-feedback-assertion.json", + "$ref": "/schemas/core/performance-feedback-assertion.json", "description": "One compact optimizer-ready assertion about a media buy, package, or creative" }, "creative-variant": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-variant.json", + "$ref": "/schemas/core/creative-variant.json", "description": "A specific execution variant of a creative with performance metrics" }, "creative-revision-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-revision-id.json", + "$ref": "/schemas/core/creative-revision-id.json", "description": "Buyer-assigned immutable input-content revision identity scoped to a creative" }, "property": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/property.json", + "$ref": "/schemas/core/property.json", "description": "An advertising property that can be validated via adagents.json" }, "creative-brief": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-brief.json", + "$ref": "/schemas/core/creative-brief.json", "description": "Campaign-level creative context for AI-powered creative generation" }, "creative-variable": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-variable.json", + "$ref": "/schemas/core/creative-variable.json", "description": "A dynamic content variable (DCO slot) on a creative" }, "reference-asset": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/reference-asset.json", + "$ref": "/schemas/core/reference-asset.json", "description": "A reference asset with semantic role for creative context" }, "registry-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/registry-event.json", + "$ref": "/schemas/core/registry-event.json", "description": "A cursor-ordered registry change-feed event from /api/registry/feed" }, "registry-feed-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/registry-feed-response.json", + "$ref": "/schemas/core/registry-feed-response.json", "description": "Response wrapper for GET /api/registry/feed" }, "proposal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/proposal.json", + "$ref": "/schemas/core/proposal.json", "description": "A proposed media plan with budget allocations across products - actionable via create_media_buy" }, "budget-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/budget-allocation.json", + "$ref": "/schemas/core/budget-allocation.json", "description": "Fixed or seller-optimized allocation of a media-buy total budget across packages" }, "bidding-policy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/bidding-policy.json", + "$ref": "/schemas/core/bidding-policy.json", "description": "Buyer-authored bidding, average-cost, or return policy at media-buy or package scope" }, "insertion-order": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/insertion-order.json", + "$ref": "/schemas/core/insertion-order.json", "description": "A formal insertion order attached to a committed proposal for agreement signing" }, "product-allocation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-allocation.json", + "$ref": "/schemas/core/product-allocation.json", "description": "A budget allocation for a specific product within a proposal" }, "delivery-forecast": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/delivery-forecast.json", + "$ref": "/schemas/core/delivery-forecast.json", "description": "Forecasted delivery metrics for a proposal or product allocation" }, "signal-coverage-forecast": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-coverage-forecast.json", + "$ref": "/schemas/core/signal-coverage-forecast.json", "description": "Forecast-shaped availability guidance for a signal, without requiring monetary currency" }, "forecast-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-range.json", + "$ref": "/schemas/core/forecast-range.json", "description": "A forecast value with optional low/high bounds" }, "forecast-point": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-point.json", + "$ref": "/schemas/core/forecast-point.json", "description": "A single point on a budget-to-outcome curve" }, "forecast-point-dimensions": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-point-dimensions.json", + "$ref": "/schemas/core/forecast-point-dimensions.json", "description": "Dimensional slice represented by a forecast point" }, "forecast-dimension-geo": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-geo.json", + "$ref": "/schemas/core/forecast-dimension-geo.json", "description": "Geographic forecast dimension variant" }, "forecast-dimension-placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-placement.json", + "$ref": "/schemas/core/forecast-dimension-placement.json", "description": "Placement forecast dimension variant" }, "forecast-dimension-device-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-device-type.json", + "$ref": "/schemas/core/forecast-dimension-device-type.json", "description": "Device form-factor forecast dimension variant" }, "forecast-dimension-device-platform": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-device-platform.json", + "$ref": "/schemas/core/forecast-dimension-device-platform.json", "description": "Device platform forecast dimension variant" }, "forecast-dimension-audience": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-audience.json", + "$ref": "/schemas/core/forecast-dimension-audience.json", "description": "Audience forecast dimension variant" }, "forecast-dimension-signal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-signal.json", + "$ref": "/schemas/core/forecast-dimension-signal.json", "description": "Signal forecast dimension variant" }, "forecast-dimension-time": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-dimension-time.json", + "$ref": "/schemas/core/forecast-dimension-time.json", "description": "Calendar-window forecast dimension variant for availability windows" }, "forecast-vendor-metric-value": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/forecast-vendor-metric-value.json", + "$ref": "/schemas/core/forecast-vendor-metric-value.json", "description": "Forecasted vendor-defined measurement value with low/mid/high bounds" }, "catalog": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/catalog.json", - "description": "A typed data feed \u2014 structural (offering, product, inventory, store, promotion) or vertical (hotel, flight, job, vehicle, real_estate, education, destination). Can be synced, inline, or fetched from a URL." + "$ref": "/schemas/core/catalog.json", + "description": "A typed data feed — structural (offering, product, inventory, store, promotion) or vertical (hotel, flight, job, vehicle, real_estate, education, destination). Can be synced, inline, or fetched from a URL." }, "wholesale-feed-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/wholesale-feed-event.json", + "$ref": "/schemas/core/wholesale-feed-event.json", "description": "A wholesale product feed or wholesale signals feed event carried by wholesale feed webhooks" }, "offering": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/offering.json", + "$ref": "/schemas/core/offering.json", "description": "A promotable offering from a brand with structured asset groups and optional conversational SI experiences" }, "offering-asset-group": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/offering-asset-group.json", + "$ref": "/schemas/core/offering-asset-group.json", "description": "A structured group of creative assets within an offering, identified by group ID and asset type" }, "postal-area": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/postal-area.json", + "$ref": "/schemas/core/postal-area.json", "description": "Reusable postal area value for targeting, product filtering, and catalog scope" }, "postal-country-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/postal-country-system.json", + "$ref": "/schemas/core/postal-country-system.json", "description": "Valid country and local postal system pairings" }, "postal-area-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/postal-area-support.json", + "$ref": "/schemas/core/postal-area-support.json", "description": "Reusable postal area support map for capabilities and reporting" }, "geo-place-area": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-area.json", + "$ref": "/schemas/core/geo-place-area.json", "description": "Catalog-backed named place target using stable identifiers in a declared system" }, "geo-place-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-requirement.json", + "$ref": "/schemas/core/geo-place-requirement.json", "description": "Collision-safe identifier systems, countries, place types, and catalog versions required for later package selection" }, "geo-place-support": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-support.json", + "$ref": "/schemas/core/geo-place-support.json", "description": "Countries and place types supported for one place identifier system" }, "geo-place-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-system.json", + "$ref": "/schemas/core/geo-place-system.json", "description": "Registered geographic place identifier namespaces with HTTPS URI extensions" }, "geo-place-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-type.json", + "$ref": "/schemas/core/geo-place-type.json", "description": "Registered geographic place classifications with HTTPS URI extensions" }, "geo-place-resolver": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-resolver.json", + "$ref": "/schemas/core/geo-place-resolver.json", "description": "Machine-readable endpoint declaration for resolving place names to seller-accepted IDs" }, "get-geo-place-resolution-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/get-geo-place-resolution-request.json", + "$ref": "/schemas/core/get-geo-place-resolution-request.json", "description": "Standard query parameters for geographic place resolution" }, "get-geo-place-resolution-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/get-geo-place-resolution-response.json", + "$ref": "/schemas/core/get-geo-place-resolution-response.json", "description": "Paginated geographic place resolver results" }, "geo-place-catalog-entry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-catalog-entry.json", + "$ref": "/schemas/core/geo-place-catalog-entry.json", "description": "One place identifier with lifecycle and replacement metadata" }, "geo-place-catalog-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-catalog-capability.json", + "$ref": "/schemas/core/geo-place-catalog-capability.json", "description": "Supported versions and resolver for one place identifier system" }, "asset-group-vocabulary": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/asset-group-vocabulary.json", + "$ref": "/schemas/core/asset-group-vocabulary.json", "description": "Canonical registry of asset_group_id values with descriptions and v1 alias mapping (e.g., landing_page_url replaces 6 v1 alias names)" }, "product-format-declaration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-format-declaration.json", + "$ref": "/schemas/core/product-format-declaration.json", "description": "v2 inline format declaration on products. Keyed by canonical format name; product narrows exactly one canonical with platform-specific parameters." }, "tracker-execution-contract": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/tracker-execution-contract.json", + "$ref": "/schemas/core/tracker-execution-contract.json", "description": "Seller production commitment for accepted first-class manifest tracker execution" }, "tracker-execution-selector": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/tracker-execution-selector.json", + "$ref": "/schemas/core/tracker-execution-selector.json", "description": "Exact pixel, VAST, or DAAST tracker selector in a production execution contract" }, "vast-tracker-constraints": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vast-tracker-constraints.json", + "$ref": "/schemas/core/vast-tracker-constraints.json", "description": "Shared version-aware VAST tracker event and target constraints" }, "daast-tracker-constraints": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/daast-tracker-constraints.json", + "$ref": "/schemas/core/daast-tracker-constraints.json", "description": "Shared DAAST tracker event and target constraints" }, "downstream-connection-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/downstream-connection-requirement.json", + "$ref": "/schemas/core/downstream-connection-requirement.json", "description": "Seller/platform-side connection or grant required by a product, format, or request, distinct from the AdCP caller credential." }, "canonical-projection-slot-override": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/canonical-projection-slot-override.json", + "$ref": "/schemas/core/canonical-projection-slot-override.json", "description": "Slot override used when projecting a legacy named format to a canonical format declaration" }, "platform-extension-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/platform-extension-ref.json", + "$ref": "/schemas/core/platform-extension-ref.json", "description": "Reference to a platform extension definition (URI + content digest)." }, "reference-renderer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/reference-renderer.json", + "$ref": "/schemas/core/reference-renderer.json", "description": "Pinned npm package export for a non-authoritative community reference presentation." }, "store-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/store-item.json", + "$ref": "/schemas/core/store-item.json", "description": "A physical store or location with coordinates, address, and catchment areas for proximity targeting" }, "catchment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/catchment.json", + "$ref": "/schemas/core/catchment.json", "description": "A catchment area definition using travel time (isochrone), simple radius, or pre-computed GeoJSON geometry" }, "price": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/price.json", + "$ref": "/schemas/core/price.json", "description": "A monetary amount with currency and optional billing period for catalog item pricing" }, "hotel-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/hotel-item.json", + "$ref": "/schemas/core/hotel-item.json", "description": "A hotel or lodging property for hotel-type catalogs" }, "flight-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/flight-item.json", + "$ref": "/schemas/core/flight-item.json", "description": "A flight route for flight-type catalogs" }, "job-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/job-item.json", + "$ref": "/schemas/core/job-item.json", "description": "A job posting for job-type catalogs" }, "vehicle-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vehicle-item.json", + "$ref": "/schemas/core/vehicle-item.json", "description": "A vehicle listing for vehicle-type catalogs" }, "real-estate-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/real-estate-item.json", + "$ref": "/schemas/core/real-estate-item.json", "description": "A property listing for real-estate-type catalogs" }, "education-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/education-item.json", + "$ref": "/schemas/core/education-item.json", "description": "An educational program or course for education-type catalogs" }, "destination-item": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/destination-item.json", + "$ref": "/schemas/core/destination-item.json", "description": "A travel destination for destination-type catalogs" }, "start-timing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/start-timing.json", + "$ref": "/schemas/core/start-timing.json", "description": "Campaign start timing: 'asap' or ISO 8601 date-time" }, "pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/pricing-option.json", + "$ref": "/schemas/core/pricing-option.json", "description": "A pricing model option offered by a publisher for a product" }, "protocol-envelope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/protocol-envelope.json", + "$ref": "/schemas/core/protocol-envelope.json", "description": "Standard envelope structure added by protocol layer (MCP, A2A, REST) that wraps task response payloads with protocol-level fields like status, context_id, task_id, and message" }, "agent-signing-key": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/agent-signing-key.json", + "$ref": "/schemas/core/agent-signing-key.json", "description": "Publisher-attested public key material for an authorized agent" }, "response-payload-jws-envelope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/response-payload-jws-envelope.json", + "$ref": "/schemas/core/response-payload-jws-envelope.json", "description": "Decoded-payload JWS envelope used by the closed designated-task response-signing profile" }, "placement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement.json", + "$ref": "/schemas/core/placement.json", "description": "Represents a specific ad placement within a product's inventory" }, "placement-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement-ref.json", + "$ref": "/schemas/core/placement-ref.json", "description": "Reference to a publisher-scoped placement" }, "format-option-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/format-option-ref.json", + "$ref": "/schemas/core/format-option-ref.json", "description": "Reference to a publisher-scoped format option" }, "placement-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement-definition.json", + "$ref": "/schemas/core/placement-definition.json", "description": "Canonical placement definition published in a publisher's adagents.json" }, "presentation-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/presentation-ref.json", + "$ref": "/schemas/core/presentation-ref.json", "description": "Immutable publisher-namespaced reference to placement presentation metadata." }, "placement-presentation": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/placement-presentation.json", + "$ref": "/schemas/core/placement-presentation.json", "description": "Declarative, non-executable placement chrome and creative-slot composition contract." }, "preview-provider": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/preview-provider.json", + "$ref": "/schemas/core/preview-provider.json", "description": "Publisher-scoped delegation to an AdCP creative preview provider." }, "preview-renderer-metadata": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/preview-renderer-metadata.json", + "$ref": "/schemas/core/preview-renderer-metadata.json", "description": "Audit identity and safety metadata for a preview renderer implementation." }, "mcp-webhook-payload": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/mcp-webhook-payload.json", + "$ref": "/schemas/core/mcp-webhook-payload.json", "description": "MCP-specific webhook payload structure for HTTP-based push notifications. Protocol-level fields at top-level (task_id, status, etc.) and AdCP data layer nested under 'result'. NOT used in A2A (uses native statusUpdate)." }, "agent-notification-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/agent-notification-config.json", + "$ref": "/schemas/core/agent-notification-config.json", "description": "Agent-level webhook subscriber configuration for notifications such as capabilities.changed" }, + "agent-notification-config-state": { + "$ref": "/schemas/core/agent-notification-config-state.json", + "description": "Credential-free response readback for an agent-level webhook subscriber" + }, + "agent-configuration-state": { + "$ref": "/schemas/core/agent-configuration-state.json", + "description": "Credential-free caller-scoped connection configuration returned by sync_agent_configuration" + }, + "agent-reporting-destination": { + "$ref": "/schemas/core/agent-reporting-destination.json", + "description": "Reusable caller-scoped reporting destination configuration" + }, + "agent-reporting-destination-state": { + "$ref": "/schemas/core/agent-reporting-destination-state.json", + "description": "Seller-issued destination reference and setup state for a reusable reporting destination" + }, + "delivery-provider": { + "$ref": "/schemas/core/delivery-provider.json", + "description": "Non-secret provider namespace for an external delivery service" + }, + "delivery-recipient": { + "$ref": "/schemas/core/delivery-recipient.json", + "description": "Provider-interpreted recipient identity for a seller-hosted dataset share" + }, + "reporting-verification-profile-set": { + "$ref": "/schemas/core/reporting-verification-profile-set.json", + "description": "Allowed native, manifest, or canonical verification profiles for reporting delivery" + }, "agent-webhook-challenge": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/agent-webhook-challenge.json", + "$ref": "/schemas/core/agent-webhook-challenge.json", "description": "Proof-of-control challenge payload for agent-level notification endpoint activation" }, "capabilities-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/capabilities-changed-webhook.json", + "$ref": "/schemas/core/capabilities-changed-webhook.json", "description": "Agent-level webhook payload that invalidates cached get_adcp_capabilities responses" }, "account-status-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-status-changed-webhook.json", + "$ref": "/schemas/core/account-status-changed-webhook.json", "description": "Account-level webhook payload that invalidates a list_accounts account status snapshot" }, "account-change": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-change.json", + "$ref": "/schemas/core/account-change.json", "description": "Immutable metadata for one material change to authoritative account-scoped state" }, "account-change-recorded-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-change-recorded-webhook.json", + "$ref": "/schemas/core/account-change-recorded-webhook.json", "description": "Account-level invalidation indicating that a durable account change is available" }, "indicator": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/indicator.json", + "$ref": "/schemas/core/indicator.json", "description": "Compact durable seller interpretation attached to an authoritative resource snapshot" }, "creative-approval-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-approval-scope.json", + "$ref": "/schemas/core/creative-approval-scope.json", "description": "Publisher- or placement-scoped creative approval outcome within an assignment" }, "indicator-bearing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/indicator-bearing.json", + "$ref": "/schemas/core/indicator-bearing.json", "description": "Reusable indicator snapshot fields, exact evaluated-type coverage, freshness, and optional scope coverage" }, "indicator-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/indicator-scope.json", + "$ref": "/schemas/core/indicator-scope.json", "description": "Publisher and placement scope for an indicator assertion or evaluation" }, "indicators-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/indicators-changed-webhook.json", + "$ref": "/schemas/core/indicators-changed-webhook.json", "description": "Account-level invalidation payload for a semantic indicator snapshot change" }, "warning": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/warning.json", + "$ref": "/schemas/core/warning.json", "description": "Structured non-blocking receipt returned only on synchronous mutation success" }, "warning-resource": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/warning-resource.json", + "$ref": "/schemas/core/warning-resource.json", "description": "Typed identity of the resource affected by an operation warning" }, "destination": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/destination.json", + "$ref": "/schemas/core/destination.json", "description": "A destination platform where signals can be activated (DSP, sales agent, etc.)" }, "deployment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/deployment.json", + "$ref": "/schemas/core/deployment.json", "description": "A signal deployment to a specific destination platform with activation status and key" }, "publisher-property-selector": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/publisher-property-selector.json", + "$ref": "/schemas/core/publisher-property-selector.json", "description": "Selects properties from a publisher's adagents.json - supports three patterns: all properties, specific IDs, or by tags" }, "product-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-filters.json", + "$ref": "/schemas/core/product-filters.json", "description": "Structured filters for product discovery" }, "budget-range": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/budget-range.json", + "$ref": "/schemas/core/budget-range.json", "description": "Shared currency-denominated inclusive budget bounds" }, "product-change-map": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-change-map.json", + "$ref": "/schemas/core/product-change-map.json", "description": "Contradiction-proof product membership actions keyed by product ID" }, "product-offer-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-offer-filters.json", + "$ref": "/schemas/core/product-offer-filters.json", "description": "Offer-only product filters used by the compact product-discovery tools" }, "product-audience-evidence-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-audience-evidence-requirements.json", + "$ref": "/schemas/core/product-audience-evidence-requirements.json", "description": "Reference-only audience evidence policy used by compact product discovery" }, "creative-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-filters.json", + "$ref": "/schemas/core/creative-filters.json", "description": "Filter criteria for querying creative assets from the centralized library" }, "signal-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-filters.json", + "$ref": "/schemas/core/signal-filters.json", "description": "Filters to refine signal discovery results" }, "signal-pricing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-pricing.json", - "description": "Vendor pricing model \u2014 discriminated union of cpm (fixed CPM), percent_of_media (percentage of spend, with optional CPM cap), flat_fee (fixed charge per reporting period), or per_unit (fixed price per unit of work)" + "$ref": "/schemas/core/signal-pricing.json", + "description": "Vendor pricing model — discriminated union of cpm (fixed CPM), percent_of_media (percentage of spend, with optional CPM cap), flat_fee (fixed charge per reporting period), or per_unit (fixed price per unit of work)" }, "signal-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-pricing-option.json", + "$ref": "/schemas/core/signal-pricing-option.json", "deprecated": true, - "description": "Deprecated \u2014 alias for vendor-pricing-option.json. Retained for backward compatibility. Prefer vendor-pricing-option.json for new implementations." + "description": "Deprecated — alias for vendor-pricing-option.json. Retained for backward compatibility. Prefer vendor-pricing-option.json for new implementations." }, "vendor-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vendor-pricing-option.json", + "$ref": "/schemas/core/vendor-pricing-option.json", "description": "A pricing option offered by a vendor agent (signals, creative, governance), combining a pricing_option_id with a pricing model. Returned in get_signals and list_creatives, referenced in build_creative responses and report_usage." }, "creative-consumption": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-consumption.json", + "$ref": "/schemas/core/creative-consumption.json", "description": "Structured consumption details returned by build_creative when a paid creative agent computes cost. Well-known fields for tokens, images, renders, and processing time." }, "transformer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/transformer.json", + "$ref": "/schemas/core/transformer.json", "description": "An agent-offered, account-scoped, selectable unit of creative build capability (the creative analog of a media-buy product). Maps input formats to output formats and exposes typed config params. Discovered via list_transformers, selected by transformer_id in build_creative." }, "transformer-param": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/transformer-param.json", + "$ref": "/schemas/core/transformer-param.json", "description": "Descriptor for one configuration knob a transformer exposes (field, type, value_source inline|range|enumerable, allowed values/range/account-scoped options, default)." }, "evaluator-spec": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/evaluator-spec.json", - "description": "Advisory buyer-attached evaluator input for build_creative \u2014 the rank-side of the get_creative_features feature oracle, driving a gate-then-rank pipeline. Declares the SOURCE of feature evaluation via one of three forms (inline pass/fail exemplars calibrating a single predicted_performance feature, an account-scoped evaluator_id, or an external get_creative_features-capable agent_url), an optional hard feature_requirement[] GATE (drop fails \u2014 internal best_of_n pruning), an explicit rank_by ordering ({feature_id, direction}), an allowlisted feature_agent pointer (accepted_verifiers; off-list \u2192 EVALUATOR_AGENT_NOT_ACCEPTED), plus an optional soft eval_budget. Informs best_of_n recommended/rank; never blocks an already-produced billable leaf." + "$ref": "/schemas/core/evaluator-spec.json", + "description": "Advisory buyer-attached evaluator input for build_creative — the rank-side of the get_creative_features feature oracle, driving a gate-then-rank pipeline. Declares the SOURCE of feature evaluation via one of three forms (inline pass/fail exemplars calibrating a single predicted_performance feature, an account-scoped evaluator_id, or an external get_creative_features-capable agent_url), an optional hard feature_requirement[] GATE (drop fails — internal best_of_n pruning), an explicit rank_by ordering ({feature_id, direction}), an allowlisted feature_agent pointer (accepted_verifiers; off-list → EVALUATOR_AGENT_NOT_ACCEPTED), plus an optional soft eval_budget. Informs best_of_n recommended/rank; never blocks an already-produced billable leaf." }, "property-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/property-id.json", + "$ref": "/schemas/core/property-id.json", "description": "Identifier for a publisher property - lowercase alphanumeric with underscores only" }, "property-tag": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/property-tag.json", + "$ref": "/schemas/core/property-tag.json", "description": "Tag for categorizing publisher properties - lowercase alphanumeric with underscores only" }, "property-list-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/property-list-ref.json", + "$ref": "/schemas/core/property-list-ref.json", "description": "Reference to an externally managed property list for passing large property sets" }, "collection-list-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/collection-list-ref.json", + "$ref": "/schemas/core/collection-list-ref.json", "description": "Reference to an externally managed collection list for passing large collection exclusion/inclusion sets" }, "identifier": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/identifier.json", + "$ref": "/schemas/core/identifier.json", "description": "A property identifier with type and value" }, "media-buy-features": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/media-buy-features.json", + "$ref": "/schemas/core/media-buy-features.json", "description": "Optional media-buy protocol features for capability declarations and product filters" }, "brand-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-id.json", + "$ref": "/schemas/core/brand-id.json", "description": "Identifier for a brand within a house portfolio - lowercase alphanumeric with underscores only" }, "brand-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-ref.json", + "$ref": "/schemas/core/brand-ref.json", "description": "Reference to a brand via house domain + brand_id (like publisher + property_id)" }, "brand-key": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/brand-key.json", + "$ref": "/schemas/core/brand-key.json", "description": "Identity-only brand key for resolving a canonical brand manifest" }, "catalog-selection": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/catalog-selection.json", + "$ref": "/schemas/core/catalog-selection.json", "description": "Catalog reference and item selectors without ingestion configuration" }, "seller-agent-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/seller-agent-ref.json", + "$ref": "/schemas/core/seller-agent-ref.json", "description": "Reference to a seller agent by its adagents.json-declared URL. Used on TMP AvailablePackage and echoed on Offer." }, "signal-id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-id.json", + "$ref": "/schemas/core/signal-id.json", "description": "Universal signal identifier - discriminated union by source: 'catalog' (data_provider_domain + id, verifiable) or 'agent' (agent_url + id for a signal-source-native signal)" }, "signal-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-ref.json", + "$ref": "/schemas/core/signal-ref.json", "description": "Named signal reference for discovery, activation, and media-buy product targeting: scope 'product' for product-local signal options, scope 'data_provider' for published adagents.json signals[], or scope 'signal_source' for source-native signals" }, "signal-listing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-listing.json", + "$ref": "/schemas/core/signal-listing.json", "description": "Shared signal_ref plus optional definition metadata used by get_signals and media products" }, "product-signal-targeting-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/product-signal-targeting-option.json", + "$ref": "/schemas/core/product-signal-targeting-option.json", "description": "Product-scoped signal option available for package-level signal_targeting_groups" }, "signal-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-definition.json", + "$ref": "/schemas/core/signal-definition.json", "description": "Signal definition published in a data provider's adagents.json signals[]" }, "signal-definition-enrichment": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-definition-enrichment.json", + "$ref": "/schemas/core/signal-definition-enrichment.json", "description": "Optional signal-definition enrichment fields projected inline on signal listings" }, "signal-modeling-disclosure": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-modeling-disclosure.json", + "$ref": "/schemas/core/signal-modeling-disclosure.json", "description": "Signal-specific modeling and AI-use disclosure metadata for data signals" }, "data-provider-signal-selector": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/data-provider-signal-selector.json", + "$ref": "/schemas/core/data-provider-signal-selector.json", "description": "Selects signals from a data provider's adagents.json - supports three patterns: all signals, specific IDs, or by tags" }, "daypart-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/daypart-target.json", + "$ref": "/schemas/core/daypart-target.json", "description": "A time window for daypart targeting with days of week and hour range" }, "signal-targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-targeting.json", + "$ref": "/schemas/core/signal-targeting.json", "description": "Signals Protocol targeting constraint using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "signal-targeting-rules": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-targeting-rules.json", + "$ref": "/schemas/core/signal-targeting-rules.json", "description": "Product-scoped composition rules for package-level signal_targeting_groups" }, "signal-selection-group-rule": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-selection-group-rule.json", + "$ref": "/schemas/core/signal-selection-group-rule.json", "description": "Override for one product signal selection group" }, "signal-targeting-expression": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/signal-targeting-expression.json", + "$ref": "/schemas/core/signal-targeting-expression.json", "description": "Media-buy product targeting expression using signal_ref - discriminated union by value_type (binary, categorical, numeric)" }, "package-signal-targeting": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package-signal-targeting.json", + "$ref": "/schemas/core/package-signal-targeting.json", "description": "One selected signal inside a package signal targeting group" }, "package-signal-targeting-group": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package-signal-targeting-group.json", + "$ref": "/schemas/core/package-signal-targeting-group.json", "description": "One include or exclude child group inside package-level signal_targeting_groups" }, "package-signal-targeting-groups": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/package-signal-targeting-groups.json", + "$ref": "/schemas/core/package-signal-targeting-groups.json", "description": "Portable package-level signal composition: top-level all with child any/none groups" }, "event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/event.json", + "$ref": "/schemas/core/event.json", "description": "A marketing event (conversion, engagement, or custom) for attribution" }, "user-match": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/user-match.json", + "$ref": "/schemas/core/user-match.json", "description": "User identifiers for attribution matching (UIDs, hashed identifiers, click IDs)" }, "event-custom-data": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/event-custom-data.json", + "$ref": "/schemas/core/event-custom-data.json", "description": "Event-specific data for attribution and reporting" }, "event-surface": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/event-surface.json", + "$ref": "/schemas/core/event-surface.json", "description": "Structured context for the surface where an event source or logged event originated" }, "attribution-window": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attribution-window.json", + "$ref": "/schemas/core/attribution-window.json", "description": "Attribution methodology and lookback windows for conversion measurement" }, "optimization-goal": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/optimization-goal.json", + "$ref": "/schemas/core/optimization-goal.json", "description": "Conversion optimization goal for a package - event source, event type, target ROAS/CPA, and attribution window" }, "vendor-metric-optimization": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vendor-metric-optimization.json", + "$ref": "/schemas/core/vendor-metric-optimization.json", "description": "Product-level capability declaration for vendor-attested metric optimization (attention, brand lift, emissions, retail-media partner metrics)" }, "vendor-metric-optimization-supported-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vendor-metric-optimization-supported-metric.json", + "$ref": "/schemas/core/vendor-metric-optimization-supported-metric.json", "description": "One vendor metric a product can optimize toward" }, "audience-member": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-member.json", + "$ref": "/schemas/core/audience-member.json", "description": "Hashed identifiers for a CRM audience member (hashed email, phone, or universal IDs)" }, "account-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-ref.json", + "$ref": "/schemas/core/account-ref.json", "description": "Reference to an account by seller-assigned ID or natural key (brand, operator, optional sandbox)" }, "provenance": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/provenance.json", - "description": "AI provenance and disclosure metadata \u2014 declares how content was produced, C2PA references, regulatory disclosure requirements, and third-party verification results" + "$ref": "/schemas/core/provenance.json", + "description": "AI provenance and disclosure metadata — declares how content was produced, C2PA references, regulatory disclosure requirements, and third-party verification results" }, "wholesale-feed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/wholesale-feed-webhook.json", + "$ref": "/schemas/core/wholesale-feed-webhook.json", "description": "Webhook payload carrying a wholesale feed change event" }, "webhook-challenge": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/webhook-challenge.json", + "$ref": "/schemas/core/webhook-challenge.json", "description": "Proof-of-control challenge payload for account-level notification endpoint activation" }, "webhook-challenge-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/webhook-challenge-response.json", + "$ref": "/schemas/core/webhook-challenge-response.json", "description": "Receiver response body for account-level notification_configs[] endpoint proof-of-control challenges" } }, @@ -1051,63 +1080,63 @@ "description": "Typed requirement schemas for creative assets in format definitions", "schemas": { "asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/asset-requirements.json", + "$ref": "/schemas/core/requirements/asset-requirements.json", "description": "Combined schema that allows any typed asset requirements" }, "html-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/html-asset-requirements.json", + "$ref": "/schemas/core/requirements/html-asset-requirements.json", "description": "Requirements for HTML creative assets - sandbox compatibility, external resources, allowed domains" }, "image-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/image-asset-requirements.json", + "$ref": "/schemas/core/requirements/image-asset-requirements.json", "description": "Requirements for image creative assets - dimensions, formats, file size, animation" }, "video-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/video-asset-requirements.json", + "$ref": "/schemas/core/requirements/video-asset-requirements.json", "description": "Requirements for video creative assets - dimensions, duration, codecs, bitrate" }, "audio-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/audio-asset-requirements.json", + "$ref": "/schemas/core/requirements/audio-asset-requirements.json", "description": "Requirements for audio creative assets - duration, formats, sample rate, channels" }, "javascript-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/javascript-asset-requirements.json", + "$ref": "/schemas/core/requirements/javascript-asset-requirements.json", "description": "Requirements for JavaScript creative assets - module type, external resources" }, "text-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/text-asset-requirements.json", + "$ref": "/schemas/core/requirements/text-asset-requirements.json", "description": "Requirements for text creative assets - character limits, line counts" }, "url-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/url-asset-requirements.json", + "$ref": "/schemas/core/requirements/url-asset-requirements.json", "description": "Requirements for URL assets - protocols, allowed domains, macro support" }, "markdown-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/markdown-asset-requirements.json", + "$ref": "/schemas/core/requirements/markdown-asset-requirements.json", "description": "Requirements for markdown creative assets" }, "css-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/css-asset-requirements.json", + "$ref": "/schemas/core/requirements/css-asset-requirements.json", "description": "Requirements for CSS creative assets" }, "vast-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/vast-asset-requirements.json", + "$ref": "/schemas/core/requirements/vast-asset-requirements.json", "description": "Requirements for VAST creative assets - version requirements" }, "daast-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/daast-asset-requirements.json", + "$ref": "/schemas/core/requirements/daast-asset-requirements.json", "description": "Requirements for DAAST creative assets" }, "catalog-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/catalog-requirements.json", + "$ref": "/schemas/core/requirements/catalog-requirements.json", "description": "Format-level declaration of what catalog feeds a creative requires" }, "offering-asset-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/offering-asset-constraint.json", + "$ref": "/schemas/core/requirements/offering-asset-constraint.json", "description": "Per-group creative requirements that each offering must satisfy within a catalog" }, "webhook-asset-requirements": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/requirements/webhook-asset-requirements.json", + "$ref": "/schemas/core/requirements/webhook-asset-requirements.json", "description": "Requirements for webhook creative assets" } } @@ -1117,440 +1146,440 @@ "description": "Enumerated types and constants", "schemas": { "pricing-model": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/pricing-model.json", + "$ref": "/schemas/enums/pricing-model.json", "description": "Supported pricing models for advertising products" }, "pricing-structure": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/pricing-structure.json", + "$ref": "/schemas/enums/pricing-structure.json", "description": "How a payable media price is determined: fixed, auction, or contingent" }, "delivery-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/delivery-type.json", + "$ref": "/schemas/enums/delivery-type.json", "description": "Type of inventory delivery" }, "proposal-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/proposal-status.json", + "$ref": "/schemas/enums/proposal-status.json", "description": "Lifecycle status of a proposal (draft or committed)" }, "proposal-decline-reason": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/proposal-decline-reason.json", + "$ref": "/schemas/enums/proposal-decline-reason.json", "description": "Machine-readable terminal proposal feedback" }, "proposal-refinement-reason": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/proposal-refinement-reason.json", + "$ref": "/schemas/enums/proposal-refinement-reason.json", "description": "Machine-readable partial or unable proposal-refinement outcome" }, "media-buy-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/media-buy-status.json", + "$ref": "/schemas/enums/media-buy-status.json", "description": "Status of a media buy" }, "canonical-media-buy-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/canonical-media-buy-action.json", + "$ref": "/schemas/enums/canonical-media-buy-action.json", "description": "Fine-grained action vocabulary for compact MediaBuy tools" }, "canonical-media-buy-action-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/canonical-media-buy-action-mode.json", + "$ref": "/schemas/enums/canonical-media-buy-action-mode.json", "description": "Execution mode for routed compact-lifecycle actions" }, "creative-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-status.json", + "$ref": "/schemas/enums/creative-status.json", "description": "Status of a creative asset" }, "creative-approval-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-approval-status.json", + "$ref": "/schemas/enums/creative-approval-status.json", "description": "Approval state of a creative on a specific package" }, "audience-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/audience-status.json", + "$ref": "/schemas/enums/audience-status.json", "description": "Matching status of a synced audience on a seller platform" }, "creative-quality": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-quality.json", + "$ref": "/schemas/enums/creative-quality.json", "description": "Quality tier for creative generation (draft, production)" }, "logo-slot": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/logo-slot.json", + "$ref": "/schemas/enums/logo-slot.json", "description": "Renderer-facing logo slots for selecting brand.json logo variants" }, "pacing": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/pacing.json", + "$ref": "/schemas/enums/pacing.json", "description": "Budget pacing strategy" }, "frequency-cap-scope": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/frequency-cap-scope.json", + "$ref": "/schemas/enums/frequency-cap-scope.json", "description": "Scope for frequency cap application" }, "identifier-types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/identifier-types.json", + "$ref": "/schemas/enums/identifier-types.json", "description": "Valid identifier types for property identification across different media types" }, "publisher-identifier-types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/publisher-identifier-types.json", + "$ref": "/schemas/enums/publisher-identifier-types.json", "description": "Valid identifier types for publisher/legal entity identification (TAG ID, DUNS, LEI, seller_id, GLN)" }, "channels": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/channels.json", + "$ref": "/schemas/enums/channels.json", "description": "Advertising channels (display, video, dooh, ctv, audio, etc.)" }, "video-placement-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/video-placement-type.json", + "$ref": "/schemas/enums/video-placement-type.json", "description": "Declared video placement classifications using IAB Tech Lab/OpenRTB 2.6 video.plcmt definitions" }, "audio-distribution-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/audio-distribution-type.json", + "$ref": "/schemas/enums/audio-distribution-type.json", "description": "Declared audio distribution classifications using IAB Tech Lab/OpenRTB 2.6 audio.feed definitions" }, "sponsored-placement-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/sponsored-placement-type.json", + "$ref": "/schemas/enums/sponsored-placement-type.json", "description": "Declared sponsored-placement classifications for catalog-driven retail-media inventory" }, "social-placement-surface": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/social-placement-surface.json", + "$ref": "/schemas/enums/social-placement-surface.json", "description": "Declared social-placement surface classifications for social inventory" }, "task-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/task-status.json", + "$ref": "/schemas/enums/task-status.json", "description": "Standardized task status values based on A2A TaskState enum" }, "task-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/task-type.json", + "$ref": "/schemas/enums/task-type.json", "description": "Valid AdCP task types across all domains" }, "asset-content-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/asset-content-type.json", + "$ref": "/schemas/enums/asset-content-type.json", "description": "Types of content that can be used as creative assets (image, video, html, etc.)" }, "disclosure-position": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/disclosure-position.json", + "$ref": "/schemas/enums/disclosure-position.json", "description": "Where a required disclosure should appear within a creative" }, "disclosure-persistence": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/disclosure-persistence.json", + "$ref": "/schemas/enums/disclosure-persistence.json", "description": "How long a disclosure must persist during content playback or display" }, "vast-version": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/vast-version.json", + "$ref": "/schemas/enums/vast-version.json", "description": "Supported VAST specification versions (2.0, 3.0, 4.0, 4.1, 4.2, 4.3)" }, "representation-selection-strategy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/representation-selection-strategy.json", + "$ref": "/schemas/enums/representation-selection-strategy.json", "description": "Deterministic strategy for selecting one compatible creative representation" }, "vast-tracking-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/vast-tracking-event.json", + "$ref": "/schemas/enums/vast-tracking-event.json", "description": "Standard VAST tracking events for video playback and interaction" }, "pixel-tracking-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/pixel-tracking-event.json", + "$ref": "/schemas/enums/pixel-tracking-event.json", "description": "Canonical first-class pixel tracker event vocabulary" }, "tracker-execution-actor": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/tracker-execution-actor.json", + "$ref": "/schemas/enums/tracker-execution-actor.json", "description": "Actor responsible for initiating an accepted tracker" }, "tracker-firing-path": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/tracker-firing-path.json", + "$ref": "/schemas/enums/tracker-firing-path.json", "description": "Permitted client or server tracker initiation path" }, "property-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/property-type.json", + "$ref": "/schemas/enums/property-type.json", "description": "Types of addressable advertising properties with verifiable ownership" }, "dimension-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/dimension-unit.json", + "$ref": "/schemas/enums/dimension-unit.json", "description": "Units of measurement for creative format dimensions (px, dp, inches, cm)" }, "co-branding-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/co-branding-requirement.json", + "$ref": "/schemas/enums/co-branding-requirement.json", "description": "Co-branding policy for creatives (required, optional, none)" }, "landing-page-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/landing-page-requirement.json", + "$ref": "/schemas/enums/landing-page-requirement.json", "description": "Landing page policy for creative destinations (any, retailer_site_only, must_include_retailer)" }, "daast-version": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/daast-version.json", + "$ref": "/schemas/enums/daast-version.json", "description": "Supported DAAST specification versions (1.0, 1.1)" }, "daast-tracking-event": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/daast-tracking-event.json", + "$ref": "/schemas/enums/daast-tracking-event.json", "description": "Standard DAAST tracking events for audio playback and interaction" }, "day-of-week": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/day-of-week.json", + "$ref": "/schemas/enums/day-of-week.json", "description": "Days of the week for daypart targeting" }, "signal-catalog-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/signal-catalog-type.json", + "$ref": "/schemas/enums/signal-catalog-type.json", "description": "Commercial/provenance types for signals (marketplace, custom, owned)" }, "metric-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/metric-type.json", + "$ref": "/schemas/enums/metric-type.json", "description": "Performance metric types for feedback and optimization" }, "feedback-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/feedback-source.json", + "$ref": "/schemas/enums/feedback-source.json", "description": "Source of performance feedback data" }, "forecast-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/forecast-method.json", + "$ref": "/schemas/enums/forecast-method.json", "description": "Method used to produce a delivery forecast (estimate, modeled, guaranteed)" }, "forecastable-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/forecastable-metric.json", + "$ref": "/schemas/enums/forecastable-metric.json", "description": "Standard metric names for delivery forecasts (audience_size, reach, impressions, clicks, spend, etc.)" }, "forecast-range-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/forecast-range-unit.json", + "$ref": "/schemas/enums/forecast-range-unit.json", "description": "How to interpret forecast points: spend curve, reach/frequency curve, temporal (weekly/daily), or outcome targets (clicks/conversions)" }, "availability-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/availability-status.json", + "$ref": "/schemas/enums/availability-status.json", "description": "Bookability of the inventory a forecast row describes (available, unavailable)" }, "demographic-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/demographic-system.json", + "$ref": "/schemas/enums/demographic-system.json", "description": "Audience measurement systems for demographic notation (nielsen, barb, agf, oztam, mediametrie, custom)" }, "reach-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/reach-unit.json", + "$ref": "/schemas/enums/reach-unit.json", "description": "Unit of measurement for reach metrics (individuals, households, devices, accounts, cookies, custom)" }, "creative-agent-capability": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-agent-capability.json", + "$ref": "/schemas/enums/creative-agent-capability.json", "description": "Capabilities supported by creative agents (validation, assembly, generation, preview, delivery)" }, "adcp-protocol": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/adcp-protocol.json", + "$ref": "/schemas/enums/adcp-protocol.json", "description": "AdCP protocol domains (media-buy, signals, governance, creative, brand)" }, "brand-agent-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/brand-agent-type.json", + "$ref": "/schemas/enums/brand-agent-type.json", "description": "Agent types declarable in brand.json (brand, rights, measurement, governance, creative, sales, buying, signals)" }, "right-use": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/right-use.json", + "$ref": "/schemas/enums/right-use.json", "description": "Types of rights usage (likeness, voice, endorsement, sync, etc.)" }, "right-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/right-type.json", + "$ref": "/schemas/enums/right-type.json", "description": "Categories of licensable rights (talent, music, brand_ip, stock_media)" }, "http-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/http-method.json", + "$ref": "/schemas/enums/http-method.json", "description": "HTTP methods for webhook requests (GET, POST)" }, "webhook-response-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/webhook-response-type.json", + "$ref": "/schemas/enums/webhook-response-type.json", "description": "Expected response content types from webhooks" }, "webhook-security-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/webhook-security-method.json", + "$ref": "/schemas/enums/webhook-security-method.json", "description": "Security methods for webhook authentication" }, "javascript-module-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/javascript-module-type.json", + "$ref": "/schemas/enums/javascript-module-type.json", "description": "JavaScript module format types (esm, commonjs, script)" }, "markdown-flavor": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/markdown-flavor.json", + "$ref": "/schemas/enums/markdown-flavor.json", "description": "Markdown specification flavors (commonmark, gfm)" }, "url-asset-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/url-asset-type.json", + "$ref": "/schemas/enums/url-asset-type.json", "description": "Types of URL assets (clickthrough, tracker_pixel, tracker_script)" }, "validation-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/validation-mode.json", + "$ref": "/schemas/enums/validation-mode.json", "description": "Creative validation strictness levels (strict, lenient)" }, "creative-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-action.json", + "$ref": "/schemas/enums/creative-action.json", "description": "Actions taken on creatives during sync (created, updated, unchanged, failed, deleted)" }, "notification-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/notification-type.json", + "$ref": "/schemas/enums/notification-type.json", "description": "Shared notification registry for delivery, impairment, lifecycle, wholesale-feed, and capability-change events" }, "indicator-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/indicator-type.json", + "$ref": "/schemas/enums/indicator-type.json", "description": "Closed AdCP 3.2 vocabulary for durable media-buy and creative-assignment indicators" }, "warning-code": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/warning-code.json", + "$ref": "/schemas/enums/warning-code.json", "description": "Closed AdCP 3.2 vocabulary for synchronous operation warnings" }, "reporting-frequency": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/reporting-frequency.json", + "$ref": "/schemas/enums/reporting-frequency.json", "description": "Frequencies for delivery reports (hourly, daily, monthly)" }, "available-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/available-metric.json", + "$ref": "/schemas/enums/available-metric.json", "description": "Standard delivery and performance metrics for reporting" }, "preview-output-format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/preview-output-format.json", + "$ref": "/schemas/enums/preview-output-format.json", "description": "Output formats for creative previews (url, html)" }, "sort-direction": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/sort-direction.json", + "$ref": "/schemas/enums/sort-direction.json", "description": "Sort direction for list queries (asc, desc)" }, "sort-metric": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/sort-metric.json", + "$ref": "/schemas/enums/sort-metric.json", "description": "Numeric delivery metrics available for sorting breakdown rows" }, "history-entry-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/history-entry-type.json", + "$ref": "/schemas/enums/history-entry-type.json", "description": "Type of task history entry (request, response)" }, "feed-format": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/feed-format.json", + "$ref": "/schemas/enums/feed-format.json", "description": "Product catalog feed formats" }, "update-frequency": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/update-frequency.json", + "$ref": "/schemas/enums/update-frequency.json", "description": "Frequency of product catalog updates" }, "content-id-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/content-id-type.json", + "$ref": "/schemas/enums/content-id-type.json", "description": "Identifier type for matching conversion event content_ids to catalog items (sku, gtin, or vertical-specific IDs)" }, "auth-scheme": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/auth-scheme.json", + "$ref": "/schemas/enums/auth-scheme.json", "description": "Authentication schemes for push notifications" }, "creative-sort-field": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-sort-field.json", + "$ref": "/schemas/enums/creative-sort-field.json", "description": "Fields available for sorting creative listings" }, "geo-level": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/geo-level.json", + "$ref": "/schemas/enums/geo-level.json", "description": "Geographic targeting granularity levels (country, region, metro, postal_area)" }, "metro-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/metro-system.json", + "$ref": "/schemas/enums/metro-system.json", "description": "Metro area classification systems for geographic targeting (nielsen_dma, uk_itl1, uk_itl2, eurostat_nuts2)" }, "postal-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/postal-system.json", + "$ref": "/schemas/enums/postal-system.json", "description": "Country-local postal code systems for geographic targeting (zip, zip_plus_four, outward, plz, postal_code, etc.)" }, "legacy-postal-system": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/legacy-postal-system.json", + "$ref": "/schemas/enums/legacy-postal-system.json", "deprecated": true, "description": "Deprecated country-fused postal code systems for compatibility (us_zip, gb_outward, ca_fsa, etc.)" }, "age-verification-method": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/age-verification-method.json", + "$ref": "/schemas/enums/age-verification-method.json", "description": "Methods for verifying user age for compliance (facial_age_estimation, id_document, digital_id, credit_card, world_id)" }, "age-determination-basis": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/age-determination-basis.json", + "$ref": "/schemas/enums/age-determination-basis.json", "description": "User-level age determination bases permitted for targeting execution (verified, declared, or inferred)" }, "device-platform": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/device-platform.json", + "$ref": "/schemas/enums/device-platform.json", "description": "Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV" }, "device-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/device-type.json", + "$ref": "/schemas/enums/device-type.json", "description": "Device form factor categories for targeting and reporting (desktop, mobile, tablet, ctv, dooh, unknown)" }, "signal-value-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/signal-value-type.json", + "$ref": "/schemas/enums/signal-value-type.json", "description": "Signal value types for targeting (binary, categorical, numeric)" }, "signal-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/signal-source.json", + "$ref": "/schemas/enums/signal-source.json", "description": "Source type for signal identifiers: 'catalog' (verifiable via data provider) or 'agent' (signal source identified by agent_url)" }, "universal-macro": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/universal-macro.json", + "$ref": "/schemas/enums/universal-macro.json", "description": "Standardized macro placeholders for dynamic value substitution in creative tracking URLs" }, "event-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/event-type.json", + "$ref": "/schemas/enums/event-type.json", "description": "Standard marketing event types for conversion tracking (purchase, lead, add_to_cart, etc.)" }, "uid-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/uid-type.json", + "$ref": "/schemas/enums/uid-type.json", "description": "Universal ID types for user matching (rampid, id5, uid2, maid, etc.)" }, "attestation-claim": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/attestation-claim.json", + "$ref": "/schemas/enums/attestation-claim.json", "description": "Claims a verified identity attestation can establish (unique_human, age_over_13/16/18/21)" }, "action-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/action-source.json", + "$ref": "/schemas/enums/action-source.json", "description": "Where the conversion event originated (website, app, offline, etc.)" }, "attribution-model": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/attribution-model.json", + "$ref": "/schemas/enums/attribution-model.json", "description": "Attribution model used for conversion measurement" }, "audience-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/audience-source.json", + "$ref": "/schemas/enums/audience-source.json", "description": "Origin of an audience segment in delivery reporting (synced, platform, third_party, lookalike, retargeting, unknown)" }, "wcag-level": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/wcag-level.json", + "$ref": "/schemas/enums/wcag-level.json", "description": "Web Content Accessibility Guidelines conformance level (A, AA, AAA)" }, "catalog-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/catalog-type.json", + "$ref": "/schemas/enums/catalog-type.json", "description": "Catalog feed types: offering, product, inventory, store, promotion, hotel, flight, job, vehicle, real_estate, education, destination" }, "catalog-action": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/catalog-action.json", + "$ref": "/schemas/enums/catalog-action.json", "description": "Actions taken on catalogs during sync (created, updated, unchanged, failed, deleted)" }, "catalog-item-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/catalog-item-status.json", + "$ref": "/schemas/enums/catalog-item-status.json", "description": "Approval status of individual catalog items (approved, pending, rejected, warning)" }, "transport-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/transport-mode.json", + "$ref": "/schemas/enums/transport-mode.json", "description": "Transportation modes for isochrone-based catchment area calculations (walking, cycling, driving, public_transport)" }, "distance-unit": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/distance-unit.json", + "$ref": "/schemas/enums/distance-unit.json", "description": "Units of distance measurement for radius-based catchment areas (km, mi, m)" }, "error-code": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/error-code.json", + "$ref": "/schemas/enums/error-code.json", "description": "Standard error code vocabulary for agent recovery classification" }, "consent-basis": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/consent-basis.json", + "$ref": "/schemas/enums/consent-basis.json", "description": "GDPR Article 6(1) lawful basis for processing personal data" }, "digital-source-type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/digital-source-type.json", + "$ref": "/schemas/enums/digital-source-type.json", "description": "IPTC-aligned classification of AI involvement in content creation (digital_capture, trained_algorithmic_media, composite_with_trained_algorithmic_media, etc.)" }, "governance-phase": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/governance-phase.json", + "$ref": "/schemas/enums/governance-phase.json", "description": "Media buy lifecycle phase for governance checks (purchase, modification, delivery)" }, "governance-domain": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/governance-domain.json", + "$ref": "/schemas/enums/governance-domain.json", "description": "Governance sub-domains a registry policy applies to (campaign, property, creative, content_standards)" }, "genre-taxonomy": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/genre-taxonomy.json", + "$ref": "/schemas/enums/genre-taxonomy.json", "description": "Taxonomy systems for genre classification (iab_content_3.0, gracenote, eidr, etc.)" }, "governance-mode": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/governance-mode.json", + "$ref": "/schemas/enums/governance-mode.json", "description": "Operating mode for a governance agent (audit, advisory, enforce)" }, "delegation-authority": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/delegation-authority.json", + "$ref": "/schemas/enums/delegation-authority.json", "description": "Authority level for a delegated agent on a campaign plan (full, execute_only, propose_only)" }, "exclusivity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/exclusivity.json", + "$ref": "/schemas/enums/exclusivity.json", "description": "Whether a product offers exclusive access to its inventory (none, category, exclusive)" } } @@ -1559,43 +1588,43 @@ "description": "Individual pricing model schemas discriminated by pricing_model. Unit-based models may be fixed or auction-based. Contingent models such as revenue_share calculate payable spend from a measured business outcome after delivery.", "schemas": { "cpm-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpm-option.json", + "$ref": "/schemas/pricing-options/cpm-option.json", "description": "Cost Per Mille (CPM) pricing - supports fixed rate and auction modes" }, "vcpm-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/vcpm-option.json", + "$ref": "/schemas/pricing-options/vcpm-option.json", "description": "Viewable Cost Per Mille (vCPM) pricing - supports fixed rate and auction modes" }, "cpc-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpc-option.json", + "$ref": "/schemas/pricing-options/cpc-option.json", "description": "Cost Per Click (CPC) pricing - supports fixed rate and auction modes" }, "cpcv-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpcv-option.json", + "$ref": "/schemas/pricing-options/cpcv-option.json", "description": "Cost Per Completed View (CPCV) pricing - supports fixed rate and auction modes" }, "cpv-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpv-option.json", + "$ref": "/schemas/pricing-options/cpv-option.json", "description": "Cost Per View (CPV) pricing with threshold - supports fixed rate and auction modes" }, "cpp-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpp-option.json", + "$ref": "/schemas/pricing-options/cpp-option.json", "description": "Cost Per Point (CPP) pricing for TV/audio with demographic measurement - supports fixed rate and auction modes" }, "cpa-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/cpa-option.json", + "$ref": "/schemas/pricing-options/cpa-option.json", "description": "Cost Per Acquisition (CPA) pricing for performance campaigns - fixed price per conversion event" }, "revenue-share-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/revenue-share-option.json", + "$ref": "/schemas/pricing-options/revenue-share-option.json", "description": "Revenue-share pricing - decimal commission rate applied to settled commissionable conversion value" }, "flat-rate-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/flat-rate-option.json", + "$ref": "/schemas/pricing-options/flat-rate-option.json", "description": "Flat rate pricing for DOOH and sponsorships - supports fixed rate and auction modes" }, "time-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/pricing-options/time-option.json", + "$ref": "/schemas/pricing-options/time-option.json", "description": "Time-based pricing - cost per time unit (hour, day, week, month) that scales with campaign duration" } } @@ -1605,61 +1634,61 @@ "tasks": { "list-account-changes": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/list-account-changes-request.json", + "$ref": "/schemas/account/list-account-changes-request.json", "description": "Request parameters for reading the durable account change feed" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/list-account-changes-response.json", + "$ref": "/schemas/account/list-account-changes-response.json", "description": "Ordered durable changes to authoritative account-scoped state" } }, "list-accounts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/list-accounts-request.json", + "$ref": "/schemas/account/list-accounts-request.json", "description": "Request parameters for listing accounts accessible to the authenticated agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/list-accounts-response.json", + "$ref": "/schemas/account/list-accounts-response.json", "description": "Response payload for list_accounts task" } }, "sync-accounts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/sync-accounts-request.json", + "$ref": "/schemas/account/sync-accounts-request.json", "description": "Request parameters for syncing advertiser accounts with a seller" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/sync-accounts-response.json", + "$ref": "/schemas/account/sync-accounts-response.json", "description": "Response payload for sync_accounts task" } }, "sync-governance": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/sync-governance-request.json", + "$ref": "/schemas/account/sync-governance-request.json", "description": "Request parameters for registering governance agent endpoints on accounts" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/sync-governance-response.json", + "$ref": "/schemas/account/sync-governance-response.json", "description": "Response payload for sync_governance task" } }, "report-usage": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/report-usage-request.json", + "$ref": "/schemas/account/report-usage-request.json", "description": "Request parameters for reporting vendor service consumption after delivery" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/report-usage-response.json", + "$ref": "/schemas/account/report-usage-response.json", "description": "Response payload for report_usage task" } }, "get-account-financials": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/get-account-financials-request.json", + "$ref": "/schemas/account/get-account-financials-request.json", "description": "Request parameters for querying financial status of an operator-billed account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/account/get-account-financials-response.json", + "$ref": "/schemas/account/get-account-financials-response.json", "description": "Response payload for get_account_financials task" } } @@ -1669,276 +1698,296 @@ "description": "Media buy task request/response schemas", "supporting-schemas": { "acceptance-context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-context.json", + "$ref": "/schemas/media-buy/acceptance-context.json", "description": "Buyer-declared facts for coarse seller acceptance-policy matching" }, "acceptance-policy-catalog": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-policy-catalog.json", + "$ref": "/schemas/media-buy/acceptance-policy-catalog.json", "description": "Versioned seller-hosted acceptance-policy catalog referenced from capabilities" }, "acceptance-policy-profile": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-policy-profile.json", + "$ref": "/schemas/media-buy/acceptance-policy-profile.json", "description": "Composable seller acceptance profile selected by products and seller defaults" }, "acceptance-policy-profile-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-policy-profile-ref.json", + "$ref": "/schemas/media-buy/acceptance-policy-profile-ref.json", "description": "Version-pinned reference to a reusable registry acceptance profile" }, "acceptance-policy-rule": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-policy-rule.json", + "$ref": "/schemas/media-buy/acceptance-policy-rule.json", "description": "Machine-readable allowed, conditional, or prohibited seller acceptance rule" }, "acceptance-policy-requirement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/acceptance-policy-requirement.json", + "$ref": "/schemas/media-buy/acceptance-policy-requirement.json", "description": "Typed prerequisite or restriction attached to a conditional acceptance rule" }, "change-term": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/change-term.json", + "$ref": "/schemas/media-buy/change-term.json", "description": "Proposal-bound buyer change right covered by the commercial terms digest" }, "change-term-constraints": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/change-term-constraints.json", + "$ref": "/schemas/media-buy/change-term-constraints.json", "description": "Portable budget, flight, package-count, or effective-timing bounds on a product action or proposal change right" }, "product-discovery-criteria": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/product-discovery-criteria.json", + "$ref": "/schemas/media-buy/product-discovery-criteria.json", "description": "Structured offer, catalog, and policy criteria shared by compact discovery tools" }, "outcome-target": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/outcome-target.json", + "$ref": "/schemas/media-buy/outcome-target.json", "description": "Reverse-forecast planning input: a compact metric or event goal plus desired volume the seller solves budget for" }, "proposal-refinement": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/proposal-refinement.json", + "$ref": "/schemas/media-buy/proposal-refinement.json", "description": "One immutable proposal revision request" }, "proposal-budget-constraint": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/proposal-budget-constraint.json", + "$ref": "/schemas/media-buy/proposal-budget-constraint.json", "description": "Strict inclusive budget bounds for proposal negotiation" }, "proposal-decline": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/proposal-decline.json", + "$ref": "/schemas/media-buy/proposal-decline.json", "description": "One terminal decline of an immutable proposal" }, "product-purchase": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/product-purchase.json", + "$ref": "/schemas/media-buy/product-purchase.json", "description": "Canonical direct product selection without creatives or negotiated term overrides" }, "compatibility-purchase-coordinator-input": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/legacy-purchase-continuation-input.json", + "$ref": "/schemas/media-buy/legacy-purchase-continuation-input.json", "description": "SDK-local fail-closed input for redeeming a deprecated products-only compatibility continuation" }, "commercial-terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/commercial-terms.json", + "$ref": "/schemas/media-buy/commercial-terms.json", "description": "Typed immutable commercial envelope shared by direct purchases and proposals" }, "package-control": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/package-control.json", + "$ref": "/schemas/media-buy/package-control.json", "description": "Operational package controls bounded by accepted commercial terms" }, "media-buy-commitment-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/media-buy-commitment-response.json", + "$ref": "/schemas/media-buy/media-buy-commitment-response.json", "description": "Compact shared result for direct purchase and proposal acceptance" }, "get-products-rejected": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-products-rejected.json", + "$ref": "/schemas/media-buy/get-products-rejected.json", "description": "Terminal business rejection arm for a well-formed get_products brief or refinement" }, "package-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/package-request.json", + "$ref": "/schemas/media-buy/package-request.json", "description": "Package configuration for media buy creation - used within create_media_buy request" }, "package-update": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/package-update.json", + "$ref": "/schemas/media-buy/package-update.json", "description": "Package update configuration for update_media_buy - identifies package and specifies fields to modify" } }, "tasks": { "get-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-products-request.json", + "$ref": "/schemas/media-buy/get-products-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use list_products, request_proposals, refine_proposals, or decline_proposals." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-products-response.json", + "$ref": "/schemas/media-buy/get-products-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for get_products" } }, "list-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/list-products-request.json", + "$ref": "/schemas/media-buy/list-products-request.json", "description": "Request parameters for synchronous product-offer reads" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/list-products-response.json", + "$ref": "/schemas/media-buy/list-products-response.json", "description": "Response payload for list_products" } }, "request-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/request-proposals-request.json", + "$ref": "/schemas/media-buy/request-proposals-request.json", "description": "Request parameters for creating actionable seller proposals" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/request-proposals-response.json", + "$ref": "/schemas/media-buy/request-proposals-response.json", "description": "Response payload for request_proposals" } }, "refine-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/refine-proposals-request.json", + "$ref": "/schemas/media-buy/refine-proposals-request.json", "description": "Request parameters for creating one or more proposal revisions" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/refine-proposals-response.json", + "$ref": "/schemas/media-buy/refine-proposals-response.json", "description": "Response payload for refine_proposals" } }, "decline-proposals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/decline-proposals-request.json", + "$ref": "/schemas/media-buy/decline-proposals-request.json", "description": "Request parameters for terminally declining one or more proposals" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/decline-proposals-response.json", + "$ref": "/schemas/media-buy/decline-proposals-response.json", "description": "Ordered decline results for decline_proposals" } }, "buy-products": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/buy-products-request.json", + "$ref": "/schemas/media-buy/buy-products-request.json", "description": "Create a MediaBuy directly from canonical published product offers" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/buy-products-response.json", + "$ref": "/schemas/media-buy/buy-products-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "accept-proposal": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/accept-proposal-request.json", + "$ref": "/schemas/media-buy/accept-proposal-request.json", "description": "Accept a committed new-buy, amendment, or cancellation proposal" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/accept-proposal-response.json", + "$ref": "/schemas/media-buy/accept-proposal-response.json", "description": "Compact MediaBuy commitment and accepted commercial snapshot" } }, "control-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/control-media-buy-request.json", + "$ref": "/schemas/media-buy/control-media-buy-request.json", "description": "Apply operational controls inside accepted commercial terms" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/control-media-buy-response.json", + "$ref": "/schemas/media-buy/control-media-buy-response.json", "description": "Compact operational-control result" } }, "list-creative-formats": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/list-creative-formats-request.json", + "$ref": "/schemas/media-buy/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request. Sales agents publish canonical sellable formats through get_products Product.format_options[]." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/list-creative-formats-response.json", + "$ref": "/schemas/media-buy/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats. Not a sales-agent deliverability contract." } }, "create-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/create-media-buy-request.json", + "$ref": "/schemas/media-buy/create-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use buy_products or accept_proposal." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/create-media-buy-response.json", + "$ref": "/schemas/media-buy/create-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for create_media_buy" } }, "update-media-buy": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/update-media-buy-request.json", + "$ref": "/schemas/media-buy/update-media-buy-request.json", "deprecated": true, "description": "AdCP 3.x compatibility request. New 3.2 callers use control_media_buy or refine_proposals." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/update-media-buy-response.json", + "$ref": "/schemas/media-buy/update-media-buy-response.json", "deprecated": true, "description": "AdCP 3.x compatibility response for update_media_buy" } }, "get-media-buys": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-media-buys-request.json", + "$ref": "/schemas/media-buy/get-media-buys-request.json", "description": "Request parameters for retrieving media buy status, creative approvals, and delivery snapshots" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-media-buys-response.json", + "$ref": "/schemas/media-buy/get-media-buys-response.json", "description": "Response payload for get_media_buys task" } }, "get-media-buy-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-media-buy-delivery-request.json", + "$ref": "/schemas/media-buy/get-media-buy-delivery-request.json", "description": "Request parameters for retrieving comprehensive delivery metrics" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/get-media-buy-delivery-response.json", + "$ref": "/schemas/media-buy/get-media-buy-delivery-response.json", "description": "Response payload for get_media_buy_delivery task" } }, + "get-reporting-status": { + "request": { + "$ref": "/schemas/media-buy/get-reporting-status-request.json", + "description": "Request parameters for reconciling managed reporting obligations, revisions, and materializations" + }, + "response": { + "$ref": "/schemas/media-buy/get-reporting-status-response.json", + "description": "Authoritative reporting ledger status for summary, periods, or one exact revision" + } + }, + "sync-reporting-receipts": { + "request": { + "$ref": "/schemas/media-buy/sync-reporting-receipts-request.json", + "description": "Submit authenticated consumer reconciliation receipts for durable reporting materializations" + }, + "response": { + "$ref": "/schemas/media-buy/sync-reporting-receipts-response.json", + "description": "Per-receipt durable recording results" + } + }, "provide-performance-feedback": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/provide-performance-feedback-request.json", + "$ref": "/schemas/media-buy/provide-performance-feedback-request.json", "description": "Request parameters for sharing performance outcomes with publishers" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/provide-performance-feedback-response.json", + "$ref": "/schemas/media-buy/provide-performance-feedback-response.json", "description": "Response payload for provide_performance_feedback task" } }, "sync-event-sources": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-event-sources-request.json", + "$ref": "/schemas/media-buy/sync-event-sources-request.json", "description": "Request parameters for configuring event sources on an account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-event-sources-response.json", + "$ref": "/schemas/media-buy/sync-event-sources-response.json", "description": "Response payload for sync_event_sources task" } }, "log-event": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/log-event-request.json", + "$ref": "/schemas/media-buy/log-event-request.json", "description": "Request parameters for logging conversion or marketing events" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/log-event-response.json", + "$ref": "/schemas/media-buy/log-event-response.json", "description": "Response payload for log_event task" } }, "sync-audiences": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-audiences-request.json", + "$ref": "/schemas/media-buy/sync-audiences-request.json", "description": "Request parameters for managing CRM-based audiences on an account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-audiences-response.json", + "$ref": "/schemas/media-buy/sync-audiences-response.json", "description": "Response payload for sync_audiences task" } }, "sync-catalogs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-catalogs-request.json", + "$ref": "/schemas/media-buy/sync-catalogs-request.json", "description": "Request parameters for syncing catalog feeds (products, inventory, stores, promotions, offerings) with approval workflow" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/sync-catalogs-response.json", + "$ref": "/schemas/media-buy/sync-catalogs-response.json", "description": "Response payload for sync_catalogs task with per-catalog results and item-level approval status" } } @@ -1949,100 +1998,100 @@ "tasks": { "build-creative": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/build-creative-request.json", + "$ref": "/schemas/media-buy/build-creative-request.json", "description": "Request parameters for AI-powered creative generation" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/media-buy/build-creative-response.json", + "$ref": "/schemas/media-buy/build-creative-response.json", "description": "Response payload for build_creative task" } }, "preview-creative": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/preview-creative-request.json", + "$ref": "/schemas/creative/preview-creative-request.json", "description": "Request parameters for generating creative previews" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/preview-creative-response.json", + "$ref": "/schemas/creative/preview-creative-response.json", "description": "Response payload for preview_creative task" } }, "list-creative-formats": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-creative-formats-request.json", + "$ref": "/schemas/creative/list-creative-formats-request.json", "deprecated": true, "description": "Deprecated 3.x compatibility request; use get_adcp_capabilities creative.supported_formats[]." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-creative-formats-response.json", + "$ref": "/schemas/creative/list-creative-formats-response.json", "deprecated": true, "description": "Deprecated 3.x compatibility response for legacy named formats." } }, "list-transformers": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-transformers-request.json", + "$ref": "/schemas/creative/list-transformers-request.json", "description": "Request parameters for discovering account-scoped creative transformers (the creative analog of products), with optional brief filtering, per-param option expansion, and pricing" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-transformers-response.json", - "description": "Response payload with transformer descriptors \u2014 input/output formats, typed config params, account-scoped enumerable option values when expanded, and per-account pricing" + "$ref": "/schemas/creative/list-transformers-response.json", + "description": "Response payload with transformer descriptors — input/output formats, typed config params, account-scoped enumerable option values when expanded, and per-account pricing" } }, "get-creative-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/get-creative-delivery-request.json", + "$ref": "/schemas/creative/get-creative-delivery-request.json", "description": "Request parameters for retrieving creative delivery data with variant-level breakdowns" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/get-creative-delivery-response.json", + "$ref": "/schemas/creative/get-creative-delivery-response.json", "description": "Response payload with creative delivery data including variant manifests and metrics" } }, "list-creatives": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-creatives-request.json", + "$ref": "/schemas/creative/list-creatives-request.json", "description": "Request parameters for querying creative library with filtering and pagination" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/list-creatives-response.json", + "$ref": "/schemas/creative/list-creatives-response.json", "description": "Response payload for list_creatives task" } }, "sync-creatives": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/sync-creatives-request.json", + "$ref": "/schemas/creative/sync-creatives-request.json", "description": "Request parameters for syncing creative assets with upsert semantics" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/sync-creatives-response.json", + "$ref": "/schemas/creative/sync-creatives-response.json", "description": "Response payload for sync_creatives task" } }, "validate-input": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/validate-input-request.json", + "$ref": "/schemas/creative/validate-input-request.json", "description": "Request parameters for validating a creative manifest against canonical formats and/or specific products without committing to a render" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/validate-input-response.json", + "$ref": "/schemas/creative/validate-input-response.json", "description": "Response payload for validate_input task with per-target validation results" } } }, "webhooks": { "creative-assignment-changed": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/creative-assignment-changed-webhook.json", + "$ref": "/schemas/creative/creative-assignment-changed-webhook.json", "description": "Account-level invalidation payload for creative assignment membership or approval changes" } }, "asset_types": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/asset-types/index.json", + "$ref": "/schemas/creative/asset-types/index.json", "description": "Asset type definitions for creative manifests" }, "build_inputs": { "video_brief": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/video-brief.json", + "$ref": "/schemas/creative/video-brief.json", "description": "Typed per-segment generation brief for build_creative input on generative video platforms" } } @@ -2052,21 +2101,21 @@ "tasks": { "get-signals": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/signals/get-signals-request.json", + "$ref": "/schemas/signals/get-signals-request.json", "description": "Request parameters for discovering signals based on description" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/signals/get-signals-response.json", + "$ref": "/schemas/signals/get-signals-response.json", "description": "Response payload for get_signals task" } }, "activate-signal": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/signals/activate-signal-request.json", + "$ref": "/schemas/signals/activate-signal-request.json", "description": "Request parameters for activating a signal on a specific platform/account" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/signals/activate-signal-response.json", + "$ref": "/schemas/signals/activate-signal-response.json", "description": "Response payload for activate_signal task" } } @@ -2076,306 +2125,306 @@ "description": "Governance protocol for property governance, brand standards, content standards, and compliance", "supporting-schemas": { "accepted-governance-agents": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/accepted-governance-agents.json", + "$ref": "/schemas/governance/accepted-governance-agents.json", "description": "Seller acceptance matchers for buyer-selected governance agents" }, "reported-outcome-error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/reported-outcome-error.json", + "$ref": "/schemas/governance/reported-outcome-error.json", "description": "Buyer-attributed structured error evidence for a failed governed action" }, "property-feature-definition": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-feature-definition.json", + "$ref": "/schemas/property/property-feature-definition.json", "description": "Definition of a feature that a governance agent can evaluate" }, "property-feature": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-feature.json", + "$ref": "/schemas/property/property-feature.json", "description": "A discrete feature assessment for a property" }, "property-error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-error.json", + "$ref": "/schemas/property/property-error.json", "description": "Error information for a property that could not be evaluated" }, "property-list": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-list.json", + "$ref": "/schemas/property/property-list.json", "description": "A managed property list with optional filters for dynamic evaluation" }, "property-list-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-list-filters.json", + "$ref": "/schemas/property/property-list-filters.json", "description": "Filters that dynamically modify a property list when resolved" }, "property-list-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/property-list-changed-webhook.json", + "$ref": "/schemas/property/property-list-changed-webhook.json", "description": "Webhook payload when a property list changes" }, "base-property-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/base-property-source.json", + "$ref": "/schemas/property/base-property-source.json", "description": "A source of properties for a property list - supports publisher+tags, publisher+property_ids, or direct identifiers" }, "collection-list": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/collection-list.json", - "description": "A managed collection list with optional filters for dynamic evaluation \u2014 collections represent programs/shows independent of properties" + "$ref": "/schemas/collection/collection-list.json", + "description": "A managed collection list with optional filters for dynamic evaluation — collections represent programs/shows independent of properties" }, "collection-list-filters": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/collection-list-filters.json", - "description": "Filters that dynamically modify a collection list when resolved \u2014 content ratings, genres, kinds, production quality" + "$ref": "/schemas/collection/collection-list-filters.json", + "description": "Filters that dynamically modify a collection list when resolved — content ratings, genres, kinds, production quality" }, "collection-list-changed-webhook": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/collection-list-changed-webhook.json", + "$ref": "/schemas/collection/collection-list-changed-webhook.json", "description": "Webhook payload when a collection list changes" }, "base-collection-source": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/base-collection-source.json", + "$ref": "/schemas/collection/base-collection-source.json", "description": "A source of collections for a collection list - supports distribution_ids, publisher_collections, or publisher_genres" }, "content-standards": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/content-standards.json", + "$ref": "/schemas/content-standards/content-standards.json", "description": "Reusable content standards configuration - defines brand safety/suitability policies with scope, policy, calibration exemplars, and lifecycle dates" }, "content-standards-artifact": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/artifact.json", + "$ref": "/schemas/content-standards/artifact.json", "description": "Content artifact for evaluation or calibration - represents content context where ad placements occur, identified by property_id + artifact_id" }, "artifact-webhook-payload": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/artifact-webhook-payload.json", + "$ref": "/schemas/content-standards/artifact-webhook-payload.json", "description": "Webhook payload for content artifact delivery from sales agents to orchestrators" }, "policy-entry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/policy-entry.json", + "$ref": "/schemas/governance/policy-entry.json", "description": "A complete policy in the policy registry with natural language text, metadata, and calibration exemplars" }, "policy-ref": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/policy-ref.json", + "$ref": "/schemas/governance/policy-ref.json", "description": "Reference to a registry policy by ID with optional version pin" } }, "tasks": { "create-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/create-property-list-request.json", + "$ref": "/schemas/property/create-property-list-request.json", "description": "Request parameters for creating a new property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/create-property-list-response.json", + "$ref": "/schemas/property/create-property-list-response.json", "description": "Response payload for create_property_list task" } }, "update-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/update-property-list-request.json", + "$ref": "/schemas/property/update-property-list-request.json", "description": "Request parameters for updating an existing property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/update-property-list-response.json", + "$ref": "/schemas/property/update-property-list-response.json", "description": "Response payload for update_property_list task" } }, "get-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/get-property-list-request.json", + "$ref": "/schemas/property/get-property-list-request.json", "description": "Request parameters for retrieving a property list with resolved properties" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/get-property-list-response.json", + "$ref": "/schemas/property/get-property-list-response.json", "description": "Response payload for get_property_list task" } }, "list-property-lists": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/list-property-lists-request.json", + "$ref": "/schemas/property/list-property-lists-request.json", "description": "Request parameters for listing property lists" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/list-property-lists-response.json", + "$ref": "/schemas/property/list-property-lists-response.json", "description": "Response payload for list_property_lists task" } }, "delete-property-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/delete-property-list-request.json", + "$ref": "/schemas/property/delete-property-list-request.json", "description": "Request parameters for deleting a property list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/property/delete-property-list-response.json", + "$ref": "/schemas/property/delete-property-list-response.json", "description": "Response payload for delete_property_list task" } }, "create-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/create-collection-list-request.json", + "$ref": "/schemas/collection/create-collection-list-request.json", "description": "Request parameters for creating a new collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/create-collection-list-response.json", + "$ref": "/schemas/collection/create-collection-list-response.json", "description": "Response payload for create_collection_list task" } }, "update-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/update-collection-list-request.json", + "$ref": "/schemas/collection/update-collection-list-request.json", "description": "Request parameters for updating an existing collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/update-collection-list-response.json", + "$ref": "/schemas/collection/update-collection-list-response.json", "description": "Response payload for update_collection_list task" } }, "get-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/get-collection-list-request.json", + "$ref": "/schemas/collection/get-collection-list-request.json", "description": "Request parameters for retrieving a collection list with resolved collections" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/get-collection-list-response.json", + "$ref": "/schemas/collection/get-collection-list-response.json", "description": "Response payload for get_collection_list task" } }, "list-collection-lists": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/list-collection-lists-request.json", + "$ref": "/schemas/collection/list-collection-lists-request.json", "description": "Request parameters for listing collection lists" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/list-collection-lists-response.json", + "$ref": "/schemas/collection/list-collection-lists-response.json", "description": "Response payload for list_collection_lists task" } }, "delete-collection-list": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/delete-collection-list-request.json", + "$ref": "/schemas/collection/delete-collection-list-request.json", "description": "Request parameters for deleting a collection list" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/collection/delete-collection-list-response.json", + "$ref": "/schemas/collection/delete-collection-list-response.json", "description": "Response payload for delete_collection_list task" } }, "list-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/list-content-standards-request.json", + "$ref": "/schemas/content-standards/list-content-standards-request.json", "description": "Request parameters for listing content standards configurations" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/list-content-standards-response.json", + "$ref": "/schemas/content-standards/list-content-standards-response.json", "description": "Response payload with list of content standards configurations" } }, "get-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/get-content-standards-request.json", + "$ref": "/schemas/content-standards/get-content-standards-request.json", "description": "Request parameters for retrieving a specific standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/get-content-standards-response.json", + "$ref": "/schemas/content-standards/get-content-standards-response.json", "description": "Response payload with full standards configuration including policy and calibration data" } }, "create-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/create-content-standards-request.json", + "$ref": "/schemas/content-standards/create-content-standards-request.json", "description": "Request parameters for creating a new content standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/create-content-standards-response.json", + "$ref": "/schemas/content-standards/create-content-standards-response.json", "description": "Response payload with new standards_id" } }, "update-content-standards": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/update-content-standards-request.json", + "$ref": "/schemas/content-standards/update-content-standards-request.json", "description": "Request parameters for updating an existing content standards configuration" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/update-content-standards-response.json", + "$ref": "/schemas/content-standards/update-content-standards-response.json", "description": "Response payload confirming update" } }, "calibrate-content": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/calibrate-content-request.json", + "$ref": "/schemas/content-standards/calibrate-content-request.json", "description": "Request parameters for collaborative calibration dialogue" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/calibrate-content-response.json", + "$ref": "/schemas/content-standards/calibrate-content-response.json", "description": "Response payload with detailed explanations for policy alignment" } }, "validate-content-delivery": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/validate-content-delivery-request.json", + "$ref": "/schemas/content-standards/validate-content-delivery-request.json", "description": "Request parameters for batch validating delivery records" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/validate-content-delivery-response.json", + "$ref": "/schemas/content-standards/validate-content-delivery-response.json", "description": "Response payload with batch validation results" } }, "get-media-buy-artifacts": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/get-media-buy-artifacts-request.json", + "$ref": "/schemas/content-standards/get-media-buy-artifacts-request.json", "description": "Request parameters for retrieving content artifacts from a media buy" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/content-standards/get-media-buy-artifacts-response.json", + "$ref": "/schemas/content-standards/get-media-buy-artifacts-response.json", "description": "Response payload with content artifacts for validation" } }, "get-creative-features": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/get-creative-features-request.json", + "$ref": "/schemas/creative/get-creative-features-request.json", "description": "Request parameters for evaluating creative features from a governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/creative/get-creative-features-response.json", + "$ref": "/schemas/creative/get-creative-features-response.json", "description": "Response payload with feature values for the evaluated creative" } }, "sync-plans": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/sync-plans-request.json", + "$ref": "/schemas/governance/sync-plans-request.json", "description": "Push campaign plans to the governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/sync-plans-response.json", + "$ref": "/schemas/governance/sync-plans-response.json", "description": "Sync result with active validation categories and resolved policies per plan" } }, "report-plan-outcome": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/report-plan-outcome-request.json", + "$ref": "/schemas/governance/report-plan-outcome-request.json", "description": "Report the outcome of an action to the governance agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/report-plan-outcome-response.json", + "$ref": "/schemas/governance/report-plan-outcome-response.json", "description": "Outcome acceptance status with budget impact and findings" } }, "report-plan-adjustment": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/report-plan-adjustment-request.json", + "$ref": "/schemas/governance/report-plan-adjustment-request.json", "description": "Seller-authenticated append-only commitment adjustment report" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/report-plan-adjustment-response.json", + "$ref": "/schemas/governance/report-plan-adjustment-response.json", "description": "Accepted adjustment with gross, restored-headroom, and net budget state" } }, "get-plan-audit-logs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/get-plan-audit-logs-request.json", + "$ref": "/schemas/governance/get-plan-audit-logs-request.json", "description": "Retrieve governance state and audit trail for a plan" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/get-plan-audit-logs-response.json", + "$ref": "/schemas/governance/get-plan-audit-logs-response.json", "description": "Plan state with budget tracking, validation history, and compliance summary" } }, "check-governance": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/check-governance-request.json", + "$ref": "/schemas/governance/check-governance-request.json", "description": "Orchestrator or seller calls the governance agent to validate an action against the campaign plan" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/check-governance-response.json", + "$ref": "/schemas/governance/check-governance-response.json", "description": "Governance decision with findings and conditions" } } @@ -2386,43 +2435,53 @@ "tasks": { "get-adcp-capabilities": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/get-adcp-capabilities-request.json", + "$ref": "/schemas/protocol/get-adcp-capabilities-request.json", "description": "Request parameters for cross-protocol capability discovery" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/get-adcp-capabilities-response.json", + "$ref": "/schemas/protocol/get-adcp-capabilities-response.json", "description": "Response payload for get_adcp_capabilities task - includes AdCP version, supported protocols, and protocol-specific capabilities (media_buy, signals, etc.)" } }, "get-task-status": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/get-task-status-request.json", + "$ref": "/schemas/protocol/get-task-status-request.json", "description": "Request parameters for get_task_status, the 3.x AdCP application-layer alias for legacy tasks/get polling; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/get-task-status-response.json", + "$ref": "/schemas/protocol/get-task-status-response.json", "description": "AdCP application-layer task status, metadata, and optional completion result; alias response for legacy tasks/get" } }, "list-tasks": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/list-tasks-request.json", + "$ref": "/schemas/protocol/list-tasks-request.json", "description": "Request parameters for list_tasks, the 3.x AdCP application-layer alias for legacy tasks/list reconciliation; distinct from transport-native tasks/* methods" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/list-tasks-response.json", + "$ref": "/schemas/protocol/list-tasks-response.json", "description": "Filtered AdCP application-layer async task list for reconciliation; alias response for legacy tasks/list" } }, "sync-agent-notification-configs": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/sync-agent-notification-configs-request.json", + "$ref": "/schemas/protocol/sync-agent-notification-configs-request.json", "description": "Register, replace, pause, or clear agent-level webhook subscribers such as capabilities.changed" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/protocol/sync-agent-notification-configs-response.json", + "$ref": "/schemas/protocol/sync-agent-notification-configs-response.json", "description": "Applied agent-level webhook subscriber set with credentials redacted" } + }, + "sync-agent-configuration": { + "request": { + "$ref": "/schemas/protocol/sync-agent-configuration-request.json", + "description": "Declaratively synchronize caller-scoped webhooks and reusable reporting destinations" + }, + "response": { + "$ref": "/schemas/protocol/sync-agent-configuration-response.json", + "description": "Complete credential-free caller-scoped connection configuration and setup state" + } } } }, @@ -2430,68 +2489,68 @@ "description": "Sponsored Intelligence Protocol for conversational brand experiences in AI assistants", "supporting-schemas": { "si-capabilities": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-capabilities.json", + "$ref": "/schemas/sponsored-intelligence/si-capabilities.json", "description": "Capability categories that brand or host can support (modalities, components, commerce)" }, "si-identity": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-identity.json", + "$ref": "/schemas/sponsored-intelligence/si-identity.json", "description": "User identity with explicit consent for personalized brand experiences" }, "si-ui-element": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-ui-element.json", + "$ref": "/schemas/sponsored-intelligence/si-ui-element.json", "description": "Standard visual components (text, link, image, product_card, carousel, action_button, app_handoff)" }, "si-context-use": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-context-use.json", + "$ref": "/schemas/sponsored-intelligence/si-context-use.json", "description": "Declared host-side use mode for sponsored context entering an SI boundary" }, "si-sponsored-context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-sponsored-context.json", + "$ref": "/schemas/sponsored-intelligence/si-sponsored-context.json", "description": "Declaration linking paying principal, context use, and disclosure obligation for sponsored context" }, "si-sponsored-context-receipt": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-sponsored-context-receipt.json", + "$ref": "/schemas/sponsored-intelligence/si-sponsored-context-receipt.json", "description": "Host receipt recording accepted use mode and disclosure commitment for sponsored context" } }, "tasks": { "si-get-offering": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-get-offering-request.json", + "$ref": "/schemas/sponsored-intelligence/si-get-offering-request.json", "description": "Get offering details, availability, and optionally matching products before session handoff" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-get-offering-response.json", + "$ref": "/schemas/sponsored-intelligence/si-get-offering-response.json", "description": "Offering details, availability status, matching products, and token for session correlation" } }, "si-initiate-session": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-initiate-session-request.json", + "$ref": "/schemas/sponsored-intelligence/si-initiate-session-request.json", "description": "Host initiates SI session with brand agent - includes context, identity, and capability negotiation" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-initiate-session-response.json", + "$ref": "/schemas/sponsored-intelligence/si-initiate-session-response.json", "description": "Brand agent's response with session ID, initial message, UI elements, and negotiated capabilities" } }, "si-send-message": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-send-message-request.json", + "$ref": "/schemas/sponsored-intelligence/si-send-message-request.json", "description": "Send a message within an active SI session" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-send-message-response.json", + "$ref": "/schemas/sponsored-intelligence/si-send-message-response.json", "description": "Brand agent's response to the message, including session status and potential handoff" } }, "si-terminate-session": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-terminate-session-request.json", + "$ref": "/schemas/sponsored-intelligence/si-terminate-session-request.json", "description": "Terminate an SI session with reason (handoff_transaction, handoff_complete, user_exit, session_timeout, host_terminated)" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-terminate-session-response.json", + "$ref": "/schemas/sponsored-intelligence/si-terminate-session-response.json", "description": "Termination confirmation with optional ACP handoff or follow-up data" } } @@ -2499,79 +2558,79 @@ }, "adagents": { "description": "Agent authorization file format specification for publishers and data providers", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/adagents.json", + "$ref": "/schemas/adagents.json", "file_location": "/.well-known/adagents.json", "purpose": "Declares authorized agents. Publishers use it for sales agent authorization over properties. Data providers use it to publish signal definitions and authorize signals agents to resell their data." }, "brand": { "description": "Brand identity claim file format specification", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand.json", + "$ref": "/schemas/brand.json", "file_location": "/.well-known/brand.json", "purpose": "Declares brand identity and agent for a domain, enabling brand discovery and verification" }, "trusted-match": { - "description": "Trusted Match Protocol (TMP) \u2014 real-time execution layer for activating pre-negotiated packages across any surface. Conformance invariants are normative in docs/trusted-match/specification.mdx; the cap-fire boundary contract is at docs/trusted-match/identity-match-implementation.mdx; a non-normative impression-tracker implementation reference (multi-identity dedup, fcap_keys labels, log-based data model, SDK primitives) is at docs/trusted-match/impression-tracker-implementation.mdx. Storage backend is an implementation choice; conformant services may use any store that satisfies the invariants.", + "description": "Trusted Match Protocol (TMP) — real-time execution layer for activating pre-negotiated packages across any surface. Conformance invariants are normative in docs/trusted-match/specification.mdx; the cap-fire boundary contract is at docs/trusted-match/identity-match-implementation.mdx; a non-normative impression-tracker implementation reference (multi-identity dedup, fcap_keys labels, log-based data model, SDK primitives) is at docs/trusted-match/impression-tracker-implementation.mdx. Storage backend is an implementation choice; conformant services may use any store that satisfies the invariants.", "supporting-schemas": { "available-package": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/available-package.json", + "$ref": "/schemas/trusted-match/available-package.json", "description": "A package available for contextual matching on a given impression opportunity" }, "offer": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/offer.json", - "description": "Buyer's response to a context match \u2014 ranges from simple activation (package_id only) to rich offers with brand, price, summary, and creative manifest" + "$ref": "/schemas/trusted-match/offer.json", + "description": "Buyer's response to a context match — ranges from simple activation (package_id only) to rich offers with brand, price, summary, and creative manifest" }, "offer-price": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/offer-price.json", + "$ref": "/schemas/trusted-match/offer-price.json", "description": "Lightweight price for variable-priced offers" }, "error": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/error.json", + "$ref": "/schemas/trusted-match/error.json", "description": "Error response from a TMP provider or router when a request cannot be processed" }, "provider-registration": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/provider-registration.json", - "description": "TMP provider registration \u2014 endpoint, capabilities, and operational parameters for router configuration" + "$ref": "/schemas/trusted-match/provider-registration.json", + "description": "TMP provider registration — endpoint, capabilities, and operational parameters for router configuration" }, "provider-context-match-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/provider-context-match-response.json", - "description": "Provider-to-router Context Match response shape \u2014 carries provider-local targeting key-values and forbids router-authored attribution buckets" + "$ref": "/schemas/trusted-match/provider-context-match-response.json", + "description": "Provider-to-router Context Match response shape — carries provider-local targeting key-values and forbids router-authored attribution buckets" }, "provider-identity-match-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/provider-identity-match-response.json", - "description": "Provider-to-router Identity Match response shape \u2014 carries ordered TMPX `{slot_id, value}` chunks with no publisher-local names" + "$ref": "/schemas/trusted-match/provider-identity-match-response.json", + "description": "Provider-to-router Identity Match response shape — carries ordered TMPX `{slot_id, value}` chunks with no publisher-local names" }, "publisher-targeting-kv-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/publisher-targeting-kv-config.json", + "$ref": "/schemas/trusted-match/publisher-targeting-kv-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, provider-local targeting key) to the ad-server targeting destination for that surface" }, "publisher-tmpx-config": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/publisher-tmpx-config.json", + "$ref": "/schemas/trusted-match/publisher-tmpx-config.json", "description": "Publisher-owned deployment configuration that maps (provider_id, slot_id) to the ad-server macro name, GAM key-value, VAST substitution, or play-log field for that surface" }, "tmpx-chunk": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/tmpx-chunk.json", - "description": "A single TMPX chunk \u2014 provider-local slot_id and opaque URL-safe value; shared between provider\u2192router and router\u2192publisher hops" + "$ref": "/schemas/trusted-match/tmpx-chunk.json", + "description": "A single TMPX chunk — provider-local slot_id and opaque URL-safe value; shared between provider→router and router→publisher hops" } }, "operations": { "context-match": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/context-match-request.json", + "$ref": "/schemas/trusted-match/context-match-request.json", "description": "Evaluate available packages against content context. Contains no user identity." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/context-match-response.json", + "$ref": "/schemas/trusted-match/context-match-response.json", "description": "Router-to-publisher offers for matched packages with provider-attributed targeting signals" } }, "identity-match": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/identity-match-request.json", + "$ref": "/schemas/trusted-match/identity-match-request.json", "description": "Evaluate user eligibility for packages using an opaque identity token. Contains no page context." }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/trusted-match/identity-match-response.json", - "description": "Per-package eligibility \u2014 boolean eligible plus optional intent score" + "$ref": "/schemas/trusted-match/identity-match-response.json", + "description": "Per-package eligibility — boolean eligible plus optional intent score" } } } @@ -2580,88 +2639,88 @@ "description": "Brand protocol for identity retrieval, rights discovery, acquisition, and lifecycle management", "supporting-schemas": { "rights-pricing-option": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/rights-pricing-option.json", + "$ref": "/schemas/brand/rights-pricing-option.json", "description": "Pricing option for licensable rights" }, "rights-terms": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/rights-terms.json", - "description": "Terms returned with a rights grant \u2014 coverage, restrictions, revocation, and credentials" + "$ref": "/schemas/brand/rights-terms.json", + "description": "Terms returned with a rights grant — coverage, restrictions, revocation, and credentials" }, "creative-approval-request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/creative-approval-request.json", + "$ref": "/schemas/brand/creative-approval-request.json", "description": "Payload the buyer submits to the approval_webhook from acquire_rights for rights-holder creative review" }, "creative-approval-response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/creative-approval-response.json", - "description": "Response from the approval_webhook \u2014 approved, rejected, or pending_review" + "$ref": "/schemas/brand/creative-approval-response.json", + "description": "Response from the approval_webhook — approved, rejected, or pending_review" }, "revocation-notification": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/revocation-notification.json", + "$ref": "/schemas/brand/revocation-notification.json", "description": "Notification sent to the buyer's revocation_webhook when an acquired rights grant is revoked" }, "verification-status": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/verification-status.json", - "description": "Shared status enum returned by verify_brand_claim \u2014 owned, pending_review, transferring, disputed, not_ours, archived, licensed_in, licensed_out, unknown" + "$ref": "/schemas/brand/verification-status.json", + "description": "Shared status enum returned by verify_brand_claim — owned, pending_review, transferring, disputed, not_ours, archived, licensed_in, licensed_out, unknown" } }, "tasks": { "get-brand-identity": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/get-brand-identity-request.json", + "$ref": "/schemas/brand/get-brand-identity-request.json", "description": "Request parameters for retrieving brand identity data from a brand agent" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/get-brand-identity-response.json", + "$ref": "/schemas/brand/get-brand-identity-response.json", "description": "Response payload for get_brand_identity task" } }, "verify-brand-claim": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/verify-brand-claim-request.json", + "$ref": "/schemas/brand/verify-brand-claim-request.json", "description": "Request parameters for verifying a single brand claim (subsidiary / parent / property / trademark, discriminated by claim_type)" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/verify-brand-claim-response.json", - "description": "Response payload for verify_brand_claim task \u2014 claim_type echoed, status from the shared VerificationStatus enum, per-claim-type details" + "$ref": "/schemas/brand/verify-brand-claim-response.json", + "description": "Response payload for verify_brand_claim task — claim_type echoed, status from the shared VerificationStatus enum, per-claim-type details" } }, "verify-brand-claims": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/verify-brand-claims-request.json", - "description": "Request parameters for bulk verification \u2014 claims[] array (max 100), each entry shaped like a single verify_brand_claim request" + "$ref": "/schemas/brand/verify-brand-claims-request.json", + "description": "Request parameters for bulk verification — claims[] array (max 100), each entry shaped like a single verify_brand_claim request" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/verify-brand-claims-response.json", - "description": "Response payload for verify_brand_claims task \u2014 results[] positionally aligned with the request's claims[], per-result success or error inline" + "$ref": "/schemas/brand/verify-brand-claims-response.json", + "description": "Response payload for verify_brand_claims task — results[] positionally aligned with the request's claims[], per-result success or error inline" } }, "get-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/get-rights-request.json", + "$ref": "/schemas/brand/get-rights-request.json", "description": "Request parameters for searching licensable rights with pricing" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/get-rights-response.json", + "$ref": "/schemas/brand/get-rights-response.json", "description": "Response payload for get_rights task" } }, "acquire-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/acquire-rights-request.json", + "$ref": "/schemas/brand/acquire-rights-request.json", "description": "Request parameters for acquiring rights with contractual clearance" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/acquire-rights-response.json", - "description": "Response payload for acquire_rights task \u2014 terms and generation credentials" + "$ref": "/schemas/brand/acquire-rights-response.json", + "description": "Response payload for acquire_rights task — terms and generation credentials" } }, "update-rights": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/update-rights-request.json", - "description": "Request parameters for modifying an active rights grant \u2014 dates, caps, pricing, or pause/resume" + "$ref": "/schemas/brand/update-rights-request.json", + "description": "Request parameters for modifying an active rights grant — dates, caps, pricing, or pause/resume" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/brand/update-rights-response.json", + "$ref": "/schemas/brand/update-rights-response.json", "description": "Response payload for update_rights task" } } @@ -2670,11 +2729,11 @@ "extensions": { "description": "Typed extension schemas for vendor-specific or domain-specific data. Extensions define the structure of data within the ext.{namespace} field. Agents declare which extensions they support in their agent card.", "registry": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/extensions/index.json", + "$ref": "/schemas/extensions/index.json", "description": "Auto-generated registry of all available extensions with metadata" }, "meta": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/extensions/extension-meta.json", + "$ref": "/schemas/extensions/extension-meta.json", "description": "Schema that all extension files must follow. Defines valid_from, valid_until, and extension data structure." }, "schemas": {} @@ -2683,19 +2742,19 @@ "description": "Compliance testing tool schemas. The test controller is an optional sandbox-only tool that lets comply walk full lifecycle state machines by triggering seller-side transitions deterministically.", "supporting-schemas": { "task-completion-data": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/compliance/task-completion-data.json", + "$ref": "/schemas/compliance/task-completion-data.json", "description": "Bounded force_task_completion result union for supported legacy async scenarios" } }, "tasks": { "comply-test-controller": { "request": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/compliance/comply-test-controller-request.json", - "description": "Request payload for the comply_test_controller tool \u2014 scenario selection and scenario-specific params" + "$ref": "/schemas/compliance/comply-test-controller-request.json", + "description": "Request payload for the comply_test_controller tool — scenario selection and scenario-specific params" }, "response": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/compliance/comply-test-controller-response.json", - "description": "Response payload \u2014 state transition results, simulation results, scenario list, or structured errors" + "$ref": "/schemas/compliance/comply-test-controller-response.json", + "description": "Response payload — state transition results, simulation results, scenario list, or structured errors" } } } @@ -2725,4 +2784,4 @@ } ], "published_version": "3.2.0-beta.9" -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-request.json b/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-request.json new file mode 100644 index 000000000..65d22539c --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-request.json @@ -0,0 +1,52 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/media-buy/get-reporting-status-request.json", + "title": "Get Reporting Status Request", + "x-status": "experimental", + "x-tool-summary": "Check reporting health, enumerate expected periods and all retained revisions, or resolve one exact reporting revision.", + "description": "Authoritative caller/account-isolated reporting reliability read. The authenticated caller identity comes only from transport authentication, never request fields. summary answers the operational question for independently selected delivery configurations/feeds; periods returns a cursor-paginated obligation ledger; revision resolves one exact retained revision and its materializations/resources. Unknown, unauthorized, cross-caller, and cross-account identifiers MUST be indistinguishable. Sellers implementing this task MUST advertise media_buy.reporting_delivery in experimental_features.", + "type": "object", + "allOf": [ + { "$ref": "/schemas/core/version-envelope.json" }, + { + "if": { "properties": { "view": { "const": "summary" } }, "required": ["view"] }, + "then": { "not": { "anyOf": [{ "required": ["reporting_revision_id"] }, { "required": ["pagination"] }, { "required": ["health"] }] } } + }, + { + "if": { "properties": { "view": { "const": "periods" } }, "required": ["view"] }, + "then": { "not": { "required": ["reporting_revision_id"] } } + }, + { + "if": { "properties": { "view": { "const": "revision" } }, "required": ["view"] }, + "then": { + "required": ["reporting_revision_id"], + "not": { "anyOf": [{ "required": ["media_buy_ids"] }, { "required": ["delivery_config_ids"] }, { "required": ["feed_purposes"] }, { "required": ["period"] }, { "required": ["health"] }, { "required": ["finality"] }] } + } + } + ], + "x-mutates-state": false, + "properties": { + "account": { "$ref": "/schemas/core/canonical-account-ref.json", "description": "Account whose caller-owned reporting status is queried." }, + "view": { "type": "string", "enum": ["summary", "periods", "revision"], "description": "Stable response-shape discriminator. SDK convenience methods may default this to summary, but the wire request is explicit." }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "minItems": 1, "maxItems": 100, "uniqueItems": true, "description": "Optional summary/periods scope. Omit for every accessible media buy in the account." }, + "delivery_config_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]{1,64}$", "x-entity": "reporting_delivery_config" }, "minItems": 1, "maxItems": 16, "uniqueItems": true, "description": "Optional summary/periods scope. Use to reconcile billing, analytics, and pacing independently. Omit for every active caller-owned configuration." }, + "feed_purposes": { "type": "array", "items": { "type": "string", "enum": ["pacing", "analytics", "billing"] }, "minItems": 1, "uniqueItems": true, "description": "Optional summary/periods feed filter. The response echoes exact resolved configuration generations so this never creates an opaque aggregate." }, + "period": { + "type": "object", + "description": "Half-open summary/periods horizon. Omit for the seller's documented operational default horizon; the response always echoes the evaluated scope.", + "properties": { + "start": { "type": "string", "format": "date-time" }, + "end": { "type": "string", "format": "date-time" } + }, + "required": ["start", "end"], + "additionalProperties": false + }, + "health": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-health.json" }, "minItems": 1, "uniqueItems": true, "description": "Periods-view result filter only; it never changes summary health." }, + "finality": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "minItems": 1, "uniqueItems": true }, + "reporting_revision_id": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{1,255}$", "x-entity": "reporting_revision", "description": "Exact retained revision to resolve in revision view." }, + "pagination": { "$ref": "/schemas/core/pagination-request.json", "description": "Periods or revision-view pagination. Cursors are bound to the authenticated caller, account, filters, and ledger snapshot." }, + "context": { "$ref": "/schemas/core/context.json" }, + "ext": { "$ref": "/schemas/core/ext.json" } + }, + "required": ["account", "view"] +} diff --git a/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-response.json b/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-response.json new file mode 100644 index 000000000..2d52c62fb --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/media-buy/get-reporting-status-response.json @@ -0,0 +1,218 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/media-buy/get-reporting-status-response.json", + "title": "Get Reporting Status Response", + "x-status": "experimental", + "description": "Authoritative caller/account-isolated reporting status response. The view echoes the request and discriminates summary, periods, exact revision, and fatal error shapes. Every identifier, cursor, ledger snapshot, destination, revision, materialization, and resource is scoped to the authenticated caller and account.", + "type": "object", + "allOf": [ + { "$ref": "/schemas/core/version-envelope.json" }, + { "$ref": "/schemas/core/protocol-envelope.json" }, + { + "if": { "properties": { "health": { "const": "complete" } }, "required": ["health"] }, + "then": { + "properties": { "scope": { "properties": { "scope_closed": { "const": true }, "coverage_complete": { "const": true } }, "required": ["scope_closed", "coverage_complete"] } }, + "not": { "required": ["next_expected_at"] } + } + }, + { + "if": { "properties": { "health": { "const": "action_required" } }, "required": ["health"] }, + "then": { "properties": { "issues": { "minItems": 1, "contains": { "properties": { "severity": { "const": "action_required" } }, "required": ["severity"] } } }, "required": ["issues"] } + }, + { + "if": { "properties": { "health": { "const": "delayed" } }, "required": ["health"] }, + "then": { "properties": { "issues": { "minItems": 1, "items": { "properties": { "severity": { "const": "delayed" } } } } }, "required": ["issues"] } + }, + { + "if": { "properties": { "health": { "enum": ["healthy", "waiting", "complete"] } }, "required": ["health"] }, + "then": { "properties": { "issues": { "maxItems": 0 } }, "required": ["issues"] } + }, + { + "if": { "properties": { "scope": { "properties": { "coverage_complete": { "const": false } }, "required": ["coverage_complete"] } }, "required": ["scope"] }, + "then": { + "properties": { + "health": { "const": "action_required" }, + "issues": { + "minItems": 1, + "contains": { "properties": { "code": { "const": "HISTORY_UNAVAILABLE" }, "severity": { "const": "action_required" } }, "required": ["code", "severity"] } + } + }, + "required": ["issues"] + } + } + ], + "properties": { + "view": { "type": "string", "enum": ["summary", "periods", "revision"] }, + "ledger_snapshot_id": { "type": "string", "minLength": 1, "maxLength": 255, "description": "Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value." }, + "ledger_as_of": { "type": "string", "format": "date-time", "description": "Exclusive observation boundary for ledger_snapshot_id. Revisions committed later appear only in a later reconciliation." }, + "account_id": { "type": "string", "minLength": 1, "x-entity": "account", "description": "Resolved seller/storefront account identifier." }, + "scope": { + "type": "object", + "description": "Exact denominator evaluated for summary or periods health. complete is valid only when scope_closed is true.", + "properties": { + "period_start": { "type": "string", "format": "date-time" }, + "period_end": { "type": "string", "format": "date-time" }, + "scope_closed": { "type": "boolean", "description": "True only when no new obligation can enter this evaluated scope." }, + "media_buy_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "x-entity": "media_buy" }, "uniqueItems": true }, + "all_accessible_media_buys": { "type": "boolean", "description": "True when media_buy_ids was omitted and the scope covers all caller-accessible account buys." }, + "delivery_config_generations": { + "type": "array", + "description": "Exact independently reconciled configuration generations in the denominator.", + "items": { + "type": "object", + "properties": { + "delivery_config_id": { "type": "string", "minLength": 1, "maxLength": 64, "x-entity": "reporting_delivery_config" }, + "delivery_config_version": { "type": "integer", "minimum": 1 }, + "feed_purpose": { "type": "string", "enum": ["pacing", "analytics", "billing"] } + }, + "required": ["delivery_config_id", "delivery_config_version", "feed_purpose"], + "additionalProperties": false + }, + "uniqueItems": true + }, + "feed_purposes": { "type": "array", "items": { "type": "string", "enum": ["pacing", "analytics", "billing"] }, "uniqueItems": true }, + "finality": { "type": "array", "items": { "$ref": "/schemas/enums/reporting-finality.json" }, "uniqueItems": true }, + "ledger_retained_from": { "type": "string", "format": "date-time", "description": "Earliest period boundary for which anti-entropy metadata is retained for every selected configuration generation." }, + "coverage_complete": { "type": "boolean", "description": "Whether the requested horizon is fully inside retained ledger coverage. False means health cannot prove completeness for the whole requested horizon." } + }, + "required": ["period_start", "period_end", "scope_closed", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"], + "allOf": [ + { + "if": { "properties": { "all_accessible_media_buys": { "const": false } }, "required": ["all_accessible_media_buys"] }, + "then": { "required": ["media_buy_ids"] } + } + ], + "additionalProperties": false + }, + "health": { "$ref": "/schemas/enums/reporting-health.json" }, + "coverage": { "$ref": "/schemas/core/reporting-coverage.json", "description": "Aggregated effective coverage for the exact selected scope. This remains independent of reporting health and finality so a fresh covered subset cannot look like complete campaign reporting." }, + "data_through": { "type": ["string", "null"], "format": "date-time", "description": "Conservative latest included event time across satisfied obligations in scope, or null when unavailable/unknown." }, + "next_expected_at": { "type": "string", "format": "date-time", "description": "Next obligation due time for an open scope. Omitted for a closed complete scope." }, + "obligation_counts": { + "type": "object", + "properties": { + "total": { "type": "integer", "minimum": 0 }, + "waiting": { "type": "integer", "minimum": 0 }, + "healthy": { "type": "integer", "minimum": 0 }, + "delayed": { "type": "integer", "minimum": 0 }, + "action_required": { "type": "integer", "minimum": 0 }, + "complete": { "type": "integer", "minimum": 0 } + }, + "required": ["total", "waiting", "healthy", "delayed", "action_required", "complete"], + "additionalProperties": false + }, + "issues": { "type": "array", "items": { "$ref": "/schemas/core/reporting-status-issue.json" } }, + "periods": { "type": "array", "items": { "$ref": "/schemas/core/reporting-obligation.json" } }, + "revisions": { "type": "array", "items": { "$ref": "/schemas/core/reporting-revision.json" }, "description": "Revision ledger records on this page. Pagination is over the flat union of obligations, revisions, materializations, and receipts, avoiding unbounded nested history." }, + "pagination": { "$ref": "/schemas/core/pagination-response.json" }, + "revision": { "$ref": "/schemas/core/reporting-revision.json" }, + "materializations": { "type": "array", "items": { "$ref": "/schemas/core/reporting-materialization.json" } }, + "receipts": { "type": "array", "items": { "$ref": "/schemas/core/reporting-receipt.json" }, "description": "Authenticated caller's durable reconciliation receipts. Receipts from another consumer principal are never disclosed." }, + "errors": { "type": "array", "items": { "$ref": "/schemas/core/error.json" } }, + "context": { "$ref": "/schemas/core/context.json" }, + "ext": { "$ref": "/schemas/core/ext.json" } + }, + "oneOf": [ + { + "title": "Successful lookup", + "properties": { "status": { "type": "string", "const": "completed" } }, + "required": ["status"], + "oneOf": [ + { + "title": "Summary view", + "properties": { "view": { "type": "string", "const": "summary" } }, + "required": ["view", "ledger_snapshot_id", "ledger_as_of", "account_id", "scope", "health", "coverage", "data_through", "obligation_counts", "issues"], + "not": { "anyOf": [{ "required": ["periods"] }, { "required": ["revisions"] }, { "required": ["pagination"] }, { "required": ["revision"] }, { "required": ["materializations"] }, { "required": ["receipts"] }] } + }, + { + "title": "Periods view", + "properties": { "view": { "type": "string", "const": "periods" }, "pagination": { "required": ["has_more", "total_count"] } }, + "required": ["view", "ledger_snapshot_id", "ledger_as_of", "account_id", "scope", "periods", "revisions", "materializations", "receipts", "pagination"], + "not": { "required": ["revision"] } + }, + { + "title": "Revision view", + "properties": { "view": { "type": "string", "const": "revision" }, "pagination": { "required": ["has_more", "total_count"] } }, + "required": ["view", "ledger_snapshot_id", "ledger_as_of", "account_id", "revision", "materializations", "receipts", "pagination"], + "not": { "anyOf": [{ "required": ["scope"] }, { "required": ["health"] }, { "required": ["periods"] }, { "required": ["revisions"] }] } + } + ] + }, + { + "title": "Failed lookup", + "properties": { "status": { "type": "string", "const": "failed" } }, + "required": ["status"], + "oneOf": [ + { + "title": "Unavailable lookup", + "type": "object", + "properties": { + "adcp_version": { "type": "string" }, + "adcp_major_version": { "type": "integer" }, + "status": { "type": "string", "const": "failed" }, + "view": { "enum": ["summary", "periods", "revision"] }, + "failure_kind": { "type": "string", "const": "lookup_unavailable" }, + "context_id": { "type": "string" }, + "context": { "$ref": "/schemas/core/context.json" }, + "message": { "const": "Reporting status resource is unavailable." }, + "timestamp": { "type": "string", "format": "date-time" }, + "replayed": { "type": "boolean" }, + "adcp_error": { + "type": "object", + "properties": { + "code": { "const": "NOT_FOUND" }, + "message": { "const": "Reporting status resource is unavailable." } + }, + "required": ["code", "message"], + "additionalProperties": false + }, + "errors": { + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { + "type": "object", + "properties": { + "code": { "const": "NOT_FOUND" }, + "message": { "const": "Reporting status resource is unavailable." } + }, + "required": ["code", "message"], + "additionalProperties": false + } + } + }, + "required": ["status", "view", "failure_kind", "errors"], + "additionalProperties": false + }, + { + "title": "Operational failure", + "type": "object", + "properties": { + "adcp_version": { "type": "string" }, + "adcp_major_version": { "type": "integer" }, + "status": { "type": "string", "const": "failed" }, + "view": { "enum": ["summary", "periods", "revision"] }, + "failure_kind": { "type": "string", "const": "operational" }, + "context_id": { "type": "string" }, + "context": { "$ref": "/schemas/core/context.json" }, + "message": { "type": "string" }, + "timestamp": { "type": "string", "format": "date-time" }, + "replayed": { "type": "boolean" }, + "adcp_error": { "$ref": "/schemas/core/error.json" }, + "errors": { "type": "array", "items": { "$ref": "/schemas/core/error.json" }, "minItems": 1 } + }, + "required": ["status", "view", "failure_kind", "errors"], + "additionalProperties": false + } + ] + } + ], + "x-adcp-validation": { + "caller_isolation": "Derive caller identity only from authenticated transport. Every account, configuration generation, cursor, ledger snapshot, revision, materialization, resource, and destination must belong to that caller/account; unknown and unauthorized identifiers must use the identical lookup_unavailable shape. operational failures MUST NOT be used for identifier resolution or authorization failures.", + "empty_scope": "After the caller intentionally applies reporting_delivery_configs: [], or before it creates any configuration, an unfiltered account has no caller-owned reporting configuration generations. delivery_config_generations, feed_purposes, and finality MUST all be empty; obligation counts and every periods-view record array MUST be empty; data_through MUST be null. This is a valid vacuously complete closed scope, not an inaccessible-identifier signal. A request naming an unknown or unauthorized delivery_config_id still uses lookup_unavailable.", + "snapshot_consistency": "All pages reached from a cursor MUST preserve ledger_snapshot_id and ledger_as_of. A cursor is unusable by another caller or account.", + "resource_retention": "A complete obligation must retain at least one readable verified exact materialization through its resource_retained_until. Metadata retention does not imply resource readability after that boundary.", + "coverage_aggregation": "Summary coverage is full only when every selected obligation is full. It is partial when the selected scope contains both covered and unsupported/unknown packages, none when nothing is covered and support is known absent, and unknown when nothing is covered and any applicability remains unknown. Delivery health is computed separately. Covered-subset metrics MUST NOT be presented as complete totals for the selected media-buy scope." + }, + "additionalProperties": true +} diff --git a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json b/schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-request.json similarity index 54% rename from schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json rename to schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-request.json index 5941bc487..10094a4ef 100644 --- a/schemas/cache/3.2.0-beta.6/media-buy/sync-reporting-receipts-request.json +++ b/schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-request.json @@ -1,66 +1,37 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/media-buy/sync-reporting-receipts-request.json", "title": "Sync Reporting Receipts Request", "x-status": "experimental", "x-tool-summary": "Record a consumer's independently verified reporting totals and destination evidence in the seller ledger.", "description": "Submit durable authenticated consumer reconciliation results for reporting materializations. This is a batched idempotent upsert, not an acknowledgement of mere webhook receipt. Identity comes from authenticated transport; the request MUST NOT assert a buyer or governance principal.", "type": "object", "allOf": [ - { - "$ref": "../core/version-envelope.json" - } + { "$ref": "/schemas/core/version-envelope.json" } ], "properties": { - "adcp_version": { - "$ref": "../core/version-envelope.json#/properties/adcp_version" - }, - "adcp_major_version": { - "$ref": "../core/version-envelope.json#/properties/adcp_major_version" - }, - "account": { - "$ref": "../core/canonical-account-ref.json" - }, - "idempotency_key": { - "type": "string", - "minLength": 16, - "maxLength": 255, - "pattern": "^[A-Za-z0-9_.:-]{16,255}$", - "description": "Client-generated batch key. Exact retries reuse the key and body." - }, + "adcp_version": { "$ref": "/schemas/core/version-envelope.json#/properties/adcp_version" }, + "adcp_major_version": { "$ref": "/schemas/core/version-envelope.json#/properties/adcp_major_version" }, + "account": { "$ref": "/schemas/core/canonical-account-ref.json" }, + "idempotency_key": { "type": "string", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$", "description": "Client-generated batch key. Exact retries reuse the key and body." }, "receipts": { "type": "array", "items": { "allOf": [ - { - "$ref": "../core/reporting-receipt.json" - }, - { - "not": { - "required": [ - "received_at" - ] - } - } + { "$ref": "/schemas/core/reporting-receipt.json" }, + { "not": { "required": ["received_at"] } } ] }, "minItems": 1, "maxItems": 100 }, - "context": { - "$ref": "../core/context.json" - }, - "ext": { - "$ref": "../core/ext.json" - } + "context": { "$ref": "/schemas/core/context.json" }, + "ext": { "$ref": "/schemas/core/ext.json" } }, - "required": [ - "account", - "idempotency_key", - "receipts" - ], + "required": ["account", "idempotency_key", "receipts"], "x-adcp-validation": { "batch_identity": "reporting_receipt_id values MUST be unique within the batch. Every referenced obligation, revision, and materialization MUST resolve within the authenticated caller and account or fail with an indistinguishable unavailable result.", "partial_results": "Each receipt is independent. One failed result does not roll back successfully recorded receipts; retries use the same receipt IDs and content." }, - "additionalProperties": false -} \ No newline at end of file + "additionalProperties": true +} diff --git a/schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-response.json b/schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-response.json new file mode 100644 index 000000000..d9d46aca4 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/media-buy/sync-reporting-receipts-response.json @@ -0,0 +1,69 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/media-buy/sync-reporting-receipts-response.json", + "title": "Sync Reporting Receipts Response", + "x-status": "experimental", + "description": "Per-receipt durable recording results. Successful readback lets a consumer prove the seller recorded its reconciliation outcome; failed results expose no cross-caller or cross-account resource metadata.", + "type": "object", + "allOf": [ + { "$ref": "/schemas/core/version-envelope.json" }, + { "$ref": "/schemas/core/protocol-envelope.json" } + ], + "properties": { + "status": { "type": "string", "const": "completed", "description": "Receipt batches complete synchronously with one result per submitted receipt." }, + "results": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "Recorded reporting receipt", + "type": "object", + "properties": { + "result": { "type": "string", "const": "recorded" }, + "receipt": { + "allOf": [ + { "$ref": "/schemas/core/reporting-receipt.json" }, + { "required": ["received_at"] } + ] + } + }, + "required": ["result", "receipt"], + "additionalProperties": false + }, + { + "title": "Unchanged reporting receipt", + "type": "object", + "properties": { + "result": { "type": "string", "const": "unchanged" }, + "receipt": { + "allOf": [ + { "$ref": "/schemas/core/reporting-receipt.json" }, + { "required": ["received_at"] } + ] + } + }, + "required": ["result", "receipt"], + "additionalProperties": false + }, + { + "title": "Failed reporting receipt", + "type": "object", + "properties": { + "result": { "type": "string", "const": "failed" }, + "reporting_receipt_id": { "type": "string", "minLength": 16, "maxLength": 255, "pattern": "^[A-Za-z0-9_.:-]{16,255}$", "x-entity": "reporting_receipt" }, + "errors": { "type": "array", "items": { "$ref": "/schemas/core/error.json" }, "minItems": 1, "maxItems": 16 } + }, + "required": ["result", "reporting_receipt_id", "errors"], + "additionalProperties": false + } + ] + }, + "minItems": 1, + "maxItems": 100 + }, + "context": { "$ref": "/schemas/core/context.json" }, + "ext": { "$ref": "/schemas/core/ext.json" } + }, + "required": ["status", "results"], + "additionalProperties": true +} diff --git a/schemas/cache/3.2.0-beta.9/protocol/get-adcp-capabilities-response.json b/schemas/cache/3.2.0-beta.9/protocol/get-adcp-capabilities-response.json index 7821c10c9..f5a1e7ad2 100644 --- a/schemas/cache/3.2.0-beta.9/protocol/get-adcp-capabilities-response.json +++ b/schemas/cache/3.2.0-beta.9/protocol/get-adcp-capabilities-response.json @@ -1,87 +1,202 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/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", "allOf": [ { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/version-envelope.json" + "$ref": "/schemas/core/version-envelope.json" }, { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/protocol-envelope.json" + "$ref": "/schemas/core/protocol-envelope.json" }, { "if": { - "required": [ - "measurement_gateway" - ] + "required": ["measurement_gateway"] }, "then": { "properties": { "supported_protocols": { - "contains": { - "const": "measurement" - } + "contains": { "const": "measurement" } }, "experimental_features": { - "contains": { - "const": "measurement.gateway" - } + "contains": { "const": "measurement.gateway" } } }, - "required": [ - "experimental_features" - ] + "required": ["experimental_features"] } }, { "if": { - "required": [ - "measurement" - ] + "required": ["measurement"] }, "then": { "properties": { "supported_protocols": { - "contains": { - "const": "measurement" - } + "contains": { "const": "measurement" } }, "experimental_features": { - "contains": { - "const": "measurement.core" - } + "contains": { "const": "measurement.core" } } }, - "required": [ - "experimental_features" - ] + "required": ["experimental_features"] } }, { "if": { "properties": { "media_buy": { - "required": [ - "performance_feedback" - ] + "required": ["performance_feedback"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { "properties": { "experimental_features": { - "contains": { - "const": "measurement.core" - } + "contains": { "const": "measurement.core" } } }, - "required": [ - "experimental_features" - ] + "required": ["experimental_features"] + } + }, + { + "if": { + "properties": { + "adcp": { + "required": ["agent_configuration"] + } + }, + "required": ["adcp"] + }, + "then": { + "properties": { + "experimental_features": { + "contains": { "const": "protocol.agent_configuration" } + } + }, + "required": ["experimental_features"] + } + }, + { + "if": { + "properties": { + "adcp": { + "properties": { + "agent_configuration": { + "properties": { + "supported_sections": { + "contains": { "const": "notification_configs" } + } + }, + "required": ["supported_sections"] + } + }, + "required": ["agent_configuration"] + } + }, + "required": ["adcp"] + }, + "then": { + "properties": { + "adcp": { + "properties": { + "capability_changes": { + "properties": { + "notifications": { + "properties": { + "supported": { "const": true }, + "registration_task": { "const": "sync_agent_configuration" } + }, + "required": ["supported", "registration_task"] + } + }, + "required": ["notifications"] + } + }, + "required": ["capability_changes"] + } + } + } + }, + { + "if": { + "properties": { + "adcp": { + "properties": { + "capability_changes": { + "properties": { + "notifications": { + "properties": { + "registration_task": { "const": "sync_agent_configuration" } + }, + "required": ["registration_task"] + } + }, + "required": ["notifications"] + } + }, + "required": ["capability_changes"] + } + }, + "required": ["adcp"] + }, + "then": { + "properties": { + "adcp": { + "properties": { + "agent_configuration": { + "properties": { + "supported_sections": { + "contains": { "const": "notification_configs" } + } + }, + "required": ["supported_sections"] + } + }, + "required": ["agent_configuration"] + } + } + } + }, + { + "if": { + "properties": { + "media_buy": { + "required": ["reporting_delivery"] + } + }, + "required": ["media_buy"] + }, + "then": { + "properties": { + "experimental_features": { + "contains": { "const": "media_buy.reporting_delivery" } + } + }, + "required": ["experimental_features"] + } + }, + { + "if": { + "properties": { + "media_buy": { + "required": ["reporting_delivery"] + } + }, + "required": ["media_buy"] + }, + "then": { + "required": ["webhook_signing"], + "properties": { + "webhook_signing": { + "properties": { + "supported": { "const": true } + }, + "required": ["supported", "profile", "algorithms", "legacy_hmac_fallback"] + } + } } }, { @@ -90,31 +205,21 @@ "media_buy": { "properties": { "audience_targeting": { - "required": [ - "supported_activation_methods" - ] + "required": ["supported_activation_methods"] } }, - "required": [ - "audience_targeting" - ] + "required": ["audience_targeting"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { "properties": { "experimental_features": { - "contains": { - "const": "media_buy.audience_activation" - } + "contains": { "const": "media_buy.audience_activation" } } }, - "required": [ - "experimental_features" - ] + "required": ["experimental_features"] } }, { @@ -128,14 +233,10 @@ "const": true } }, - "required": [ - "supported" - ] + "required": ["supported"] } }, - "required": [ - "request_signing" - ] + "required": ["request_signing"] }, { "anyOf": [ @@ -146,9 +247,7 @@ "pattern": "^(?:3\\.(?:[2-9]|[1-9][0-9]+)|(?:[4-9]|[1-9][0-9]+)\\.\\d+)(?:-[a-zA-Z0-9.-]+)?$" } }, - "required": [ - "adcp_version" - ] + "required": ["adcp_version"] }, { "properties": { @@ -161,14 +260,10 @@ } } }, - "required": [ - "supported_versions" - ] + "required": ["supported_versions"] } }, - "required": [ - "adcp" - ] + "required": ["adcp"] } ] } @@ -182,9 +277,7 @@ "const": "required" } }, - "required": [ - "covers_content_digest" - ] + "required": ["covers_content_digest"] } } } @@ -193,21 +286,15 @@ "if": { "properties": { "governance": { - "required": [ - "runtime_attestations" - ] + "required": ["runtime_attestations"] } }, - "required": [ - "governance" - ] + "required": ["governance"] }, "then": { "properties": { "adcp": { - "required": [ - "attestations" - ] + "required": ["attestations"] } } } @@ -223,26 +310,18 @@ "const": true } }, - "required": [ - "supports_attestation_evaluation" - ] + "required": ["supports_attestation_evaluation"] } }, - "required": [ - "audience_evidence" - ] + "required": ["audience_evidence"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { "properties": { "adcp": { - "required": [ - "attestations" - ] + "required": ["attestations"] } } } @@ -251,14 +330,10 @@ "if": { "properties": { "media_buy": { - "required": [ - "rights_attestations" - ] + "required": ["rights_attestations"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { "properties": { @@ -274,9 +349,7 @@ } } }, - "required": [ - "attestations" - ] + "required": ["attestations"] } } } @@ -285,19 +358,13 @@ "if": { "properties": { "media_buy": { - "required": [ - "relationship_notifications" - ] + "required": ["relationship_notifications"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { - "required": [ - "webhook_signing" - ], + "required": ["webhook_signing"], "properties": { "webhook_signing": { "properties": { @@ -305,12 +372,7 @@ "const": true } }, - "required": [ - "supported", - "profile", - "algorithms", - "legacy_hmac_fallback" - ] + "required": ["supported", "profile", "algorithms", "legacy_hmac_fallback"] } } } @@ -323,36 +385,24 @@ "relationship_notifications": { "properties": { "projection_tasks": { - "contains": { - "const": "list_creatives" - } + "contains": { "const": "list_creatives" } } }, - "required": [ - "projection_tasks" - ] + "required": ["projection_tasks"] } }, - "required": [ - "relationship_notifications" - ] + "required": ["relationship_notifications"] } }, - "required": [ - "media_buy" - ] + "required": ["media_buy"] }, "then": { "properties": { "supported_protocols": { - "contains": { - "const": "creative" - } + "contains": { "const": "creative" } } }, - "required": [ - "supported_protocols" - ] + "required": ["supported_protocols"] } } ], @@ -373,29 +423,17 @@ }, "supported_versions": { "type": "array", - "description": "Release-precision (VERSION.RELEASE) AdCP versions this seller speaks. Authoritative for buyer-side release pinning \u2014 buyers SHOULD declare `adcp_version` (release-precision string) on each request. Sellers downshift to the highest supported release \u2264 the buyer's pin within the same major; cross-major mismatch returns VERSION_UNSUPPORTED. Pre-release tags (e.g. `\"3.1-beta\"`) hang off release.", + "description": "Release-precision (VERSION.RELEASE) AdCP versions this seller speaks. Authoritative for buyer-side release pinning — buyers SHOULD declare `adcp_version` (release-precision string) on each request. Sellers downshift to the highest supported release ≤ the buyer's pin within the same major; cross-major mismatch returns VERSION_UNSUPPORTED. Pre-release tags (e.g. `\"3.1-beta\"`) hang off release.", "items": { "type": "string", "pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$" }, "minItems": 1, - "examples": [ - [ - "3.0" - ], - [ - "3.0", - "3.1" - ], - [ - "3.0", - "3.1-beta" - ] - ] + "examples": [["3.0"], ["3.0", "3.1"], ["3.0", "3.1-beta"]] }, "build_version": { "type": "string", - "description": "Optional advisory metadata: full semver build identifier of the seller's deployment \u2014 MAJOR.MINOR.PATCH plus optional pre-release and build-metadata segments per semver \u00a79\u2013\u00a710. Patches are not part of the wire contract \u2014 semver patch by definition introduces no contract change \u2014 but surfacing the build helps buyers triage incidents and bug reports against a specific seller deployment lineage. Buyers MUST NOT use this field for negotiation; use `supported_versions` (release-precision) instead.", + "description": "Optional advisory metadata: full semver build identifier of the seller's deployment — MAJOR.MINOR.PATCH plus optional pre-release and build-metadata segments per semver §9–§10. Patches are not part of the wire contract — semver patch by definition introduces no contract change — but surfacing the build helps buyers triage incidents and bug reports against a specific seller deployment lineage. Buyers MUST NOT use this field for negotiation; use `supported_versions` (release-precision) instead.", "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$", "examples": [ "3.0.1", @@ -407,7 +445,7 @@ }, "idempotency": { "type": "object", - "description": "Idempotency semantics for mutating requests. Sellers MUST declare whether they honor idempotency_key replay protection so buyers can reason about safe retry behavior. Modeled as a discriminated union on the supported boolean so that code generators produce two named types (IdempotencySupported, IdempotencyUnsupported) with the replay_ttl_seconds invariant enforced at the type level \u2014 draft-07 if/then would be dropped by most generators (openapi-typescript, zod-to-json-schema, datamodel-code-generator pre-0.25, quicktype). 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 whether they honor idempotency_key replay protection so buyers can reason about safe retry behavior. Modeled as a discriminated union on the supported boolean so that code generators produce two named types (IdempotencySupported, IdempotencyUnsupported) with the replay_ttl_seconds invariant enforced at the type level — draft-07 if/then would be dropped by most generators (openapi-typescript, zod-to-json-schema, datamodel-code-generator pre-0.25, quicktype). Clients MUST NOT assume a default — a seller without this declaration is non-compliant and should be treated as unsafe for retry-sensitive operations.", "oneOf": [ { "title": "IdempotencySupported", @@ -415,60 +453,107 @@ "properties": { "supported": { "const": true, - "description": "Discriminator. True means the seller deduplicates replays \u2014 a repeat of the same idempotency_key within replay_ttl_seconds returns the cached response without re-executing side effects." + "description": "Discriminator. True means the seller deduplicates replays — a repeat of the same idempotency_key within replay_ttl_seconds returns the cached response without re-executing side effects." }, "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 }, "in_flight_max_seconds": { "type": "integer", - "description": "Maximum lifetime in seconds of an in-flight idempotency row before the seller releases it per L1/security.mdx rule 9 (treat the in-flight attempt as failed if the handler does not complete within this bound). Buyer SDKs use this value to compute a retry budget when they see `IDEMPOTENCY_IN_FLIGHT` \u2014 cap individual retry waits at this value rather than the much-wider `replay_ttl_seconds` ceiling. Optional in 3.1 (additive declaration); SDKs that don't see the field fall back to rule 9's order-of-magnitude SHOULD heuristic. Required when `supported: true` in 4.0. MUST be no greater than `replay_ttl_seconds` (a bound larger than the replay window is vacuous \u2014 any retry past the TTL hits IDEMPOTENCY_EXPIRED regardless of in-flight state); validators MUST enforce this cross-field constraint at the test layer since JSON Schema cannot express field-relative bounds. A buyer that observes top-level `error.retry_after` exceeding this value MAY treat that as a seller bug \u2014 the in-flight row cannot legitimately outlive the bound the seller declared.", + "description": "Maximum lifetime in seconds of an in-flight idempotency row before the seller releases it per L1/security.mdx rule 9 (treat the in-flight attempt as failed if the handler does not complete within this bound). Buyer SDKs use this value to compute a retry budget when they see `IDEMPOTENCY_IN_FLIGHT` — cap individual retry waits at this value rather than the much-wider `replay_ttl_seconds` ceiling. Optional in 3.1 (additive declaration); SDKs that don't see the field fall back to rule 9's order-of-magnitude SHOULD heuristic. Required when `supported: true` in 4.0. MUST be no greater than `replay_ttl_seconds` (a bound larger than the replay window is vacuous — any retry past the TTL hits IDEMPOTENCY_EXPIRED regardless of in-flight state); validators MUST enforce this cross-field constraint at the test layer since JSON Schema cannot express field-relative bounds. A buyer that observes top-level `error.retry_after` exceeding this value MAY treat that as a seller bug — the in-flight row cannot legitimately outlive the bound the seller declared.", "minimum": 1, "maximum": 604800 }, "account_id_is_opaque": { "type": "boolean", - "description": "When true, the seller derives `account_id` via an HKDF-based one-way transform of the buyer's natural account key rather than echoing the natural key on the wire. Buyers MUST NOT attempt to invert the opaque id and MUST treat it as a blind handle scoped to this seller. Absent or false, callers should assume `account_id` is the natural key (or a server-assigned but non-opaque id). This flag does not change the wire shape, but it DOES change buyer behavior \u2014 buyers MUST NOT cache, log, or treat `account_id` as a natural-key analog when this flag is true. Migration note for sellers already returning an opaque id without this flag: set it to true at the next capabilities refresh so buyers stop inferring natural-key semantics; until set, new-buyer replay/retry logic will misclassify these ids as natural keys.", + "description": "When true, the seller derives `account_id` via an HKDF-based one-way transform of the buyer's natural account key rather than echoing the natural key on the wire. Buyers MUST NOT attempt to invert the opaque id and MUST treat it as a blind handle scoped to this seller. Absent or false, callers should assume `account_id` is the natural key (or a server-assigned but non-opaque id). This flag does not change the wire shape, but it DOES change buyer behavior — buyers MUST NOT cache, log, or treat `account_id` as a natural-key analog when this flag is true. Migration note for sellers already returning an opaque id without this flag: set it to true at the next capabilities refresh so buyers stop inferring natural-key semantics; until set, new-buyer replay/retry logic will misclassify these ids as natural keys.", "default": false } }, - "required": [ - "supported", - "replay_ttl_seconds" - ] + "required": ["supported", "replay_ttl_seconds"] }, { "title": "IdempotencyUnsupported", - "description": "Seller does NOT honor idempotency_key replay protection \u2014 sending a key is a no-op, the seller will NOT return IDEMPOTENCY_CONFLICT or IDEMPOTENCY_EXPIRED, and a naive retry WILL double-process. Buyers MUST use natural-key checks (e.g., get_media_buys plus request context such as context.internal_campaign_id or package context such as context.buyer_ref) before retrying spend-committing operations against this seller. replay_ttl_seconds and in_flight_max_seconds MUST be absent \u2014 they have no meaning without replay support.", + "description": "Seller does NOT honor idempotency_key replay protection — sending a key is a no-op, the seller will NOT return IDEMPOTENCY_CONFLICT or IDEMPOTENCY_EXPIRED, and a naive retry WILL double-process. Buyers MUST use natural-key checks (e.g., get_media_buys plus request context such as context.internal_campaign_id or package context such as context.buyer_ref) before retrying spend-committing operations against this seller. replay_ttl_seconds and in_flight_max_seconds MUST be absent — they have no meaning without replay support.", "properties": { "supported": { "const": false, "description": "Discriminator. False means the seller does not deduplicate retries." } }, - "required": [ - "supported" - ], + "required": ["supported"], "not": { "anyOf": [ { - "required": [ - "replay_ttl_seconds" - ] + "required": ["replay_ttl_seconds"] }, { - "required": [ - "in_flight_max_seconds" - ] + "required": ["in_flight_max_seconds"] } ] } } ] }, + "agent_configuration": { + "type": "object", + "x-status": "experimental", + "description": "Caller-scoped durable connection configuration accepted by this agent. This is the buyer-to-seller configuration half of negotiation, not a second seller capability document: the seller advertises objective support here, while each authenticated caller submits its desired webhooks and reusable destinations through sync_agent_configuration. Per-account authority and feed selection remain in account/reporting configuration. Sellers exposing this block MUST list protocol.agent_configuration in experimental_features.", + "properties": { + "supported": { + "type": "boolean", + "const": true + }, + "sync_task": { + "type": "string", + "const": "sync_agent_configuration" + }, + "supported_sections": { + "type": "array", + "items": { + "type": "string", + "enum": ["notification_configs", "reporting_destinations"] + }, + "minItems": 1, + "uniqueItems": true, + "description": "Connection configuration sections this seller accepts. Unsupported sections are rejected rather than silently ignored." + }, + "max_reporting_destinations": { + "type": "integer", + "minimum": 1, + "maximum": 64, + "description": "Maximum caller-scoped destination bindings when reporting_destinations is supported. The task schema has a portable maximum of 64; sellers may advertise a lower operational limit." + }, + "optimistic_concurrency": { + "type": "boolean", + "description": "Whether expected_configuration_version is enforced. Sellers SHOULD support it when several services may authenticate as the same stable principal." + } + }, + "required": ["supported", "sync_task", "supported_sections", "optimistic_concurrency"], + "allOf": [ + { + "if": { + "properties": { + "supported_sections": { + "contains": { "const": "reporting_destinations" } + } + }, + "required": ["supported_sections"] + }, + "then": { + "required": ["max_reporting_destinations"] + } + } + ], + "x-adcp-validation": { + "notification_registration": "When capability_changes.notifications.registration_task is sync_agent_configuration, supported_sections MUST contain notification_configs. Supporting notification_configs requires the same webhook signing, endpoint proof, and stable-principal controls as sync_agent_notification_configs.", + "task_presence": "The agent's MCP tools/list or A2A skill list MUST include sync_agent_configuration when this block is present." + }, + "additionalProperties": false + }, "capability_changes": { "type": "object", "description": "Freshness metadata and optional invalidation webhooks for this `get_adcp_capabilities` document. Buyers and registries MAY cache capabilities for up to `cache_ttl_seconds` when present, SHOULD compare `capabilities_version` across refreshes when present, and SHOULD re-run `get_adcp_capabilities` after receiving a `capabilities.changed` webhook. This block describes the agent-wide capability document, not per-caller authorization or account-scoped settings. A material capability change is any externally advertised contract change that can affect routing, validation, conformance coverage, task availability, auth/account handling, sandbox support, billing support, reporting delivery methods, creative-library support, targeting support, protocol versions, or other buyer-visible feature gates. Non-contract operational changes that do not alter the response body do not require a revision or webhook fire.", @@ -492,7 +577,7 @@ }, "notifications": { "type": "object", - "description": "Whether the seller supports agent-level capability-change webhooks. When supported, interested consumers register endpoint subscribers with `sync_agent_notification_configs`; each `capabilities.changed` fire is a small invalidation payload, and consumers repair by re-reading `get_adcp_capabilities`.", + "description": "Whether the seller supports agent-level capability-change webhooks. When supported, interested consumers register endpoint subscribers with the declared registration_task; sync_agent_configuration is preferred when the broader connection surface is available, while sync_agent_notification_configs remains the specialized compatibility task. Each capabilities.changed fire is a small invalidation payload, and consumers repair by re-reading get_adcp_capabilities.", "oneOf": [ { "title": "CapabilityChangeNotificationsSupported", @@ -500,11 +585,11 @@ "supported": { "type": "boolean", "const": true, - "description": "Discriminator. True means the seller accepts `sync_agent_notification_configs` for `capabilities.changed` subscriptions." + "description": "Discriminator. True means the seller accepts the declared registration_task for capabilities.changed subscriptions." }, "registration_task": { "type": "string", - "const": "sync_agent_notification_configs", + "enum": ["sync_agent_notification_configs", "sync_agent_configuration"], "description": "Task consumers call to manage their caller-scoped agent-level subscriber set." }, "event_types": { @@ -512,9 +597,7 @@ "description": "Agent-level notification types this seller can emit for capability changes. Currently only `capabilities.changed` is defined.", "items": { "type": "string", - "enum": [ - "capabilities.changed" - ] + "enum": ["capabilities.changed"] }, "minItems": 1, "uniqueItems": true @@ -526,11 +609,7 @@ "maximum": 86400 } }, - "required": [ - "supported", - "registration_task", - "event_types" - ], + "required": ["supported", "registration_task", "event_types"], "additionalProperties": true }, { @@ -542,20 +621,14 @@ "description": "Discriminator. False means consumers must rely on TTL refresh, manual refresh, or registry polling for capability changes." } }, - "required": [ - "supported" - ], + "required": ["supported"], "not": { "anyOf": [ { - "required": [ - "registration_task" - ] + "required": ["registration_task"] }, { - "required": [ - "event_types" - ] + "required": ["event_types"] } ] }, @@ -574,20 +647,13 @@ "const": true } }, - "required": [ - "supported" - ] + "required": ["supported"] } }, - "required": [ - "notifications" - ] + "required": ["notifications"] }, "then": { - "required": [ - "cache_ttl_seconds", - "capabilities_version" - ] + "required": ["cache_ttl_seconds", "capabilities_version"] } } ], @@ -607,234 +673,128 @@ "oneOf": [ { "properties": { - "task": { - "type": "string", - "const": "create_media_buy" - }, + "task": { "type": "string", "const": "create_media_buy" }, "modes": { "type": "array", - "items": { - "type": "string", - "enum": [ - "signed_context", - "online_execution_check" - ] - }, - "contains": { - "const": "signed_context" - }, + "items": { "type": "string", "enum": ["signed_context", "online_execution_check"] }, + "contains": { "const": "signed_context" }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "update_media_buy" - }, + "task": { "type": "string", "const": "update_media_buy" }, "modes": { "type": "array", - "items": { - "type": "string", - "enum": [ - "signed_context", - "online_execution_check" - ] - }, - "contains": { - "const": "signed_context" - }, + "items": { "type": "string", "enum": ["signed_context", "online_execution_check"] }, + "contains": { "const": "signed_context" }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "buy_products" - }, + "task": { "type": "string", "const": "buy_products" }, "modes": { "type": "array", - "items": { - "type": "string", - "enum": [ - "signed_context", - "online_execution_check" - ] - }, - "contains": { - "const": "signed_context" - }, + "items": { "type": "string", "enum": ["signed_context", "online_execution_check"] }, + "contains": { "const": "signed_context" }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "accept_proposal" - }, + "task": { "type": "string", "const": "accept_proposal" }, "modes": { "type": "array", - "items": { - "type": "string", - "enum": [ - "signed_context", - "online_execution_check" - ] - }, - "contains": { - "const": "signed_context" - }, + "items": { "type": "string", "enum": ["signed_context", "online_execution_check"] }, + "contains": { "const": "signed_context" }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "control_media_buy" - }, + "task": { "type": "string", "const": "control_media_buy" }, "modes": { "type": "array", - "items": { - "type": "string", - "enum": [ - "signed_context", - "online_execution_check" - ] - }, - "contains": { - "const": "signed_context" - }, + "items": { "type": "string", "enum": ["signed_context", "online_execution_check"] }, + "contains": { "const": "signed_context" }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "build_creative" - }, + "task": { "type": "string", "const": "build_creative" }, "modes": { "type": "array", - "items": { - "type": "string", - "const": "signed_context" - }, + "items": { "type": "string", "const": "signed_context" }, "minItems": 1, "maxItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "activate_signal" - }, + "task": { "type": "string", "const": "activate_signal" }, "modes": { "type": "array", - "items": { - "type": "string", - "const": "signed_context" - }, + "items": { "type": "string", "const": "signed_context" }, "minItems": 1, "maxItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "acquire_rights" - }, + "task": { "type": "string", "const": "acquire_rights" }, "modes": { "type": "array", - "items": { - "type": "string", - "const": "signed_context" - }, + "items": { "type": "string", "const": "signed_context" }, "minItems": 1, "maxItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false }, { "properties": { - "task": { - "type": "string", - "const": "update_rights" - }, + "task": { "type": "string", "const": "update_rights" }, "modes": { "type": "array", - "items": { - "type": "string", - "const": "signed_context" - }, + "items": { "type": "string", "const": "signed_context" }, "minItems": 1, "maxItems": 1, "uniqueItems": true } }, - "required": [ - "task", - "modes" - ], + "required": ["task", "modes"], "additionalProperties": false } ] @@ -843,29 +803,24 @@ "uniqueItems": true }, "accepted_governance_agents": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/governance/accepted-governance-agents.json", + "$ref": "/schemas/governance/accepted-governance-agents.json", "description": "Seller-wide advisory default for governance agents this enforcing service accepts as binding counterparties. A candidate satisfying any matcher is accepted by this declaration. The per-account sync_governance response is authoritative and may apply stricter account-specific criteria. Omission means accept any, preserving legacy behavior." } }, - "required": [ - "tasks" - ], + "required": ["tasks"], "x-status": "experimental", "additionalProperties": false }, "attestations": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/attestation-capabilities.json", + "$ref": "/schemas/core/attestation-capabilities.json", "description": "Portable-attestation trust and delivery capabilities for this evaluator. Present only when the agent accepts AttestationReference inputs on one or more domain task surfaces. This block is an allowlist: presenters cannot expand accepted issuers, resolver endpoints, verifier agents, claim types, or proof formats by supplying values in a request." } }, - "required": [ - "major_versions", - "idempotency" - ] + "required": ["major_versions", "idempotency"] }, "supported_protocols": { "type": "array", - "description": "AdCP protocols this agent supports. Stable values both (a) declare which tools the agent implements and (b) commit 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/). The `measurement` protocol is experimental and currently covers provider catalog/output declaration (`measurement.core`) and buyer-orchestrator interchange gateways (`measurement.gateway`). Measurement agents exchange delivery and feedback with the gateway rather than receiving direct seller access. Additional provider tasks and a baseline storyboard land only when concrete workflows require them. Compliance testing support is declared separately via the `compliance_testing` capability block (below), not as a protocol claim.", + "description": "AdCP protocols this agent supports. Stable values both (a) declare which tools the agent implements and (b) commit 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/). The `measurement` protocol is experimental and currently covers provider catalog/output declaration (`measurement.core`) and buyer-orchestrator interchange gateways (`measurement.gateway`). Measurement agents exchange delivery and feedback with the gateway rather than receiving direct seller access. Additional provider tasks and a baseline storyboard land only when concrete workflows require them. Compliance testing support is declared separately via the `compliance_testing` capability block (below), not as a protocol claim.", "items": { "type": "string", "enum": [ @@ -898,7 +853,7 @@ "type": "array", "description": "Billing models this seller supports. 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. When the buyer calls sync_accounts, it must pass one of these values. A lazy-provisioning seller may omit sync_accounts only when billing can be resolved unambiguously from this capability or the authenticated agent's onboarding defaults.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/billing-party.json" + "$ref": "/schemas/enums/billing-party.json" }, "minItems": 1 }, @@ -906,23 +861,23 @@ "type": "array", "description": "Required for sellers implementing AdCP 3.2 advertiser-account provisioning, but optional in this shared 3.x response schema so existing 3.0 and 3.1 capability responses remain valid. Declares whether advertiser accounts are bound to one immutable currency (`fixed`), select currency independently per proposal or media buy (`per_media_buy`), or support both models. When only `fixed` is advertised, buyer-declared provisioning entries MUST include `currency`. When only `per_media_buy` is advertised, they MUST omit it. When both are advertised, presence of `currency` selects a fixed-currency account and omission selects per-media-buy currency. Buyers MUST treat absence as an older seller whose currency mode is not discoverable, not as support for either mode.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/account-currency-mode.json" + "$ref": "/schemas/enums/account-currency-mode.json" }, "minItems": 1, "uniqueItems": true }, "timezone": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/account-timezone-capability.json", + "$ref": "/schemas/core/account-timezone-capability.json", "description": "Required for sellers implementing AdCP 3.2 advertiser-account provisioning, but optional in the shared 3.x response schema for compatibility. Declares whether the account timezone is seller-wide or fixed per account and whether a buyer must select it during sync_accounts provisioning. Account timezone is the default for account-scoped calendar semantics; feature-specific capability fields explicitly declare exceptions." }, "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": { "type": "boolean", - "description": "Whether this seller exposes the `get_account_financials` task for querying account-level financial status (spend, credit, invoices). Acts as a **pre-call discriminator** \u2014 buyers MUST consult this field before issuing `get_account_financials`; when `false` (or absent), sellers MAY reject the call with an `UNSUPPORTED_FEATURE` / `OPERATION_NOT_SUPPORTED` error. Companion pattern to `creative.bills_through_adcp` (issue #2881) \u2014 both fields let buyers gate optional capability calls on a single declared boolean rather than probing for support. Only applicable to operator-billed accounts; sellers using buyer-billed flows omit or set to `false`.", + "description": "Whether this seller exposes the `get_account_financials` task for querying account-level financial status (spend, credit, invoices). Acts as a **pre-call discriminator** — buyers MUST consult this field before issuing `get_account_financials`; when `false` (or absent), sellers MAY reject the call with an `UNSUPPORTED_FEATURE` / `OPERATION_NOT_SUPPORTED` error. Companion pattern to `creative.bills_through_adcp` (issue #2881) — both fields let buyers gate optional capability calls on a single declared boolean rather than probing for support. Only applicable to operator-billed accounts; sellers using buyer-billed flows omit or set to `false`.", "default": false }, "notifications": { @@ -952,9 +907,7 @@ "description": "Account lifecycle notification types this seller can emit. Currently only `account.status_changed` is defined.", "items": { "type": "string", - "enum": [ - "account.status_changed" - ] + "enum": ["account.status_changed"] }, "minItems": 1, "uniqueItems": true @@ -982,25 +935,17 @@ "description": "Discriminator. False means buyers must rely on `sync_accounts` results, `push_notification_config` for one-shot provisioning callbacks, and polling `list_accounts` for later status changes." } }, - "required": [ - "supported" - ], + "required": ["supported"], "not": { "anyOf": [ { - "required": [ - "registration_task" - ] + "required": ["registration_task"] }, { - "required": [ - "read_task" - ] + "required": ["read_task"] }, { - "required": [ - "event_types" - ] + "required": ["event_types"] } ] }, @@ -1015,22 +960,10 @@ { "title": "AccountChangeFeedSupported", "properties": { - "supported": { - "type": "boolean", - "const": true - }, - "read_task": { - "type": "string", - "const": "list_account_changes" - }, - "registration_task": { - "type": "string", - "const": "sync_accounts" - }, - "event_type": { - "type": "string", - "const": "account.change_recorded" - }, + "supported": {"type": "boolean", "const": true}, + "read_task": {"type": "string", "const": "list_account_changes"}, + "registration_task": {"type": "string", "const": "sync_accounts"}, + "event_type": {"type": "string", "const": "account.change_recorded"}, "retention_days": { "type": "integer", "minimum": 90, @@ -1049,54 +982,22 @@ "uniqueItems": true } }, - "required": [ - "supported", - "read_task", - "registration_task", - "event_type", - "retention_days", - "resource_types" - ], + "required": ["supported", "read_task", "registration_task", "event_type", "retention_days", "resource_types"], "additionalProperties": true }, { "title": "AccountChangeFeedUnsupported", "properties": { - "supported": { - "type": "boolean", - "const": false - } + "supported": {"type": "boolean", "const": false} }, - "required": [ - "supported" - ], + "required": ["supported"], "not": { "anyOf": [ - { - "required": [ - "read_task" - ] - }, - { - "required": [ - "registration_task" - ] - }, - { - "required": [ - "event_type" - ] - }, - { - "required": [ - "retention_days" - ] - }, - { - "required": [ - "resource_types" - ] - } + {"required": ["read_task"]}, + {"required": ["registration_task"]}, + {"required": ["event_type"]}, + {"required": ["retention_days"]}, + {"required": ["resource_types"]} ] }, "additionalProperties": true @@ -1163,9 +1064,7 @@ "default": false } }, - "required": [ - "supported_billing" - ] + "required": ["supported_billing"] }, "media_buy": { "type": "object", @@ -1188,47 +1087,34 @@ }, "default_profile_ids": { "type": "array", - "items": { - "type": "string", - "minLength": 1, - "x-entity": "acceptance_policy_profile" - }, + "items": { "type": "string", "minLength": 1, "x-entity": "acceptance_policy_profile" }, "minItems": 1, "uniqueItems": true, "description": "Local or registry-referenced catalog profiles that apply seller-wide unless a product adds further profiles. IDs MUST resolve uniquely across profiles and registry_profiles; all referenced profiles compose restrictively." } }, - "required": [ - "catalog_url", - "catalog_digest" - ], + "required": ["catalog_url", "catalog_digest"], "additionalProperties": false }, "supported_pricing_models": { "type": "array", "description": "Pricing models this seller supports across its product portfolio. Buyers can use this for pre-flight filtering before querying individual products. Individual products may support a subset of these models.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/pricing-model.json" + "$ref": "/schemas/enums/pricing-model.json" }, "minItems": 1, "uniqueItems": true }, "buying_modes": { "type": "array", - "description": "Buying modes this seller supports on get_products. 'brief' (semantic discovery driven by the brief) is universally supported and implicit. 'wholesale' (raw wholesale product feed enumeration \u2014 caller omits brief and the seller returns the full priced product feed, paginated) is opt-in and SHOULD be declared explicitly so buyers can probe before issuing wholesale calls. 'refine' lets buyers iterate on prior products/proposals and is also the vehicle for finalizing draft proposals when the seller returns them. Sellers MAY declare ['brief', 'wholesale'] to signal wholesale support; absent declaration is treated as ['brief'] for wholesale-feed probing purposes and sellers MAY return INVALID_REQUEST for wholesale calls they do not support. Symmetric with signals.discovery_modes.", + "description": "Buying modes this seller supports on get_products. 'brief' (semantic discovery driven by the brief) is universally supported and implicit. 'wholesale' (raw wholesale product feed enumeration — caller omits brief and the seller returns the full priced product feed, paginated) is opt-in and SHOULD be declared explicitly so buyers can probe before issuing wholesale calls. 'refine' lets buyers iterate on prior products/proposals and is also the vehicle for finalizing draft proposals when the seller returns them. Sellers MAY declare ['brief', 'wholesale'] to signal wholesale support; absent declaration is treated as ['brief'] for wholesale-feed probing purposes and sellers MAY return INVALID_REQUEST for wholesale calls they do not support. Symmetric with signals.discovery_modes.", "items": { "type": "string", - "enum": [ - "brief", - "wholesale", - "refine" - ] + "enum": ["brief", "wholesale", "refine"] }, "minItems": 1, "uniqueItems": true, - "default": [ - "brief" - ] + "default": ["brief"] }, "measurement_terms_acceptance": { "type": "boolean", @@ -1239,7 +1125,7 @@ "availability_horizon": { "type": "boolean", "default": false, - "description": "Whether this seller supports flexible-window availability discovery: parsing offer_filters.availability_horizon and answering with time-dimensioned forecast points that carry availability_status. Sellers declaring true MUST apply the full window contract \u2014 half-open non-overlapping windows that partition the requested horizon (or signal gaps via incomplete[]), with availability_status computed from all booking eligibility constraints, not only competing holds. false or absent means flexible-window support is unknown: buyers SHOULD use exact start_date/end_date filtering, and sellers MAY ignore the field or reject it. Conformance storyboards gate flexible-window checks on this declaration.", + "description": "Whether this seller supports flexible-window availability discovery: parsing offer_filters.availability_horizon and answering with time-dimensioned forecast points that carry availability_status. Sellers declaring true MUST apply the full window contract — half-open non-overlapping windows that partition the requested horizon (or signal gaps via incomplete[]), with availability_status computed from all booking eligibility constraints, not only competing holds. false or absent means flexible-window support is unknown: buyers SHOULD use exact start_date/end_date filtering, and sellers MAY ignore the field or reject it. Conformance storyboards gate flexible-window checks on this declaration.", "x-added-in": "3.2.0" }, "lifecycle_tools": { @@ -1247,15 +1133,7 @@ "description": "Compact product and MediaBuy lifecycle operation names this seller supports. Added in AdCP 3.2 as task-specific contracts that form the 4.0 lifecycle foundation. Sellers may advertise any supported subset while retaining the deprecated get_products/create_media_buy/update_media_buy facades throughout 3.x. Each stateful split task has its own idempotency identity; callers MUST retry with the same tool name.", "items": { "type": "string", - "enum": [ - "list_products", - "request_proposals", - "refine_proposals", - "decline_proposals", - "buy_products", - "accept_proposal", - "control_media_buy" - ] + "enum": ["list_products", "request_proposals", "refine_proposals", "decline_proposals", "buy_products", "accept_proposal", "control_media_buy"] }, "minItems": 1, "uniqueItems": true @@ -1269,15 +1147,7 @@ "description": "Typed revision dimensions the seller can parse and validate. An empty list authoritatively means ask-only refinement with no typed dimensions. total_budget, cpm, impressions, and flight cover the same-named constraints keys; product_changes covers product_changes; alternatives covers alternatives.count; criteria covers structured discovery criteria. Free-text ask interpretation is competence, not a capability declared here.", "items": { "type": "string", - "enum": [ - "total_budget", - "cpm", - "impressions", - "flight", - "product_changes", - "alternatives", - "criteria" - ] + "enum": ["total_budget", "cpm", "impressions", "flight", "product_changes", "alternatives", "criteria"] }, "uniqueItems": true }, @@ -1288,23 +1158,13 @@ "description": "Optional maximum alternatives.count the seller accepts, up to the protocol maximum of 10. Valid only when supported_dimensions includes alternatives. Requests above this ceiling fail at task level with VALIDATION_ERROR identifying refinements[i].alternatives.count; sellers MUST NOT silently clamp the request or return alternatives_unavailable for the declared ceiling violation." } }, - "required": [ - "supported_dimensions" - ], + "required": ["supported_dimensions"], "allOf": [ { - "if": { - "required": [ - "max_alternatives" - ] - }, + "if": { "required": ["max_alternatives"] }, "then": { "properties": { - "supported_dimensions": { - "contains": { - "const": "alternatives" - } - } + "supported_dimensions": { "contains": { "const": "alternatives" } } } } } @@ -1316,10 +1176,7 @@ "description": "How this seller delivers reporting data to buyers. Polling via get_media_buy_delivery is always available as a baseline regardless of this field. This array declares additional push-based delivery methods the seller supports. 'webhook': seller pushes to buyer-provided URL (configured per buy via reporting_webhook). 'offline': seller pushes batch files to a cloud storage bucket (seller-provisioned per account via reporting_bucket on the account object). When absent, only polling is available.", "items": { "type": "string", - "enum": [ - "webhook", - "offline" - ] + "enum": ["webhook", "offline"] }, "minItems": 1, "uniqueItems": true @@ -1342,11 +1199,16 @@ "type": "array", "description": "Cloud storage protocols this seller supports for offline file delivery. Only meaningful when reporting_delivery_methods includes 'offline'. Buyers express a protocol preference in sync_accounts; the seller provisions the account's reporting_bucket using a supported protocol.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/cloud-storage-protocol.json" + "$ref": "/schemas/enums/cloud-storage-protocol.json" }, "minItems": 1, "uniqueItems": true }, + "reporting_delivery": { + "$ref": "/schemas/core/reporting-delivery-capabilities.json", + "x-status": "experimental", + "description": "Managed reporting status and durable delivery capability. Presence requires media_buy.reporting_delivery in experimental_features. This generalizes, but does not remove, the legacy reporting_delivery_methods/offline_delivery_protocols surface." + }, "supports_proposals": { "type": "boolean", "description": "Conformance declaration that this seller supports proposals through either the compact request/refine/finalize lifecycle or the legacy get_products facade. accept_proposal, or the create_media_buy compatibility facade, consumes a finalized committed proposal_id before expires_at.", @@ -1355,7 +1217,7 @@ "outcome_target": { "type": "boolean", "default": false, - "description": "Whether this seller supports reverse-forecast planning: parsing criteria.outcome_target (a compact goal \u2014 a forecastable-metric delivery metric or an event-type conversion event \u2014 plus a desired volume) and solving for budget, answering with total_budget_guidance on proposals and forecasts whose points carry the goal's key in metrics. false or absent means support is unknown: buyers SHOULD express outcome goals in brief prose instead, and sellers reject a structured outcome_target with UNSUPPORTED_FEATURE rather than silently ignoring it.", + "description": "Whether this seller supports reverse-forecast planning: parsing criteria.outcome_target (a compact goal — a forecastable-metric delivery metric or an event-type conversion event — plus a desired volume) and solving for budget, answering with total_budget_guidance on proposals and forecasts whose points carry the goal's key in metrics. false or absent means support is unknown: buyers SHOULD express outcome goals in brief prose instead, and sellers reject a structured outcome_target with UNSUPPORTED_FEATURE rather than silently ignoring it.", "x-added-in": "3.2.0" }, "governance_aware": { @@ -1365,34 +1227,25 @@ }, "propagation_surfaces": { "type": "array", - "description": "Where this seller surfaces dependency-resource impairments (creative suspended/rejected post-approval, audience suspended, catalog item withdrawn, event source insufficient, property depublished) to buyers. Non-exclusive: a seller mirroring impairments on both the buy snapshot AND firing webhooks declares `[\"snapshot\", \"webhook\"]` (the common case for premium guaranteed sellers). Each value names one surface where buyers can observe an impairment:\n\n- **`snapshot`** \u2014 seller propagates resource transitions into `media_buy.health` and `media_buy.impairments[]` on the next `get_media_buys` read. The `impairment.coherence` compliance assertion grades this surface; storyboards that exercise it (`media_buy_seller/dependency_impairment`, `media_buy_seller/dependency_impairment_cardinality`) require `\"snapshot\"` to be declared, else they grade `not_applicable`.\n- **`webhook`** \u2014 seller fires `notification-type: impairment` webhooks (configured via `push_notification_config`). Sellers declaring `\"webhook\"` MUST satisfy the persistent-channel webhook contract for the impairment event type. A seller declaring `[\"webhook\"]` without `\"snapshot\"` is webhook-only \u2014 buyers reconcile state from the push channel alone, and snapshot-coherence storyboards grade `not_applicable`.\n- **`out_of_band`** \u2014 seller propagates via channels outside the AdCP protocol surface entirely (email to trafficker, separate dashboard, partner-specific notification feed). Long-tail and enterprise-bundled platforms commonly use this when impairment workflows are managed in human channels. Sellers declaring only `[\"out_of_band\"]` are not graded by snapshot or webhook compliance \u2014 their bar is the offline agreement, not a protocol assertion. If a seller has impairment data in their API under a non-AdCP field name (a mapping gap, not truly out-of-band), they SHOULD document the mapping rather than declare `out_of_band` \u2014 the spec's gap, not the seller's posture, is what `out_of_band` legitimately covers.\n\nDefault: `[\"snapshot\"]` when absent (preserves the existing snapshot-coherence contract for sellers that don't declare). Empty array `[]` is invalid (`minItems: 1`) \u2014 omit the field to inherit the default rather than declaring no surfaces. Pick the surfaces that honestly describe where buyers will see impairments on this agent. Mixing is normative \u2014 `[\"snapshot\", \"webhook\"]` is the documented common case; `[\"snapshot\", \"webhook\", \"out_of_band\"]` is valid for sellers that ship all three surfaces (rare but legal). See lifecycle.mdx \u00a7 Compliance for the per-surface contract.", + "description": "Where this seller surfaces dependency-resource impairments (creative suspended/rejected post-approval, audience suspended, catalog item withdrawn, event source insufficient, property depublished) to buyers. Non-exclusive: a seller mirroring impairments on both the buy snapshot AND firing webhooks declares `[\"snapshot\", \"webhook\"]` (the common case for premium guaranteed sellers). Each value names one surface where buyers can observe an impairment:\n\n- **`snapshot`** — seller propagates resource transitions into `media_buy.health` and `media_buy.impairments[]` on the next `get_media_buys` read. The `impairment.coherence` compliance assertion grades this surface; storyboards that exercise it (`media_buy_seller/dependency_impairment`, `media_buy_seller/dependency_impairment_cardinality`) require `\"snapshot\"` to be declared, else they grade `not_applicable`.\n- **`webhook`** — seller fires `notification-type: impairment` webhooks (configured via `push_notification_config`). Sellers declaring `\"webhook\"` MUST satisfy the persistent-channel webhook contract for the impairment event type. A seller declaring `[\"webhook\"]` without `\"snapshot\"` is webhook-only — buyers reconcile state from the push channel alone, and snapshot-coherence storyboards grade `not_applicable`.\n- **`out_of_band`** — seller propagates via channels outside the AdCP protocol surface entirely (email to trafficker, separate dashboard, partner-specific notification feed). Long-tail and enterprise-bundled platforms commonly use this when impairment workflows are managed in human channels. Sellers declaring only `[\"out_of_band\"]` are not graded by snapshot or webhook compliance — their bar is the offline agreement, not a protocol assertion. If a seller has impairment data in their API under a non-AdCP field name (a mapping gap, not truly out-of-band), they SHOULD document the mapping rather than declare `out_of_band` — the spec's gap, not the seller's posture, is what `out_of_band` legitimately covers.\n\nDefault: `[\"snapshot\"]` when absent (preserves the existing snapshot-coherence contract for sellers that don't declare). Empty array `[]` is invalid (`minItems: 1`) — omit the field to inherit the default rather than declaring no surfaces. Pick the surfaces that honestly describe where buyers will see impairments on this agent. Mixing is normative — `[\"snapshot\", \"webhook\"]` is the documented common case; `[\"snapshot\", \"webhook\", \"out_of_band\"]` is valid for sellers that ship all three surfaces (rare but legal). See lifecycle.mdx § Compliance for the per-surface contract.", "items": { "type": "string", - "enum": [ - "snapshot", - "webhook", - "out_of_band" - ] + "enum": ["snapshot", "webhook", "out_of_band"] }, "uniqueItems": true, "minItems": 1, - "default": [ - "snapshot" - ] + "default": ["snapshot"] }, "creative_approval_mode": { "type": "string", "description": "Tenant-wide applicability signal for media-buy creative approval behavior. This is not a notification or new approval workflow. `auto_approve` means human review does not block serving eligibility after creatives are assigned and automated validation passes. `require_human` means one or more products/accounts may require manual review before creatives become eligible to serve; buyers and compliance runners MUST treat this as a worst-case ceiling across this seller's portfolio unless a future product-level override says otherwise. Compliance runners use this mainly to decide whether auto-approval-dependent storyboards apply. When absent, approval behavior is legacy-unspecified; runners SHOULD NOT treat omission as an affirmative auto-approval claim. `ai_assisted` is intentionally not part of the enum until a behavioral contract is defined.", - "enum": [ - "auto_approve", - "require_human" - ] + "enum": ["auto_approve", "require_human"] }, "supported_indicator_types": { "type": "array", "description": "Indicator types this seller can expose on get_media_buys media-buy/package/creative-assignment snapshots. Each type's meaning is defined by the negotiated AdCP release; indicator types do not carry independent sub-versions. This is availability, not complete upstream coverage. Poll-only sellers may declare this field without relationship_notifications. If relationship_notifications includes indicators.changed, this field is required so receivers know which durable indicator types can be repaired.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/indicator-type.json" + "$ref": "/schemas/enums/indicator-type.json" }, "minItems": 1, "uniqueItems": true @@ -1416,10 +1269,7 @@ "description": "Relationship invalidation events supported by this seller. indicators.changed requires supported_indicator_types but is not required merely because polling readback is available. creative.assignment_changed is independently available when the seller can detect assignment or assignment-approval changes; it does not require indicator support or list_creatives.", "items": { "type": "string", - "enum": [ - "indicators.changed", - "creative.assignment_changed" - ] + "enum": ["indicators.changed", "creative.assignment_changed"] }, "minItems": 1, "maxItems": 2, @@ -1453,38 +1303,23 @@ "default": false } }, - "required": [ - "supported", - "registration_task", - "event_types", - "repair_tasks" - ], + "required": ["supported", "registration_task", "event_types", "repair_tasks"], "additionalProperties": false }, "features": { "allOf": [ - { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/media-buy-features.json" - }, + { "$ref": "/schemas/core/media-buy-features.json" }, { "if": { - "required": [ - "catalog_item_availability_updates" - ], + "required": ["catalog_item_availability_updates"], "properties": { - "catalog_item_availability_updates": { - "const": true - } + "catalog_item_availability_updates": { "const": true } } }, "then": { - "required": [ - "catalog_management" - ], + "required": ["catalog_management"], "properties": { - "catalog_management": { - "const": true - } + "catalog_management": { "const": true } } } } @@ -1503,7 +1338,7 @@ "type": "array", "description": "Surface types this seller supports via TMP.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/property-type.json" + "$ref": "/schemas/enums/property-type.json" } } } @@ -1524,18 +1359,14 @@ "vast_versions": { "type": "array", "description": "Seller-wide VAST execution ceiling. Each product format option declares its binding accepted subset in `params.vast_versions`.", - "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/vast-version.json" - }, + "items": { "$ref": "/schemas/enums/vast-version.json" }, "minItems": 1, "uniqueItems": true }, "macro_resolution_capabilities": { "type": "array", "minItems": 1, - "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/macro-resolution-capability.json" - }, + "items": { "$ref": "/schemas/core/macro-resolution-capability.json" }, "description": "Seller-wide ceiling for exact macro processing tuples (dialect identity/revision, semantic mapping, operation, actor, context, and encoding). It never proves a product execution path supports the same tuple and does not claim tracker firing; inspect the selected format option and, when standardized, product tracker capabilities.", "x-adcp-validation": { "verifier_constraints": { @@ -1561,11 +1392,7 @@ }, "vast_validation": { "type": "string", - "enum": [ - "structural", - "document", - "wrapper" - ], + "enum": ["structural", "document", "wrapper"], "default": "structural", "description": "Level of VAST asset validation the seller performs at sync_creatives (including dry_run): 'structural' checks manifest shape and format requirements only and never inspects the VAST document; 'document' additionally parses the VAST document and can return VAST_PARSE_FAILED / VAST_VERSION_MISMATCH; 'wrapper' additionally resolves the wrapper chain and can return VAST_WRAPPER_DEPTH_EXCEEDED. Absent means 'structural'. See the VAST Validation section of the video channel documentation for the normative checks at each level." } @@ -1582,23 +1409,15 @@ "geo_regions": { "description": "ISO 3166-2 subdivision inclusion targeting. A legacy boolean is a coarse seller-wide declaration. Structured country/value entries are individually supported within the response scope, but do not promise joint composability or availability through the same execution route or account. Only Product.overlay_support supplies the binding set of executable targeting permissions for a configured Product.", "anyOf": [ - { - "type": "boolean" - }, - { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-region-support.json" - } + { "type": "boolean" }, + { "$ref": "/schemas/core/geo-region-support.json" } ] }, "geo_regions_exclude": { "description": "ISO 3166-2 subdivision exclusion targeting, declared independently from inclusion. Structured country/value entries are individually supported within the response scope, but do not promise joint composability or availability through the same execution route or account. Only Product.overlay_support supplies the binding set of executable targeting permissions for a configured Product; absence means buyers cannot infer exclusion support from geo_regions alone.", "anyOf": [ - { - "type": "boolean" - }, - { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-region-support.json" - } + { "type": "boolean" }, + { "$ref": "/schemas/core/geo-region-support.json" } ] }, "geo_metros": { @@ -1622,16 +1441,16 @@ }, "geo_postal_areas": { "description": "Postal area targeting. Prefer the native country-keyed map where each ISO 3166-1 alpha-2 country lists supported country-local postal systems. Deprecated legacy country-fused postal-system boolean aliases may be emitted alongside native country keys during migration.", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/postal-area-support.json" + "$ref": "/schemas/core/postal-area-support.json" }, "geo_places": { "type": "object", "description": "Place targeting support keyed by collision-safe identifier system. Each system declares exact country-to-place-type combinations, accepted catalog versions, and a machine-readable resolver. Sellers MUST reject unsupported systems, country/type pairs, versions, and identifiers rather than silently dropping them.", "propertyNames": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-system.json" + "$ref": "/schemas/core/geo-place-system.json" }, "additionalProperties": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/geo-place-support.json" + "$ref": "/schemas/core/geo-place-support.json" }, "minProperties": 1 }, @@ -1647,7 +1466,7 @@ "type": "array", "description": "Age verification methods this seller supports", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/age-verification-method.json" + "$ref": "/schemas/enums/age-verification-method.json" } } } @@ -1661,9 +1480,7 @@ "description": "Whether at least one seller product supports canonical demographic targeting." } }, - "required": [ - "supported" - ], + "required": ["supported"], "additionalProperties": true }, "language": { @@ -1683,7 +1500,7 @@ "type": "array", "description": "Exact canonical BCP 47 language ranges accepted in targeting.language. Omission means the seller makes no exhaustive language-list declaration.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/locale-tag.json" + "$ref": "/schemas/core/locale-tag.json" } } } @@ -1698,14 +1515,12 @@ "type": "array", "description": "Match types this seller supports for keyword targets. Sellers must reject goals with unsupported match types.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/match-type.json" + "$ref": "/schemas/enums/match-type.json" }, "minItems": 1 } }, - "required": [ - "supported_match_types" - ] + "required": ["supported_match_types"] }, "negative_keywords": { "type": "object", @@ -1715,14 +1530,12 @@ "type": "array", "description": "Match types this seller supports for negative keywords. Sellers must reject goals with unsupported match types.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/match-type.json" + "$ref": "/schemas/enums/match-type.json" }, "minItems": 1 } }, - "required": [ - "supported_match_types" - ] + "required": ["supported_match_types"] }, "placement_selection": { "type": "boolean", @@ -1764,7 +1577,7 @@ "type": "array", "description": "Transport modes supported for travel_time isochrones. Only relevant when travel_time is true.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/transport-mode.json" + "$ref": "/schemas/enums/transport-mode.json" }, "minItems": 1 } @@ -1783,10 +1596,7 @@ "description": "Buyer policy modes the seller evaluates. A seller MUST NOT silently ignore a mode it does not list.", "items": { "type": "string", - "enum": [ - "required", - "preferred" - ] + "enum": ["required", "preferred"] }, "minItems": 1, "uniqueItems": true @@ -1796,10 +1606,7 @@ "description": "Evidence-presence semantics the seller supports.", "items": { "type": "string", - "enum": [ - "required", - "when_available" - ] + "enum": ["required", "when_available"] }, "minItems": 1, "uniqueItems": true @@ -1809,11 +1616,7 @@ "description": "Whether the seller evaluates audience-evidence attestation_refs under its core adcp.attestations policy and returns the exact reference and AttestationEvaluation in package readback." } }, - "required": [ - "supported_requirement_modes", - "supported_presence_modes", - "supports_attestation_evaluation" - ], + "required": ["supported_requirement_modes", "supported_presence_modes", "supports_attestation_evaluation"], "additionalProperties": true }, "rights_attestations": { @@ -1822,16 +1625,11 @@ "properties": { "requirement": { "type": "string", - "enum": [ - "optional", - "required" - ], + "enum": ["optional", "required"], "description": "required means every applicable rights constraint needs at least one current verified attestation evaluation before the creative is eligible to serve. optional permits independent legacy contractual policy, but unattested constraints remain machine-unverified and verification_url is never a downgrade path." } }, - "required": [ - "requirement" - ], + "required": ["requirement"], "additionalProperties": false }, "audience_targeting": { @@ -1843,10 +1641,7 @@ "description": "PII-derived identifier types accepted for audience matching. Buyers should only send identifiers the seller supports.", "items": { "type": "string", - "enum": [ - "hashed_email", - "hashed_phone" - ] + "enum": ["hashed_email", "hashed_phone"] }, "minItems": 1 }, @@ -1856,15 +1651,15 @@ }, "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": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/uid-type.json" + "$ref": "/schemas/enums/uid-type.json" }, "minItems": 1 }, "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 }, "supported_activation_methods": { @@ -1872,7 +1667,7 @@ "x-status": "experimental", "description": "Union of audience_activation.methods across the seller's products. Fast-fail discovery: a buyer reads this once and skips the catalog walk when nothing overlaps its pipeline. Per-product declarations are the source of truth; sellers MUST keep this consistent with the catalog. Operational coordinates are account-scoped: the union MAY omit consumer_identities and destination_ref until bilateral account setup establishes them, and MUST NOT expose another account's coordinates. Absence of this field with media_buy.audience_activation listed in experimental_features means walk the catalog; only a present, non-overlapping union is a fast-fail signal. Experimental (x-status: experimental): sellers implementing audience activation declarations MUST list media_buy.audience_activation in experimental_features. Per docs/reference/experimental-status, this surface MAY change between 3.x releases with notice.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/audience-activation-method.json" + "$ref": "/schemas/core/audience-activation-method.json" }, "minItems": 1 }, @@ -1892,15 +1687,12 @@ "additionalProperties": false } }, - "required": [ - "supported_identifier_types", - "minimum_audience_size" - ], + "required": ["supported_identifier_types", "minimum_audience_size"], "additionalProperties": true }, "supported_optimization_metrics": { "type": "array", - "description": "Optimization metrics this seller can support on at least one of their products. Seller-level rollup of product-level metric_optimization.supported_metrics declarations (core/product.json). Buyers SHOULD filter their requested optimization goals against this list before submitting briefs. Sellers MUST keep this in sync with their product catalog \u2014 if no products support a metric, it must not appear here. Omitting this field means the seller declares no specific guarantees about which metrics they support; buyers should fall back to per-product inspection of metric_optimization.supported_metrics.", + "description": "Optimization metrics this seller can support on at least one of their products. Seller-level rollup of product-level metric_optimization.supported_metrics declarations (core/product.json). Buyers SHOULD filter their requested optimization goals against this list before submitting briefs. Sellers MUST keep this in sync with their product catalog — if no products support a metric, it must not appear here. Omitting this field means the seller declares no specific guarantees about which metrics they support; buyers should fall back to per-product inspection of metric_optimization.supported_metrics.", "items": { "type": "string", "enum": [ @@ -1929,10 +1721,7 @@ "description": "Target kinds this seller can support for vendor_metric optimization goals on at least one product. Values match optimization_goals[].target.kind for kind: vendor_metric. A target-less vendor_metric goal maximizes the metric within budget and does not require a target-kind declaration.", "items": { "type": "string", - "enum": [ - "cost_per", - "threshold_rate" - ] + "enum": ["cost_per", "threshold_rate"] }, "minItems": 1, "uniqueItems": true @@ -1946,7 +1735,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." }, "per_creative_attribution": { "type": "boolean", @@ -1956,20 +1745,16 @@ "type": "array", "description": "Event types this seller can track and attribute. If omitted, all standard event types are supported.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/event-type.json" + "$ref": "/schemas/enums/event-type.json" }, "minItems": 1 }, "supported_targets": { "type": "array", - "description": "Event-goal target kinds this seller can compute against. Buyers should only submit event-kind optimization goals whose target.kind is listed here \u2014 sellers MUST reject goals with unlisted target kinds. When omitted, only target-less event goals (maximize conversion count within budget) are guaranteed; sellers MAY accept specific target kinds but buyers should not rely on it. Named to parallel `metric_optimization.supported_targets` at the product level \u2014 same concept (which target kinds are supported), one at seller-capability granularity and one at product granularity.", + "description": "Event-goal target kinds this seller can compute against. Buyers should only submit event-kind optimization goals whose target.kind is listed here — sellers MUST reject goals with unlisted target kinds. When omitted, only target-less event goals (maximize conversion count within budget) are guaranteed; sellers MAY accept specific target kinds but buyers should not rely on it. Named to parallel `metric_optimization.supported_targets` at the product level — same concept (which target kinds are supported), one at seller-capability granularity and one at product granularity.", "items": { "type": "string", - "enum": [ - "cost_per", - "per_ad_spend", - "maximize_value" - ] + "enum": ["cost_per", "per_ad_spend", "maximize_value"] }, "minItems": 1, "uniqueItems": true @@ -1978,7 +1763,7 @@ "type": "array", "description": "Universal ID types accepted for user matching", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/uid-type.json" + "$ref": "/schemas/enums/uid-type.json" }, "minItems": 1 }, @@ -1987,10 +1772,7 @@ "description": "Hashed PII types accepted for user matching. Buyers must hash before sending (SHA-256, normalized).", "items": { "type": "string", - "enum": [ - "hashed_email", - "hashed_phone" - ] + "enum": ["hashed_email", "hashed_phone"] }, "minItems": 1 }, @@ -1998,7 +1780,7 @@ "type": "array", "description": "Action sources this seller accepts events from", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/action-source.json" + "$ref": "/schemas/enums/action-source.json" }, "minItems": 1 }, @@ -2009,14 +1791,14 @@ "type": "object", "properties": { "event_type": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/event-type.json", + "$ref": "/schemas/enums/event-type.json", "description": "Event type this window applies to, or omit for default window" }, "post_click": { "type": "array", "description": "Available post-click attribution windows (e.g. [{\"interval\": 7, \"unit\": \"days\"}])", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/duration.json" + "$ref": "/schemas/core/duration.json" }, "minItems": 1 }, @@ -2024,14 +1806,12 @@ "type": "array", "description": "Available post-view attribution windows (e.g. [{\"interval\": 1, \"unit\": \"days\"}])", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/duration.json" + "$ref": "/schemas/core/duration.json" }, "minItems": 1 } }, - "required": [ - "post_click" - ], + "required": ["post_click"], "additionalProperties": true } } @@ -2040,13 +1820,13 @@ }, "frequency_capping": { "type": "object", - "description": "Frequency capping capabilities. Presence of this object indicates the seller honors targeting.frequency_cap on packages and MUST reject caps it cannot enforce rather than silently dropping them. Buyers SHOULD inspect supported_per_units and supported_window_units before submitting caps; sellers without these sub-fields populated MAY accept any reach-unit / duration-unit combination they can enforce. Per-product overrides (for sellers with mixed addressable/non-addressable inventory) are a likely follow-up \u2014 file a separate RFC if needed.", + "description": "Frequency capping capabilities. Presence of this object indicates the seller honors targeting.frequency_cap on packages and MUST reject caps it cannot enforce rather than silently dropping them. Buyers SHOULD inspect supported_per_units and supported_window_units before submitting caps; sellers without these sub-fields populated MAY accept any reach-unit / duration-unit combination they can enforce. Per-product overrides (for sellers with mixed addressable/non-addressable inventory) are a likely follow-up — file a separate RFC if needed.", "properties": { "supported_per_units": { "type": "array", "description": "Entity granularities the seller can enforce caps against. Values from the reach-unit enum. Omit to indicate all reach-unit values are supported.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/reach-unit.json" + "$ref": "/schemas/enums/reach-unit.json" }, "minItems": 1, "uniqueItems": true @@ -2072,10 +1852,7 @@ "description": "Scopes where the seller enforces hard daily caps. media_buy bounds aggregate spend across all packages without allocating it. package bounds one package and remains subordinate to any aggregate cap.", "items": { "type": "string", - "enum": [ - "media_buy", - "package" - ] + "enum": ["media_buy", "package"] }, "minItems": 1, "uniqueItems": true @@ -2085,19 +1862,14 @@ "description": "Cap reset periods the seller enforces. AdCP 3.2 defines day only; the array form reserves room for future periods as an additive change.", "items": { "type": "string", - "enum": [ - "day" - ] + "enum": ["day"] }, "minItems": 1, "uniqueItems": true }, "timezone_basis": { "type": "string", - "enum": [ - "account", - "fixed" - ], + "enum": ["account", "fixed"], "description": "Source of the default cap-day boundary. account uses the selected Account.timezone and therefore supports different boundaries for different accounts. fixed uses fixed_timezone for every media buy regardless of account timezone." }, "fixed_timezone": { @@ -2110,47 +1882,21 @@ "description": "When true, buyers MAY override the default cap-day boundary via media-buy-level budget_cap_timezone. The accepted timezone applies to aggregate and package caps alike. When false or absent, a submitted override is rejected with UNSUPPORTED_FEATURE." } }, - "required": [ - "supported_scopes", - "supported_periods", - "timezone_basis" - ], + "required": ["supported_scopes", "supported_periods", "timezone_basis"], "allOf": [ { "if": { - "properties": { - "timezone_basis": { - "const": "fixed" - } - }, - "required": [ - "timezone_basis" - ] + "properties": { "timezone_basis": { "const": "fixed" } }, + "required": ["timezone_basis"] }, - "then": { - "required": [ - "fixed_timezone" - ] - } + "then": { "required": ["fixed_timezone"] } }, { "if": { - "properties": { - "timezone_basis": { - "const": "account" - } - }, - "required": [ - "timezone_basis" - ] + "properties": { "timezone_basis": { "const": "account" } }, + "required": ["timezone_basis"] }, - "then": { - "not": { - "required": [ - "fixed_timezone" - ] - } - } + "then": { "not": { "required": ["fixed_timezone"] } } } ], "additionalProperties": true @@ -2167,7 +1913,7 @@ "type": "array", "description": "Channels for which the seller can provide content artifacts. Helps buyers understand which parts of a mixed-channel buy will have content standards coverage.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/channels.json" + "$ref": "/schemas/enums/channels.json" }, "minItems": 1 }, @@ -2194,7 +1940,7 @@ "type": "array", "description": "Complete list of AdCP media channels for which this sales agent accepts and can meaningfully answer product-discovery briefs. When present, this is an exhaustive brief-routing allowlist: buyers MAY skip the agent when a brief's requested channels do not intersect it. Omission means channel scope is unknown and MUST NOT be interpreted as support for every channel. This is a routing pre-filter, not a promise of current product availability.", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/channels.json" + "$ref": "/schemas/enums/channels.json" } }, "primary_countries": { @@ -2216,29 +1962,17 @@ "maxLength": 10000 } }, - "required": [ - "publisher_domains" - ] + "required": ["publisher_domains"] } }, "allOf": [ { - "if": { - "required": [ - "proposal_refinement" - ] - }, + "if": { "required": ["proposal_refinement"] }, "then": { "properties": { - "lifecycle_tools": { - "contains": { - "const": "refine_proposals" - } - } + "lifecycle_tools": { "contains": { "const": "refine_proposals" } } }, - "required": [ - "lifecycle_tools" - ] + "required": ["lifecycle_tools"] } }, { @@ -2246,26 +1980,14 @@ "properties": { "relationship_notifications": { "properties": { - "event_types": { - "contains": { - "const": "indicators.changed" - } - } + "event_types": { "contains": { "const": "indicators.changed" } } }, - "required": [ - "event_types" - ] + "required": ["event_types"] } }, - "required": [ - "relationship_notifications" - ] + "required": ["relationship_notifications"] }, - "then": { - "required": [ - "supported_indicator_types" - ] - } + "then": { "required": ["supported_indicator_types"] } } ] }, @@ -2284,19 +2006,14 @@ }, "discovery_modes": { "type": "array", - "description": "Discovery modes this signals agent supports on get_signals. 'brief' (default \u2014 every signals agent supports this): semantic discovery driven by signal_spec or signal_refs, with deprecated signal_ids accepted for older clients. 'wholesale': raw wholesale signals feed enumeration \u2014 caller omits signal_spec, signal_refs, and signal_ids and the agent returns its full priced signals feed, paginated, scoped by filters/account/destinations/countries. Agents that do not declare 'wholesale' MAY return INVALID_REQUEST for wholesale calls. Absent declaration is treated as ['brief'].", + "description": "Discovery modes this signals agent supports on get_signals. 'brief' (default — every signals agent supports this): semantic discovery driven by signal_spec or signal_refs, with deprecated signal_ids accepted for older clients. 'wholesale': raw wholesale signals feed enumeration — caller omits signal_spec, signal_refs, and signal_ids and the agent returns its full priced signals feed, paginated, scoped by filters/account/destinations/countries. Agents that do not declare 'wholesale' MAY return INVALID_REQUEST for wholesale calls. Absent declaration is treated as ['brief'].", "items": { "type": "string", - "enum": [ - "brief", - "wholesale" - ] + "enum": ["brief", "wholesale"] }, "minItems": 1, "uniqueItems": true, - "default": [ - "brief" - ] + "default": ["brief"] }, "features": { "type": "object", @@ -2327,11 +2044,8 @@ "properties": { "requirement": { "type": "string", - "enum": [ - "optional", - "required" - ], - "description": "Whether an activate_signal activation check may omit runtime_attestations. When required, missing evidence fails an activation check. Deactivation and privacy-removal checks never require signal-quality evidence and remain available without it." + "enum": ["optional", "required"], + "description": "Whether an activate_signal activation check may omit runtime_attestations. When required, missing evidence fails an activation check. Deactivation and privacy-removal checks never require signal-quality evidence and remain available without it." }, "claim_types": { "type": "array", @@ -2344,23 +2058,18 @@ "uniqueItems": true } }, - "required": [ - "requirement", - "claim_types" - ], + "required": ["requirement", "claim_types"], "additionalProperties": false } }, - "required": [ - "signal_activation" - ], + "required": ["signal_activation"], "additionalProperties": false }, "aggregation_window_days": { "type": "integer", "minimum": 1, "maximum": 365, - "description": "Trailing window (in days) over which this governance agent aggregates committed spend when evaluating dollar-valued thresholds (reallocation_threshold, human_review triggers, registry-policy floors). Required for fragmentation defense: without aggregation, a buyer can split a single large spend into many sub-threshold commits across plans / task surfaces / time and bypass every dollar-gated escalation. Aggregation is keyed on (buyer_agent, seller_agent, account_id) and spans all spend-commit task types. Upper bound 365 represents a one-year trailing window (fiscal-year alignment with grace); governance agents needing longer scopes negotiate via operator sign-off, not this capability. No schema default: absence of this field indicates the governance agent has not committed to any aggregation window and buyers MUST assume per-commit evaluation only (the fragmentation attack surface is open). A declared value of 30 is a common starting point but is not implied by omission. Buyers depending on a specific window for compliance MUST check this capability before relying on aggregation semantics \u2014 an agent declaring 7 days does not defend against fragmentation spread across a 30-day quarter-end push." + "description": "Trailing window (in days) over which this governance agent aggregates committed spend when evaluating dollar-valued thresholds (reallocation_threshold, human_review triggers, registry-policy floors). Required for fragmentation defense: without aggregation, a buyer can split a single large spend into many sub-threshold commits across plans / task surfaces / time and bypass every dollar-gated escalation. Aggregation is keyed on (buyer_agent, seller_agent, account_id) and spans all spend-commit task types. Upper bound 365 represents a one-year trailing window (fiscal-year alignment with grace); governance agents needing longer scopes negotiate via operator sign-off, not this capability. No schema default: absence of this field indicates the governance agent has not committed to any aggregation window and buyers MUST assume per-commit evaluation only (the fragmentation attack surface is open). A declared value of 30 is a common starting point but is not implied by omission. Buyers depending on a specific window for compliance MUST check this capability before relying on aggregation semantics — an agent declaring 7 days does not defend against fragmentation spread across a 30-day quarter-end push." }, "property_features": { "type": "array", @@ -2374,11 +2083,7 @@ }, "type": { "type": "string", - "enum": [ - "binary", - "quantitative", - "categorical" - ], + "enum": ["binary", "quantitative", "categorical"], "description": "Data type: 'binary' for yes/no, 'quantitative' for numeric scores, 'categorical' for enum values" }, "range": { @@ -2394,10 +2099,7 @@ "description": "Maximum value" } }, - "required": [ - "min", - "max" - ] + "required": ["min", "max"] }, "categories": { "type": "array", @@ -2416,10 +2118,7 @@ "description": "URL to documentation explaining how this feature is calculated or measured. Helps buyers understand and compare methodologies across vendors." } }, - "required": [ - "feature_id", - "type" - ] + "required": ["feature_id", "type"] } }, "creative_features": { @@ -2434,11 +2133,7 @@ }, "type": { "type": "string", - "enum": [ - "binary", - "quantitative", - "categorical" - ], + "enum": ["binary", "quantitative", "categorical"], "description": "Data type: 'binary' for yes/no, 'quantitative' for numeric scores, 'categorical' for enum values" }, "range": { @@ -2454,10 +2149,7 @@ "description": "Maximum value" } }, - "required": [ - "min", - "max" - ] + "required": ["min", "max"] }, "categories": { "type": "array", @@ -2476,10 +2168,7 @@ "description": "URL to documentation explaining how this feature is calculated or measured." } }, - "required": [ - "feature_id", - "type" - ] + "required": ["feature_id", "type"] } } } @@ -2501,10 +2190,7 @@ "properties": { "type": { "type": "string", - "enum": [ - "mcp", - "a2a" - ], + "enum": ["mcp", "a2a"], "description": "Protocol transport type" }, "url": { @@ -2513,29 +2199,21 @@ "description": "Agent endpoint URL for this transport" } }, - "required": [ - "type", - "url" - ], + "required": ["type", "url"], "additionalProperties": true }, "minItems": 1 }, "preferred": { "type": "string", - "enum": [ - "mcp", - "a2a" - ], + "enum": ["mcp", "a2a"], "description": "Preferred transport when host supports multiple" } }, - "required": [ - "transports" - ] + "required": ["transports"] }, "capabilities": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/sponsored-intelligence/si-capabilities.json", + "$ref": "/schemas/sponsored-intelligence/si-capabilities.json", "description": "Modalities, components, and commerce capabilities" }, "brand_url": { @@ -2544,10 +2222,7 @@ "description": "URL to brand.json with colors, fonts, logos, tone" } }, - "required": [ - "endpoint", - "capabilities" - ] + "required": ["endpoint", "capabilities"] }, "brand": { "type": "object", @@ -2564,7 +2239,7 @@ "description": "Types of rights available through this agent", "x-status": "experimental", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/right-type.json" + "$ref": "/schemas/enums/right-type.json" } }, "available_uses": { @@ -2572,7 +2247,7 @@ "description": "Rights uses available across this agent's roster", "x-status": "experimental", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/right-use.json" + "$ref": "/schemas/enums/right-use.json" } }, "generation_providers": { @@ -2632,16 +2307,11 @@ "type": "array", "minItems": 1, "uniqueItems": true, - "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/representation-selection-strategy.json" - }, + "items": { "$ref": "/schemas/enums/representation-selection-strategy.json" }, "description": "Deterministic selection strategies the seller implements after compatibility filtering. `representation_order` selects the first compatible source entry. `highest_compatible_vast` selects the highest exact VAST version from the already-intersected candidate set, with equal-version ties resolved by source array order." } }, - "required": [ - "supported", - "strategies" - ], + "required": ["supported", "strategies"], "additionalProperties": true, "x-adcp-validation": { "verifier_constraints": { @@ -2658,7 +2328,7 @@ }, "supports_refinement": { "type": "boolean", - "description": "When true, this agent retains produced build_variant leaves for an agent-defined retention window and can re-build from one via build_creative's refine_from_build_variant_id \u2014 applying a natural-language instruction in message plus an optional config delta, returning new lineage-linked variants. A build-time agent capability independent of generation/transformation. When false or absent, refine_from_build_variant_id is rejected with UNSUPPORTED_FEATURE; buyers refine instead via the transform path (creative_manifest + message).", + "description": "When true, this agent retains produced build_variant leaves for an agent-defined retention window and can re-build from one via build_creative's refine_from_build_variant_id — applying a natural-language instruction in message plus an optional config delta, returning new lineage-linked variants. A build-time agent capability independent of generation/transformation. When false or absent, refine_from_build_variant_id is rejected with UNSUPPORTED_FEATURE; buyers refine instead via the transform path (creative_manifest + message).", "default": false }, "supports_spend_controls": { @@ -2670,16 +2340,16 @@ "type": "boolean", "default": false, "x-status": "experimental", - "description": "Experimental (x-status: experimental) \u2014 agents setting this true MUST also list `creative.evaluator` in `experimental_features`; the surface MAY change between 3.x releases with notice (see docs/reference/experimental-status). When true, build_creative accepts an advisory `evaluator` input (exemplars / account-arranged evaluator_id / agent_url, plus an optional `feature_requirement[]` gate, a `rank_by` ordering, and an allowlisted `feature_agent` pointer). Feature discovery uses this response's governance.creative_features catalog: rank_by, feature_requirement, and eval.features[] all share the same creative-feature vocabulary as get_creative_features. evaluator_id is not discovered from this catalog; it is a pre-provisioned account preset whose emitted feature_ids still come from it. The evaluator populates a per-leaf `eval` block of creative-feature values (creative-feature-result[], the same shape get_creative_features returns) on BuildCreativeVariantSuccess leaves, which is what the recommended/rank it sets on the best_of_n axis are computed over. The agent runs a gate-then-rank pipeline over its best_of_n exploration: it evaluates each leaf, DROPS leaves failing `feature_requirement[]` from its recommended survivors, then orders survivors by `rank_by`. The gate is internal pruning of which leaves the agent recommends/returns from its own exploration \u2014 it never blocks an already-produced billable leaf: what is produced and billed is governed by max_variants/max_creatives/max_spend, not the evaluator. When the evaluator names an external agent, it MUST appear in `creative_policy.accepted_verifiers[]` (off-list \u2192 EVALUATOR_AGENT_NOT_ACCEPTED), and the producing agent authenticates the outbound evaluator call on the transport. Evaluator credentials and caller-supplied trust material MUST NOT be passed in the build_creative payload; credential- or trust-material payload keys should be rejected with CREDENTIAL_IN_ARGS. When false or absent, the `evaluator` input is ignored and no `eval` block is emitted." + "description": "Experimental (x-status: experimental) — agents setting this true MUST also list `creative.evaluator` in `experimental_features`; the surface MAY change between 3.x releases with notice (see docs/reference/experimental-status). When true, build_creative accepts an advisory `evaluator` input (exemplars / account-arranged evaluator_id / agent_url, plus an optional `feature_requirement[]` gate, a `rank_by` ordering, and an allowlisted `feature_agent` pointer). Feature discovery uses this response's governance.creative_features catalog: rank_by, feature_requirement, and eval.features[] all share the same creative-feature vocabulary as get_creative_features. evaluator_id is not discovered from this catalog; it is a pre-provisioned account preset whose emitted feature_ids still come from it. The evaluator populates a per-leaf `eval` block of creative-feature values (creative-feature-result[], the same shape get_creative_features returns) on BuildCreativeVariantSuccess leaves, which is what the recommended/rank it sets on the best_of_n axis are computed over. The agent runs a gate-then-rank pipeline over its best_of_n exploration: it evaluates each leaf, DROPS leaves failing `feature_requirement[]` from its recommended survivors, then orders survivors by `rank_by`. The gate is internal pruning of which leaves the agent recommends/returns from its own exploration — it never blocks an already-produced billable leaf: what is produced and billed is governed by max_variants/max_creatives/max_spend, not the evaluator. When the evaluator names an external agent, it MUST appear in `creative_policy.accepted_verifiers[]` (off-list → EVALUATOR_AGENT_NOT_ACCEPTED), and the producing agent authenticates the outbound evaluator call on the transport. Evaluator credentials and caller-supplied trust material MUST NOT be passed in the build_creative payload; credential- or trust-material payload keys should be rejected with CREDENTIAL_IN_ARGS. When false or absent, the `evaluator` input is ignored and no `eval` block is emitted." }, "refinable_retention_seconds": { "type": "integer", "minimum": 0, - "description": "When supports_refinement is true, the GUARANTEED-MINIMUM window (a floor, not a ceiling) during which a produced build_variant_id remains refinable via refine_from_build_variant_id: a ref within this window from production SHOULD resolve; the agent MAY retain longer. Omit when the retention window is agent-defined and not advertised \u2014 buyers then treat refinability as best-effort and handle REFERENCE_NOT_FOUND." + "description": "When supports_refinement is true, the GUARANTEED-MINIMUM window (a floor, not a ceiling) during which a produced build_variant_id remains refinable via refine_from_build_variant_id: a ref within this window from production SHOULD resolve; the agent MAY retain longer. Omit when the retention window is agent-defined and not advertised — buyers then treat refinability as best-effort and handle REFERENCE_NOT_FOUND." }, "multiplicity": { "type": "object", - "description": "Pre-call discriminators for build_creative fan-out, so a buyer knows BEFORE sending max_creatives / max_variants whether this agent supports them and the ceilings. Over-limit requests are CLAMPED to these ceilings (the agent produces up to the limit and signals the shortfall via items_returned < items_total on BuildCreativeVariantSuccess), not rejected \u2014 consistent with item_limit's 'use the lesser' rule. Absent means no fan-out: build_creative produces a single creative and max_creatives/max_variants>1 are not supported.", + "description": "Pre-call discriminators for build_creative fan-out, so a buyer knows BEFORE sending max_creatives / max_variants whether this agent supports them and the ceilings. Over-limit requests are CLAMPED to these ceilings (the agent produces up to the limit and signals the shortfall via items_returned < items_total on BuildCreativeVariantSuccess), not rejected — consistent with item_limit's 'use the lesser' rule. Absent means no fan-out: build_creative produces a single creative and max_creatives/max_variants>1 are not supported.", "properties": { "supports_catalog_fanout": { "type": "boolean", @@ -2695,7 +2365,7 @@ "type": "boolean", "default": false, "x-status": "experimental", - "description": "Experimental (x-status: experimental) \u2014 agents setting this true MUST also list `creative.signal_fanout` in `experimental_features`; the surface MAY change between 3.x releases with notice (see docs/reference/experimental-status). When true, build_creative accepts signal_conditions[] (one distinct creative group per signal condition, keep-all). Mirrors supports_catalog_fanout." + "description": "Experimental (x-status: experimental) — agents setting this true MUST also list `creative.signal_fanout` in `experimental_features`; the surface MAY change between 3.x releases with notice (see docs/reference/experimental-status). When true, build_creative accepts signal_conditions[] (one distinct creative group per signal condition, keep-all). Mirrors supports_catalog_fanout." }, "max_signal_conditions_limit": { "type": "integer", @@ -2733,7 +2403,7 @@ "x-status": "experimental", "description": "Which selection_strategy values this agent supports when sampling max_creatives < items_total. Sibling to variant_dimensions. Part of the experimental signal-fanout surface (feature id `creative.signal_fanout`).", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/creative-selection-strategy.json" + "$ref": "/schemas/enums/creative-selection-strategy.json" }, "uniqueItems": true } @@ -2753,48 +2423,35 @@ }, "format": { "description": "Format declaration on which this agent can perform the listed operations. Creative-agent capability self-description has no seller production authority, so tracker_execution_contract and tracker_execution_contract_digest are forbidden.", - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/creative-operation-format-declaration.json" + "$ref": "/schemas/core/creative-operation-format-declaration.json" }, "operations": { "type": "array", "description": "Creative operations this capability supports. `build` means the agent can produce a conforming manifest via build_creative; `validate` means it can evaluate inputs against the declaration; `preview` means it can render a preview. New 3.2 producers MUST emit this field so buyers and registries can distinguish producers, validators, and renderers without probing tasks. Consumers interpret omission from a legacy 3.x entry as `[\"build\"]`.", "items": { "type": "string", - "enum": [ - "build", - "validate", - "preview" - ] + "enum": ["build", "validate", "preview"] }, "minItems": 1, "uniqueItems": true, - "default": [ - "build" - ] + "default": ["build"] } }, - "required": [ - "format" - ], + "required": ["format"], "additionalProperties": true } }, "preview": { "type": "object", "description": "Per-route preview_creative capability metadata. New 3.2 producers whose supported_formats[] explicitly advertises a routable preview operation MUST emit this block. rendering_origin describes how each route is implemented but is informational and never grants presentation authority: only a matching publisher-origin placement preview_provider delegation can do that. routes[].capability_id MUST equal the set of capability IDs on supported_formats[] entries whose operations contains preview.", - "required": [ - "routes" - ], + "required": ["routes"], "properties": { "routes": { "type": "array", "description": "Agent-local preview routes and their implementation origin. Authority is resolved from publisher placement delegation, never from this self-description.", "items": { "type": "object", - "required": [ - "capability_id", - "rendering_origin" - ], + "required": ["capability_id", "rendering_origin"], "properties": { "capability_id": { "type": "string", @@ -2803,10 +2460,7 @@ }, "rendering_origin": { "type": "string", - "enum": [ - "platform_native", - "agent_approximation" - ], + "enum": ["platform_native", "agent_approximation"], "description": "Informational implementation origin. platform_native means the route uses the serving platform's preview machinery; agent_approximation means the agent renders an approximation. Neither value grants authority without a publisher preview_provider delegation." } }, @@ -2814,9 +2468,7 @@ }, "minItems": 1, "x-adcp-validation": { - "unique_item_properties": [ - "capability_id" - ] + "unique_item_properties": ["capability_id"] } } }, @@ -2844,26 +2496,12 @@ "description": "The required deterministic locale-matching algorithm." } }, - "required": [ - "locale_matching" - ], + "required": ["locale_matching"], "not": { "anyOf": [ - { - "required": [ - "supported_locales" - ] - }, - { - "required": [ - "translation_modes" - ] - }, - { - "required": [ - "review_scope" - ] - } + { "required": ["supported_locales"] }, + { "required": ["translation_modes"] }, + { "required": ["review_scope"] } ] }, "additionalProperties": true @@ -2876,50 +2514,34 @@ "canonical_catalog_version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$", - "description": "Optional. The AdCP canonical-formats catalog version this agent's runtime is built against (e.g., `3.1`, `3.2.0`). Lets buyer SDKs detect canonical-catalog skew between their generated types and the seller's actual support. SDKs MAY declare the version they were generated against (typically the AdCP version they ship for); when seller and SDK versions disagree, SDKs SHOULD soft-warn rather than fail (the open-enum semantics on `canonical-format-kind.json` make unknown canonicals safe to retain, so skew is not a hard error \u2014 it just means the older side might not understand newer canonical values). Omitted by sellers who haven't yet generated against a versioned catalog; absence is interpreted as the AdCP version advertised by the broader capabilities response." + "description": "Optional. The AdCP canonical-formats catalog version this agent's runtime is built against (e.g., `3.1`, `3.2.0`). Lets buyer SDKs detect canonical-catalog skew between their generated types and the seller's actual support. SDKs MAY declare the version they were generated against (typically the AdCP version they ship for); when seller and SDK versions disagree, SDKs SHOULD soft-warn rather than fail (the open-enum semantics on `canonical-format-kind.json` make unknown canonicals safe to retain, so skew is not a hard error — it just means the older side might not understand newer canonical values). Omitted by sellers who haven't yet generated against a versioned catalog; absence is interpreted as the AdCP version advertised by the broader capabilities response." } }, "additionalProperties": true, "allOf": [ { "if": { - "required": [ - "localization" - ] + "required": ["localization"] }, "then": { "properties": { - "has_creative_library": { - "type": "boolean", - "const": true - } + "has_creative_library": { "type": "boolean", "const": true } }, - "required": [ - "has_creative_library" - ] + "required": ["has_creative_library"] } }, { "if": { "properties": { - "supports_revisions": { - "const": true - } + "supports_revisions": { "const": true } }, - "required": [ - "supports_revisions" - ] + "required": ["supports_revisions"] }, "then": { "properties": { - "has_creative_library": { - "type": "boolean", - "const": true - } + "has_creative_library": { "type": "boolean", "const": true } }, - "required": [ - "has_creative_library" - ] + "required": ["has_creative_library"] } }, { @@ -2933,38 +2555,25 @@ "type": "string" }, "operations": { - "contains": { - "const": "preview" - } + "contains": { "const": "preview" } } }, - "required": [ - "capability_id", - "operations" - ] + "required": ["capability_id", "operations"] } } }, - "required": [ - "supported_formats" - ] + "required": ["supported_formats"] }, "then": { - "required": [ - "preview" - ] + "required": ["preview"] } }, { "if": { - "required": [ - "preview" - ] + "required": ["preview"] }, "then": { - "required": [ - "supported_formats" - ] + "required": ["supported_formats"] } } ] @@ -2978,9 +2587,7 @@ "description": "Whether this agent accepts OAuth access tokens and publishes the discovery metadata needed to obtain and validate them. A true value is an explicit conformance claim: the RFC 9728 protected-resource document and every RFC 8414 authorization-server document it references MUST be reachable, internally consistent, and safe for clients to follow. False or absent means the OAuth metadata storyboard is not applicable; it does not weaken the universal requirement to implement at least one authentication mechanism." } }, - "required": [ - "supported" - ], + "required": ["supported"], "additionalProperties": true }, "request_signing": { @@ -2993,16 +2600,12 @@ }, "covers_content_digest": { "type": "string", - "enum": [ - "required", - "forbidden", - "either" - ], + "enum": ["required", "forbidden", "either"], "description": "Policy for content-digest coverage in request signatures. In AdCP 3.2 and later, an agent with request_signing.supported=true MUST explicitly emit 'required': every accepted signature on a request with a body covers content-digest, and a body-unbound signature is rejected with request_signature_components_incomplete. Omission retains the legacy effective default of 'either' only for a 3.0/3.1 response; 3.2 responses require this field explicitly. 'either' and 'forbidden' are deprecated legacy 3.0/3.1 postures retained only for version negotiation with pre-3.2 peers; they MUST NOT be advertised as a 3.2 signing posture and are removed in 4.0. A shared endpoint MUST select the verifier policy from trusted endpoint configuration and negotiated capabilities before dispatch, never from an unbound request-body version field." }, "required_for": { "type": "array", - "description": "AdCP protocol operation names (e.g., 'create_media_buy') for which this agent rejects an unsigned request with request_signature_required unless an independently valid configured fallback authenticator succeeds. 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. JSON-RPC protocol method names like `tasks/cancel` belong in `protocol_methods_required_for`, not here. 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.). Every operation listed MUST also appear in `supported_for`; see `x-adcp-validation`.", + "description": "AdCP protocol operation names (e.g., 'create_media_buy') for which this agent rejects an unsigned request with request_signature_required unless an independently valid configured fallback authenticator succeeds. 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. JSON-RPC protocol method names like `tasks/cancel` belong in `protocol_methods_required_for`, not here. 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.). Every operation listed MUST also appear in `supported_for`; see `x-adcp-validation`.", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" @@ -3042,9 +2645,7 @@ "type": "string", "maxLength": 256, "pattern": "^(?:[a-z][A-Za-z0-9_]*(?:/[A-Za-z][A-Za-z0-9_]*)+|[A-Z][A-Za-z0-9_]*)$", - "not": { - "const": "tools/call" - } + "not": { "const": "tools/call" } }, "default": [], "x-adcp-validation": { @@ -3058,9 +2659,7 @@ "type": "string", "maxLength": 256, "pattern": "^(?:[a-z][A-Za-z0-9_]*(?:/[A-Za-z][A-Za-z0-9_]*)+|[A-Z][A-Za-z0-9_]*)$", - "not": { - "const": "tools/call" - } + "not": { "const": "tools/call" } }, "default": [], "x-adcp-validation": { @@ -3076,9 +2675,7 @@ "type": "string", "maxLength": 256, "pattern": "^(?:[a-z][A-Za-z0-9_]*(?:/[A-Za-z][A-Za-z0-9_]*)+|[A-Z][A-Za-z0-9_]*)$", - "not": { - "const": "tools/call" - } + "not": { "const": "tools/call" } }, "default": [], "x-adcp-validation": { @@ -3087,9 +2684,7 @@ } } }, - "required": [ - "supported" - ] + "required": ["supported"] }, "webhook_signing": { "type": "object", @@ -3097,7 +2692,7 @@ "properties": { "supported": { "type": "boolean", - "description": "Whether this agent signs outbound webhooks with the AdCP RFC 9421 webhook profile. When false or absent, webhooks are delivered with legacy Bearer or HMAC-SHA256 auth only and receivers MUST NOT expect a Signature header. When the seller advertises mutating-webhook emission (i.e., `media_buy.reporting_delivery_methods` includes `webhook`, `media_buy.content_standards.supports_webhook_delivery` is true, `media_buy.relationship_notifications.supported` is true, `wholesale_feed_webhooks.supported` is true, `adcp.capability_changes.notifications.supported` is true, or `account.notifications.supported` is true), this MUST be `true` \u2014 emitting state-changing webhooks unsigned is a downgrade vector that lets an on-path attacker forge delivery callbacks. See `x-adcp-validation`.", + "description": "Whether this agent signs outbound webhooks with the AdCP RFC 9421 webhook profile. When false or absent, webhooks are delivered with legacy Bearer or HMAC-SHA256 auth only and receivers MUST NOT expect a Signature header. When the seller advertises mutating-webhook emission (i.e., `media_buy.reporting_delivery_methods` includes `webhook`, `media_buy.content_standards.supports_webhook_delivery` is true, `media_buy.relationship_notifications.supported` is true, `wholesale_feed_webhooks.supported` is true, `adcp.capability_changes.notifications.supported` is true, or `account.notifications.supported` is true), this MUST be `true` — emitting state-changing webhooks unsigned is a downgrade vector that lets an on-path attacker forge delivery callbacks. See `x-adcp-validation`.", "x-adcp-validation": { "verifier_constraints": { "must_equal_when": { @@ -3135,9 +2730,7 @@ }, "profile": { "type": "string", - "enum": [ - "adcp/webhook-signing/v1" - ], + "enum": ["adcp/webhook-signing/v1"], "description": "Identifier of the webhook-signing profile version the agent emits. Value MUST match the `tag=` parameter emitted in the RFC 9421 `Signature-Input` header (see docs/building/implementation/webhooks.mdx) so receivers can statically validate the declared profile against the on-wire tag. Closed enum; future profile revisions will extend this enum in a follow-up schema bump." }, "algorithms": { @@ -3145,10 +2738,7 @@ "description": "Signature algorithms this agent uses on outbound webhooks. 3.0 profile permits 'ed25519' and 'ecdsa-p256-sha256' only; other values are reserved for future profile versions and MUST NOT be emitted under adcp/webhook-signing/v1.", "items": { "type": "string", - "enum": [ - "ed25519", - "ecdsa-p256-sha256" - ] + "enum": ["ed25519", "ecdsa-p256-sha256"] }, "minItems": 1, "uniqueItems": true @@ -3156,7 +2746,7 @@ "legacy_hmac_fallback": { "type": "boolean", "deprecated": true, - "description": "Whether this agent will fall back to HMAC-SHA256 on the legacy push_notification_config.authentication, accounts[].notification_configs[].authentication, or sync_agent_notification_configs.notification_configs[].authentication paths for receivers that have not adopted RFC 9421. Deprecated; removed in AdCP 4.0.", + "description": "Whether this agent will fall back to HMAC-SHA256 on the legacy push_notification_config.authentication, accounts[].notification_configs[].authentication, sync_agent_configuration.configuration.notification_configs[].authentication, or sync_agent_notification_configs.notification_configs[].authentication paths for receivers that have not adopted RFC 9421. Deprecated; removed in AdCP 4.0.", "default": false }, "delivery_retry_horizon_seconds": { @@ -3166,19 +2756,17 @@ "maximum": 604800 } }, - "required": [ - "supported" - ] + "required": ["supported"] }, "identity": { "type": "object", - "description": "Operator identity posture \u2014 trust-root pointer (`brand_json_url`) plus key-scoping and compromise-response controls the agent operates. `brand_json_url` is **load-bearing** for signature verification: when the agent declares any signing posture (`request_signing.supported_for`/`required_for` non-empty, `webhook_signing.supported === true`, or any `key_origins` subfield), `brand_json_url` MUST be present (storyboard-enforced in 3.x; schema-required in 4.0). Verifiers use it to bootstrap from the agent URL to the operator's brand.json (and from there to signing keys); see [security.mdx \u00a7Discovering an agent's signing keys](https://adcontextprotocol.org/docs/building/by-layer/L1/security#discovering-an-agents-signing-keys-via-brand_json_url). The remaining fields (`per_principal_key_isolation`, `key_origins`, `compromise_notification`) are advisory and receivers use them to reason about blast radius and revocation latency at onboarding. Empty-object semantics: `identity: {}` means \"posture block present but no posture claimed\" \u2014 schema-valid but advisory-neutral and receivers MUST treat it as equivalent to omitting the block, **except** that an agent declaring a signing posture elsewhere in the response with an empty `identity` MUST be rejected by storyboard runners as missing `brand_json_url`.", + "description": "Operator identity posture — trust-root pointer (`brand_json_url`) plus key-scoping and compromise-response controls the agent operates. `brand_json_url` is **load-bearing** for signature verification: when the agent declares any signing posture (`request_signing.supported_for`/`required_for` non-empty, `webhook_signing.supported === true`, or any `key_origins` subfield), `brand_json_url` MUST be present (storyboard-enforced in 3.x; schema-required in 4.0). Verifiers use it to bootstrap from the agent URL to the operator's brand.json (and from there to signing keys); see [security.mdx §Discovering an agent's signing keys](https://adcontextprotocol.org/docs/building/by-layer/L1/security#discovering-an-agents-signing-keys-via-brand_json_url). The remaining fields (`per_principal_key_isolation`, `key_origins`, `compromise_notification`) are advisory and receivers use them to reason about blast radius and revocation latency at onboarding. Empty-object semantics: `identity: {}` means \"posture block present but no posture claimed\" — schema-valid but advisory-neutral and receivers MUST treat it as equivalent to omitting the block, **except** that an agent declaring a signing posture elsewhere in the response with an empty `identity` MUST be rejected by storyboard runners as missing `brand_json_url`.", "properties": { "brand_json_url": { "type": "string", "format": "uri", "pattern": "^https://", - "description": "HTTPS URL of the operator's brand.json (typically `https://{operator-domain}/.well-known/brand.json`). Trust-root pointer for this agent's signing keys. See [security.mdx \u00a7Discovering an agent's signing keys via `brand_json_url`](https://adcontextprotocol.org/docs/building/by-layer/L1/security#discovering-an-agents-signing-keys-via-brand_json_url) for the verifier algorithm and `x-adcp-validation` for structured constraints. Distinct from `sponsored_intelligence.brand_url`, which is a rendering pointer for SI agent visuals \u2014 verifiers MUST use this field for key discovery and MUST NOT fall back to `sponsored_intelligence.brand_url` as a trust-root pointer.", + "description": "HTTPS URL of the operator's brand.json (typically `https://{operator-domain}/.well-known/brand.json`). Trust-root pointer for this agent's signing keys. See [security.mdx §Discovering an agent's signing keys via `brand_json_url`](https://adcontextprotocol.org/docs/building/by-layer/L1/security#discovering-an-agents-signing-keys-via-brand_json_url) for the verifier algorithm and `x-adcp-validation` for structured constraints. Distinct from `sponsored_intelligence.brand_url`, which is a rendering pointer for SI agent visuals — verifiers MUST use this field for key discovery and MUST NOT fall back to `sponsored_intelligence.brand_url` as a trust-root pointer.", "x-adcp-validation": { "trust_root": true, "required_when": { @@ -3229,7 +2817,7 @@ }, "key_origins": { "type": "object", - "description": "Map of signing-key surface/purpose \u2192 publishing origin, so counterparties can verify origin separation (e.g., governance keys served from a separate origin than transport/webhook keys) at onboarding. Absent means the operator has not declared a separation scheme; receivers SHOULD assume shared-origin. Every entry listed MUST have a corresponding signing posture declared elsewhere \u2014 `request_signing` requires non-empty `request_signing.supported_for`/`required_for`/`protocol_methods_supported_for`/`protocol_methods_required_for`; `webhook_signing` requires `webhook_signing.supported === true` and names the webhook delivery surface, not a required live `adcp_use: \"webhook-signing\"` key purpose \u2014 otherwise the consistency check at signature-verification time has nothing to anchor against. See `x-adcp-validation` and docs/building/implementation/security.mdx \u00a7Origin separation.", + "description": "Map of signing-key surface/purpose → publishing origin, so counterparties can verify origin separation (e.g., governance keys served from a separate origin than transport/webhook keys) at onboarding. Absent means the operator has not declared a separation scheme; receivers SHOULD assume shared-origin. Every entry listed MUST have a corresponding signing posture declared elsewhere — `request_signing` requires non-empty `request_signing.supported_for`/`required_for`/`protocol_methods_supported_for`/`protocol_methods_required_for`; `webhook_signing` requires `webhook_signing.supported === true` and names the webhook delivery surface, not a required live `adcp_use: \"webhook-signing\"` key purpose — otherwise the consistency check at signature-verification time has nothing to anchor against. See `x-adcp-validation` and docs/building/implementation/security.mdx §Origin separation.", "properties": { "governance_signing": { "type": "string", @@ -3267,7 +2855,7 @@ }, "compromise_notification": { "type": "object", - "description": "Whether this agent emits the `identity.compromise_notification` webhook event on key revocation due to known or suspected compromise (as opposed to scheduled rotation). Subscribers use this to bound the window between compromise detected and verifiers converging on revocation. See docs/building/implementation/webhooks.mdx \u00a7identity.compromise_notification.", + "description": "Whether this agent emits the `identity.compromise_notification` webhook event on key revocation due to known or suspected compromise (as opposed to scheduled rotation). Subscribers use this to bound the window between compromise detected and verifiers converging on revocation. See docs/building/implementation/webhooks.mdx §identity.compromise_notification.", "properties": { "emits": { "type": "boolean", @@ -3301,10 +2889,7 @@ "description": "Task providers call on the orchestrator gateway to return one compact assertion." } }, - "required": [ - "delivery_task", - "feedback_task" - ], + "required": ["delivery_task", "feedback_task"], "additionalProperties": true }, "measurement": { @@ -3324,13 +2909,13 @@ "type": "object", "properties": { "metric_id": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/vendor-metric-id.json", + "$ref": "/schemas/core/vendor-metric-id.json", "description": "Identifier for the metric within the vendor's vocabulary. Combined with the agent's BrandRef, forms the canonical tuple `(vendor.domain, vendor.brand_id, metric_id)`. Each metric_id MUST be unique within a single agent's catalog." }, "standard_reference": { "type": "string", "format": "uri", - "description": "Optional URI pointing at the published standard this metric IMPLEMENTS (e.g., IAB Attention Measurement Guidelines, MRC Viewable Impression Measurement, GARM emissions framework). Distinct from `accreditations[]` \u2014 `standard_reference` is what the metric is built against; `accreditations[]` is third-party certification that the implementation actually conforms. Buyer agents normalizing across vendors SHOULD apply the AdCP URL canonicalization rules before comparing \u2014 vendors implementing the same standard MAY use different URL forms for the same canonical document." + "description": "Optional URI pointing at the published standard this metric IMPLEMENTS (e.g., IAB Attention Measurement Guidelines, MRC Viewable Impression Measurement, GARM emissions framework). Distinct from `accreditations[]` — `standard_reference` is what the metric is built against; `accreditations[]` is third-party certification that the implementation actually conforms. Buyer agents normalizing across vendors SHOULD apply the AdCP URL canonicalization rules before comparing — vendors implementing the same standard MAY use different URL forms for the same canonical document." }, "accreditations": { "type": "array", @@ -3340,7 +2925,7 @@ "properties": { "accrediting_body": { "type": "string", - "description": "Accrediting organization \u2014 open string (the global landscape includes MRC, ARF, ABC, BARB, JICWEBS, AGOF, JIC bodies in many markets). Use the canonical short name where one exists.", + "description": "Accrediting organization — open string (the global landscape includes MRC, ARF, ABC, BARB, JICWEBS, AGOF, JIC bodies in many markets). Use the canonical short name where one exists.", "examples": [ "MRC", "ARF", @@ -3357,7 +2942,7 @@ "valid_until": { "type": "string", "format": "date", - "description": "Optional ISO 8601 date when the current accreditation expires. Buyers MAY treat post-expiry data as un-accredited. Absence means the vendor does not assert an expiry \u2014 buyers SHOULD verify currency at the accrediting body's directory." + "description": "Optional ISO 8601 date when the current accreditation expires. Buyers MAY treat post-expiry data as un-accredited. Absence means the vendor does not assert an expiry — buyers SHOULD verify currency at the accrediting body's directory." }, "evidence_url": { "type": "string", @@ -3365,9 +2950,7 @@ "description": "Optional URL pointing at the accrediting body's public listing for this certification (the buyer's path to verify the claim independently)." } }, - "required": [ - "accrediting_body" - ], + "required": ["accrediting_body"], "additionalProperties": false }, "uniqueItems": true @@ -3397,28 +2980,20 @@ "methodology_version": { "type": "string", "description": "Optional version identifier (semver, ISO date, or vendor-defined version string) for the methodology this metric currently implements. When present, buyer agents pin the contracted version on `committed_metrics` so silent vendor methodology changes are detectable; absence means the vendor does not version their methodology and buyers MUST treat any change as untracked.", - "examples": [ - "v2.1", - "2026-Q1", - "1.0" - ] + "examples": ["v2.1", "2026-Q1", "1.0"] }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" } }, - "required": [ - "metric_id" - ], + "required": ["metric_id"], "additionalProperties": false }, "minItems": 1, "uniqueItems": true } }, - "required": [ - "metrics" - ] + "required": ["metrics"] }, "compliance_testing": { "type": "object", @@ -3426,23 +3001,21 @@ "properties": { "scenarios": { "type": "array", - "description": "Compliance testing scenarios this agent supports. Must be non-empty \u2014 at least one scenario. Values SHOULD include every canonical controller scenario the agent implements, excluding list_scenarios because that value is a discovery operation rather than a test capability. Values MAY also include implementation-specific scenarios. Callers can 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. Values SHOULD include every canonical controller scenario the agent implements, excluding list_scenarios because that value is a discovery operation rather than a test capability. Values MAY also include implementation-specific scenarios. Callers can use comply_test_controller with scenario: 'list_scenarios' to discover supported scenarios at runtime.", "items": { "type": "string" }, "minItems": 1 } }, - "required": [ - "scenarios" - ], + "required": ["scenarios"], "additionalProperties": true }, "specialisms": { "type": "array", - "description": "Optional \u2014 specialized compliance claims this agent supports. Values MUST be kebab-case enum IDs (e.g., 'creative-generative', 'sales-non-guaranteed'). An agent that implements a specialism's tools but omits its ID from this array will receive 'No applicable tracks found' from the compliance runner \u2014 tracks for that specialism are not evaluated even if every tool works. 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. Values MUST be kebab-case enum IDs (e.g., 'creative-generative', 'sales-non-guaranteed'). An agent that implements a specialism's tools but omits its ID from this array will receive 'No applicable tracks found' from the compliance runner — tracks for that specialism are not evaluated even if every tool works. 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": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/enums/specialism.json" + "$ref": "/schemas/enums/specialism.json" }, "uniqueItems": true }, @@ -3458,7 +3031,7 @@ }, "experimental_features": { "type": "array", - "description": "Experimental AdCP surfaces this agent implements. A surface is experimental when its schema carries x-status: experimental and the working group has not yet frozen it. Sellers that implement any experimental surface MUST list its feature id here. Buyers inspect this array before relying on experimental surfaces \u2014 a seller that does not list a surface is asserting it does not implement it. Experimental surfaces MAY break between any two 3.x releases with at least 6 weeks notice; the full contract is in docs/reference/experimental-status.", + "description": "Experimental AdCP surfaces this agent implements. A surface is experimental when its schema carries x-status: experimental and the working group has not yet frozen it. Sellers that implement any experimental surface MUST list its feature id here. Buyers inspect this array before relying on experimental surfaces — a seller that does not list a surface is asserting it does not implement it. Experimental surfaces MAY break between any two 3.x releases with at least 6 weeks notice; the full contract is in docs/reference/experimental-status.", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$", @@ -3468,7 +3041,7 @@ }, "wholesale_feed_versioning": { "type": "object", - "description": "Conditional-fetch token capabilities for get_products and get_signals. Independent of wholesale feed webhooks: an agent MAY support cheap version probes via if_wholesale_feed_version without pushing change payloads (and vice versa). When supported is true, the agent returns wholesale_feed_version on every get_products / get_signals response and honors if_wholesale_feed_version on subsequent requests. When absent or supported is false, callers MAY still send if_wholesale_feed_version \u2014 pre-3.1 agents that ignore it just return the full payload (correct, just inefficient). Pre-flight declaration here lets buyers fast-path which agents to bother caching versions for. See get_products / get_signals 'Wholesale feed versioning' sections.", + "description": "Conditional-fetch token capabilities for get_products and get_signals. Independent of wholesale feed webhooks: an agent MAY support cheap version probes via if_wholesale_feed_version without pushing change payloads (and vice versa). When supported is true, the agent returns wholesale_feed_version on every get_products / get_signals response and honors if_wholesale_feed_version on subsequent requests. When absent or supported is false, callers MAY still send if_wholesale_feed_version — pre-3.1 agents that ignore it just return the full payload (correct, just inefficient). Pre-flight declaration here lets buyers fast-path which agents to bother caching versions for. See get_products / get_signals 'Wholesale feed versioning' sections.", "properties": { "supported": { "type": "boolean", @@ -3476,16 +3049,14 @@ }, "pricing_version_separate": { "type": "boolean", - "description": "Whether the agent tracks pricing_version independently of wholesale_feed_version. When true, the agent returns both tokens and honors if_pricing_version separately \u2014 useful for rate-card sweeps that don't change product and signal metadata. When false or absent, the agent collapses both into wholesale_feed_version; callers SHOULD NOT send if_pricing_version (it will be ignored and may produce INVALID_REQUEST when sent without if_wholesale_feed_version per the dependencies rule)." + "description": "Whether the agent tracks pricing_version independently of wholesale_feed_version. When true, the agent returns both tokens and honors if_pricing_version separately — useful for rate-card sweeps that don't change product and signal metadata. When false or absent, the agent collapses both into wholesale_feed_version; callers SHOULD NOT send if_pricing_version (it will be ignored and may produce INVALID_REQUEST when sent without if_wholesale_feed_version per the dependencies rule)." }, "cache_scope_account": { "type": "boolean", - "description": "Whether the agent ever returns cache_scope: 'account' (i.e., publishes per-account overlays distinct from the public rate card). When true, buyers MUST be prepared to maintain account-overlay caches alongside the public layer. When false or absent, all responses are cache_scope: 'public' regardless of whether account was provided \u2014 the agent's rate card is universal. Confidentiality note: declaring true advertises that the agent runs custom-pricing deals (low-grade market-posture signal); agents preferring not to disclose this MAY omit the field and let consumers detect-on-call via cache_scope on response." + "description": "Whether the agent ever returns cache_scope: 'account' (i.e., publishes per-account overlays distinct from the public rate card). When true, buyers MUST be prepared to maintain account-overlay caches alongside the public layer. When false or absent, all responses are cache_scope: 'public' regardless of whether account was provided — the agent's rate card is universal. Confidentiality note: declaring true advertises that the agent runs custom-pricing deals (low-grade market-posture signal); agents preferring not to disclose this MAY omit the field and let consumers detect-on-call via cache_scope on response." } }, - "required": [ - "supported" - ] + "required": ["supported"] }, "last_updated": { "type": "string", @@ -3496,14 +3067,14 @@ "type": "array", "description": "Task-specific errors and warnings", "items": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/error.json" + "$ref": "/schemas/core/error.json" } }, "context": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/context.json" + "$ref": "/schemas/core/context.json" }, "ext": { - "$ref": "https://adcontextprotocol.org/schemas/3.2.0-beta.9/core/ext.json" + "$ref": "/schemas/core/ext.json" }, "wholesale_feed_webhooks": { "type": "object", @@ -3560,15 +3131,10 @@ } } }, - "required": [ - "supported" - ], + "required": ["supported"], "additionalProperties": true } }, - "required": [ - "adcp", - "supported_protocols" - ], + "required": ["adcp", "supported_protocols"], "additionalProperties": true -} \ No newline at end of file +} diff --git a/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-request.json b/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-request.json new file mode 100644 index 000000000..dab760f5b --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-request.json @@ -0,0 +1,138 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/protocol/sync-agent-configuration-request.json", + "title": "Sync Agent Configuration Request", + "x-status": "experimental", + "description": "Declaratively synchronize selected sections of the authenticated caller's durable connection with one AdCP agent. Identity is resolved from authenticated transport and MUST NOT be accepted from request-body agent URLs, signing key IDs, account IDs, or other self-asserted fields. Each present section is the caller's complete desired set and replaces only that section; omitted sections remain unchanged. All submitted sections apply atomically or none do. This task configures reusable connection resources but grants no advertiser-account authority. Sellers implementing it MUST advertise adcp.agent_configuration and protocol.agent_configuration.", + "x-tool-summary": "Synchronize caller-scoped webhooks and reusable reporting destinations for this agent connection.", + "type": "object", + "allOf": [ + { + "$ref": "/schemas/core/version-envelope.json" + }, + { + "not": { + "anyOf": [ + { "required": ["buyer_agent_url"] }, + { "required": ["agent_url"] }, + { "required": ["principal_id"] }, + { "required": ["connection_id"] } + ] + } + } + ], + "x-mutates-state": true, + "properties": { + "idempotency_key": { + "type": "string", + "description": "Client-generated key for at-most-once execution. Retries MUST reuse the same key with the same body.", + "minLength": 16, + "maxLength": 255, + "pattern": "^[A-Za-z0-9_.:-]{16,255}$" + }, + "expected_configuration_version": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Optional optimistic-concurrency fence returned by a previous successful sync. When present and stale, the seller rejects the whole request without mutation. Compare only for equality." + }, + "configuration": { + "type": "object", + "description": "Sections to replace atomically. At least one section is required. A present array is complete desired state for that section; [] clears it; omission leaves it unchanged.", + "properties": { + "notification_configs": { + "type": "array", + "description": "Complete desired agent-level subscriber set. The same caller-scoping, proof-of-control, secret handling, and replacement rules as sync_agent_notification_configs apply.", + "items": { + "allOf": [ + { + "$ref": "/schemas/core/agent-notification-config.json" + }, + { + "if": { + "required": ["authentication"] + }, + "then": { + "properties": { + "authentication": { + "required": ["credentials"] + } + } + } + } + ] + }, + "maxItems": 16 + }, + "reporting_destinations": { + "type": "array", + "description": "Complete desired reusable reporting destination set. [] deactivates/removes the caller's connection-level bindings for new use; it does not delete caller-owned data already delivered. destination_id values MUST be unique.", + "items": { + "$ref": "/schemas/core/agent-reporting-destination.json" + }, + "maxItems": 64 + } + }, + "minProperties": 1, + "additionalProperties": false + }, + "dry_run": { + "type": "boolean", + "default": false, + "description": "Validate the proposed replacements and report the would-be action without persisting them, issuing durable identifiers or grants, or sending endpoint proof challenges." + }, + "context": { + "$ref": "/schemas/core/context.json" + }, + "ext": { + "$ref": "/schemas/core/ext.json" + } + }, + "required": ["idempotency_key", "configuration"], + "additionalProperties": true, + "x-adcp-validation": { + "stable_principal": "Reject NO_AUTH, anonymous, or unstable caller identities. Ownership is the server-resolved stable authenticated principal, not the current signing key, token, request-body identity, or connection_id. Key rotation and token renewal preserve configuration only when the server maps them to the same principal.", + "atomic_sections": "Validate every submitted section, uniqueness constraint, and authorization check before commit; failure leaves all prior sections unchanged. A proof-bound resource may persist as validating or action_required, but cannot become ready until proof succeeds. Active notification subscribers require endpoint proof before replacement. dry_run performs no grants, challenges, or persistence.", + "optimistic_concurrency": "After resolving an exact idempotent replay, when expected_configuration_version is present and does not equal the current version, reject a new operation with CONFLICT without revealing another principal's version or configuration. Idempotency lookup precedes the version fence so a lost successful response remains replayable after the persisted version advances.", + "compatibility": "A notification_configs update has the same effect as sync_agent_notification_configs for that authenticated caller. Implementations supporting both tasks MUST expose one underlying subscriber set, not divergent copies." + }, + "examples": [ + { + "description": "Register one capability webhook and two reusable reporting destinations", + "data": { + "idempotency_key": "528f1f06-e2a7-49b9-bd13-c953f35a1c49", + "configuration": { + "notification_configs": [ + { + "subscriber_id": "buyer-events", + "url": "https://buyer.example/webhooks/adcp", + "event_types": ["capabilities.changed"], + "active": true + } + ], + "reporting_destinations": [ + { + "pattern": "file_transfer", + "destination_id": "reporting-archive", + "active": true, + "provider": { "domain": "object-store.example" }, + "transport": "s3", + "location": "s3://pinnacle-reporting/adcp/", + "accepted_formats": ["parquet"], + "accepted_verification_profiles": ["manifest_checksums", "canonical_digest"] + }, + { + "pattern": "warehouse_materialization", + "destination_id": "analytics-warehouse", + "active": true, + "provider": { "domain": "data-warehouse.example" }, + "transport": "bigquery", + "location": "pinnacle-analytics.adcp_reporting", + "accepted_verification_profiles": ["native_commit", "canonical_digest"] + } + ] + } + } + } + ] +} diff --git a/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-response.json b/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-response.json new file mode 100644 index 000000000..824f8fcb9 --- /dev/null +++ b/schemas/cache/3.2.0-beta.9/protocol/sync-agent-configuration-response.json @@ -0,0 +1,154 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "/schemas/protocol/sync-agent-configuration-response.json", + "title": "Sync Agent Configuration Response", + "x-status": "experimental", + "description": "Result of synchronizing selected caller-scoped agent connection sections. Applied responses return the complete current credential-free configuration. Validated dry-run responses report the would-be action without issuing durable identifiers. Failed responses deliberately cannot carry connection identifiers, versions, or configuration state.", + "type": "object", + "allOf": [ + { + "$ref": "/schemas/core/version-envelope.json" + }, + { + "$ref": "/schemas/core/protocol-envelope.json" + } + ], + "properties": { + "result": { + "oneOf": [ + { + "title": "Applied agent configuration", + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "applied" + }, + "action": { + "type": "string", + "enum": ["updated", "unchanged", "cleared"], + "description": "Persisted outcome for the submitted sections." + }, + "dry_run": { + "type": "boolean", + "const": false + }, + "connection_id": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Seller-issued opaque identifier for this authenticated caller relationship. It is response-only, not a credential, not caller identity, and not advertiser-account authority." + }, + "configuration_version": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Opaque version of the persisted configuration. Compare only for equality and return it as expected_configuration_version on a later guarded replacement." + }, + "configuration": { + "$ref": "/schemas/core/agent-configuration-state.json" + }, + "warnings": { + "type": "array", + "items": { + "$ref": "/schemas/core/error.json" + }, + "maxItems": 16 + } + }, + "required": ["kind", "action", "dry_run", "connection_id", "configuration_version", "configuration"], + "additionalProperties": false + }, + { + "title": "Validated agent configuration dry run", + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "validated" + }, + "action": { + "type": "string", + "enum": ["would_update", "would_be_unchanged", "would_clear"] + }, + "dry_run": { + "type": "boolean", + "const": true + }, + "warnings": { + "type": "array", + "items": { + "$ref": "/schemas/core/error.json" + }, + "maxItems": 16 + } + }, + "required": ["kind", "action", "dry_run"], + "additionalProperties": false + }, + { + "title": "Failed agent configuration", + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "failed" + }, + "errors": { + "type": "array", + "items": { + "$ref": "/schemas/core/error.json" + }, + "minItems": 1, + "maxItems": 16 + } + }, + "required": ["kind", "errors"], + "additionalProperties": false + } + ] + }, + "context": { + "$ref": "/schemas/core/context.json" + }, + "ext": { + "$ref": "/schemas/core/ext.json" + } + }, + "required": ["result"], + "additionalProperties": true, + "examples": [ + { + "description": "Connection configuration updated", + "data": { + "status": "completed", + "result": { + "kind": "applied", + "action": "updated", + "dry_run": false, + "connection_id": "conn_01K4C6RGT5Q18VCPGXE7DDWQ5F", + "configuration_version": "cfg_01K4C6V2N5PC1TQAH9WTT8D2HP", + "configuration": { + "notification_configs": [], + "reporting_destinations": [ + { + "destination_id": "analytics-warehouse", + "destination_ref": "dest_01K4C6T6Q0A9E6Y3N1FQ1T8YKV", + "state": "ready", + "configuration": { + "pattern": "warehouse_materialization", + "destination_id": "analytics-warehouse", + "active": true, + "provider": { "domain": "data-warehouse.example" }, + "transport": "bigquery", + "location": "pinnacle-analytics.adcp_reporting", + "accepted_verification_profiles": ["native_commit", "canonical_digest"] + } + } + ] + } + } + } + } + ] +} diff --git a/scripts/consolidate_exports.py b/scripts/consolidate_exports.py index 88fea0913..fd0200200 100644 --- a/scripts/consolidate_exports.py +++ b/scripts/consolidate_exports.py @@ -41,6 +41,10 @@ # We need BOTH versions of these types available, so import them with qualified # names. KNOWN_COLLISIONS: dict[str, set[str]] = { + # Reporting coverage and structured reporting issues both carry the same + # package-id wire primitive. The containing public models are the stable + # API; these generated helper wrappers remain module-qualified. + "PackageId": {"reporting_coverage", "reporting_status_issue"}, # Reporting schedules use the same wire enum name for the advertised # schedule constraint and the installed, resolved account schedule. "Alignment": {"reporting_schedule", "reporting_schedule_offering"}, diff --git a/scripts/generate_types.py b/scripts/generate_types.py index c4472f94f..0bdc5bb06 100755 --- a/scripts/generate_types.py +++ b/scripts/generate_types.py @@ -119,6 +119,7 @@ def rewrite_refs(obj, current_schema_rel_path: Path): if "$ref" in obj: ref_path = obj["$ref"] file_part, separator, fragment = ref_path.partition("#") + canonical_url = file_part.startswith("https://adcontextprotocol.org/schemas/") # datamodel-code-generator rebases this cross-directory enum as # ``core/enums/...`` (and sibling macro schemas as ``core/core``) @@ -129,7 +130,9 @@ def rewrite_refs(obj, current_schema_rel_path: Path): r"(?:^|/)(enums/(?:macro-[^/]+|universal-macro)\.json|core/macro-[^/]+\.json|macro-[^/]+\.json)$", file_part, ) - if not fragment and macro_ref_match: + if not fragment and macro_ref_match and not ( + canonical_url and current_schema_rel_path in PRESERVE_CANONICAL_URL_REFS + ): target = macro_ref_match.group(1) if target.startswith("macro-"): target = f"core/{target}" @@ -143,7 +146,6 @@ def rewrite_refs(obj, current_schema_rel_path: Path): # local files. This keeps generation deterministic and lets the # generator reuse source models instead of inlining a duplicate # model graph for every remote reference. - canonical_url = file_part.startswith("https://adcontextprotocol.org/schemas/") preserve_canonical_url = ( canonical_url and current_schema_rel_path in PRESERVE_CANONICAL_URL_REFS ) @@ -167,16 +169,23 @@ def rewrite_refs(obj, current_schema_rel_path: Path): separator + fragment if separator else "" ) return obj - version_match = None + target_rel_path = None if not preserve_canonical_url: - version_match = re.match( - r"^(?:https://adcontextprotocol\.org)?/schemas/[^/]+/(.+)$", - file_part, - ) - if version_match: - # Extract the path after /schemas// - # e.g., "/schemas/3.0.0-beta.1/core/context.json" -> "core/context.json" - target_rel_path = version_match.group(1) + if canonical_url: + version_match = re.match( + r"^https://adcontextprotocol\.org/schemas/[^/]+/(.+)$", + file_part, + ) + if version_match: + # Canonical URLs include a version path segment. + target_rel_path = version_match.group(1) + elif file_part.startswith("/schemas/"): + # Source schemas use root-relative, unversioned references. + # Keep the first path component (for example ``enums`` or + # ``core``); it is a schema domain, not a version. + target_rel_path = file_part.removeprefix("/schemas/") + + if target_rel_path is not None: # Compute the shortest relative path from the current schema # to the target. Avoid logically equivalent root round-trips diff --git a/scripts/post_generate_fixes.py b/scripts/post_generate_fixes.py index 9a72f297e..e1842dd20 100644 --- a/scripts/post_generate_fixes.py +++ b/scripts/post_generate_fixes.py @@ -55,6 +55,20 @@ def _load_resolve_bundle_key(): _STR_ATTRIBUTE_NAMES = set(dir(str)) +def _resolve_schema_ref(schema_rel: Path, ref: str) -> Path: + """Resolve a schema reference without dropping root-relative domains.""" + file_ref = ref.split("#", 1)[0] + canonical_url = re.match( + r"^https://adcontextprotocol\.org/schemas/[^/]+/(.+)$", + file_ref, + ) + if canonical_url: + return Path(canonical_url.group(1)) + if file_ref.startswith("/schemas/"): + return Path(file_ref.removeprefix("/schemas/")) + return (SCHEMA_DIR / schema_rel.parent / file_ref).resolve().relative_to(SCHEMA_DIR.resolve()) + + def _sync_protocol_envelope_import(source: str) -> str: """Keep the ProtocolEnvelope import aligned with restored response arms.""" uses_protocol_envelope = "ProtocolEnvelope" in source.replace(_PROTOCOL_ENVELOPE_IMPORT, "") @@ -3323,20 +3337,6 @@ def _generated_class_name(schema_rel: Path) -> str: return name return class_names[-1] - def _resolve_ref(schema_rel: Path, ref: str) -> Path: - file_ref = ref.split("#", 1)[0] - canonical_url = re.match( - r"^https://adcontextprotocol\.org/schemas/[^/]+/(.+)$", - file_ref, - ) - if canonical_url: - return Path(canonical_url.group(1)) - if file_ref.startswith("/schemas/"): - return Path("/".join(file_ref.split("/")[3:])) - return ( - (SCHEMA_DIR / schema_rel.parent / file_ref).resolve().relative_to(SCHEMA_DIR.resolve()) - ) - def _safe_import_alias(module_stem: str, used: set[str]) -> str: base = module_stem.replace("-", "_") alias = f"{base}_1" @@ -3423,7 +3423,7 @@ def ref_type(self, schema: dict[str, Any]) -> str: typ = self.type_for(name, ref_schema if isinstance(ref_schema, dict) else {}) self.local_ref_types[ref] = typ return typ - ref_rel = _resolve_ref(self.schema_rel, ref) + ref_rel = _resolve_schema_ref(self.schema_rel, ref) parts = list(ref_rel.parts) module_stem = ref_rel.stem.replace("-", "_") class_name = _generated_class_name(ref_rel) diff --git a/src/adcp/reporting.py b/src/adcp/reporting.py index eaa2bffab..6d1bc604c 100644 --- a/src/adcp/reporting.py +++ b/src/adcp/reporting.py @@ -130,6 +130,24 @@ def _identifiers(values: Iterable[object] | None) -> tuple[str, ...]: return tuple(sorted(str(getattr(value, "root", value)) for value in values or [])) +def _coverage_is_full(coverage: BaseModel, media_buy_ids: Iterable[object]) -> bool: + """Apply the reporting-coverage partition invariant before closing a period.""" + expected_media_buys = _identifiers(media_buy_ids) + package_ids = _identifiers(getattr(coverage, "package_ids", None)) + return bool( + _enum(getattr(coverage, "status", None)) == "full" + and _identifiers(getattr(coverage, "media_buy_ids", None)) == expected_media_buys + and _identifiers(getattr(coverage, "fully_covered_media_buy_ids", None)) + == expected_media_buys + and not _identifiers(getattr(coverage, "partially_covered_media_buy_ids", None)) + and not _identifiers(getattr(coverage, "unsupported_media_buy_ids", None)) + and not _identifiers(getattr(coverage, "unknown_media_buy_ids", None)) + and _identifiers(getattr(coverage, "covered_package_ids", None)) == package_ids + and not _identifiers(getattr(coverage, "unsupported_package_ids", None)) + and not _identifiers(getattr(coverage, "unknown_package_ids", None)) + ) + + def _iso(value: str) -> str: return datetime.fromisoformat(value.replace("Z", "+00:00")).isoformat() @@ -321,6 +339,13 @@ def _select_current( or _json(revision.period) != _json(obligation.period) ): reasons.append("REVISION_SCOPE_MISMATCH") + if ( + not _coverage_is_full(obligation.coverage, obligation.media_buy_ids) + or obligation.coverage.evaluated_at != obligation.scope_resolved_at + ): + reasons.append("REPORTING_COVERAGE_INCOMPLETE") + if _json(revision.coverage) != _json(obligation.coverage): + reasons.append("REVISION_COVERAGE_MISMATCH") if _enum(obligation.required_finality) == "official" and _enum(revision.finality) != "official": reasons.append("FINALITY_NOT_MET") diff --git a/src/adcp/types/_ergonomic.py b/src/adcp/types/_ergonomic.py index 88fcbb872..6b67a40d4 100644 --- a/src/adcp/types/_ergonomic.py +++ b/src/adcp/types/_ergonomic.py @@ -217,9 +217,7 @@ def _apply_coercion() -> None: _patch_field_annotation( ListCreativesRequest, "assignment_projection", - Annotated[ - AssignmentProjection | None, BeforeValidator(coerce_to_enum(AssignmentProjection)) - ], + Annotated[AssignmentProjection | None, BeforeValidator(coerce_to_enum(AssignmentProjection))], ) _patch_field_annotation( ListCreativesRequest, diff --git a/src/adcp/types/_generated.py b/src/adcp/types/_generated.py index f1e3cd351..82ab0565e 100644 --- a/src/adcp/types/_generated.py +++ b/src/adcp/types/_generated.py @@ -10,7 +10,7 @@ DO NOT EDIT MANUALLY. Generated from: https://github.com/adcontextprotocol/adcp/tree/main/schemas -Generation date: 2026-08-28 20:03:34 UTC +Generation date: 2026-08-29 05:31:46 UTC """ # ruff: noqa: E501, I001 @@ -168,7 +168,9 @@ from adcp.types.generated_poc.enums.publisher_identifier_types import PublisherIdentifierTypes from adcp.types.generated_poc.enums.purchase_type import PurchaseType from adcp.types.generated_poc.enums.reach_unit import ReachUnit +from adcp.types.generated_poc.enums.reporting_finality import ReportingFinality from adcp.types.generated_poc.enums.reporting_frequency import ReportingFrequency +from adcp.types.generated_poc.enums.reporting_health import ReportingHealth from adcp.types.generated_poc.enums.representation_selection_strategy import ( RepresentationSelectionStrategy, ) @@ -226,7 +228,7 @@ from adcp.types.generated_poc.a2ui.component import A2UiComponent from adcp.types.generated_poc.a2ui.si_catalog import ( Action, - Action19, + Action21, Align, AppHandoff, Apps, @@ -661,8 +663,24 @@ ActivationKey2, ) from adcp.types.generated_poc.core.ad_inventory_config import AdInventoryConfiguration +from adcp.types.generated_poc.core.agent_configuration_state import AgentConfigurationState from adcp.types.generated_poc.core.agent_encryption_key import AgentEncryptionKey from adcp.types.generated_poc.core.agent_notification_config import AgentNotificationConfig +from adcp.types.generated_poc.core.agent_notification_config_state import ( + AgentNotificationConfigState, +) +from adcp.types.generated_poc.core.agent_reporting_destination import ( + AcceptedFormat, + AgentReportingDestination, + AgentReportingDestination1, + AgentReportingDestination2, + AgentReportingDestination3, + Pattern, +) +from adcp.types.generated_poc.core.agent_reporting_destination_state import ( + AgentReportingDestinationState, + State, +) from adcp.types.generated_poc.core.agent_signing_key import AgentSigningKey from adcp.types.generated_poc.core.agent_webhook_challenge import ( AgentWebhookChallenge, @@ -927,8 +945,8 @@ MakegoodPolicy, ) from adcp.types.generated_poc.core.canonical_media_buy_action import ( - Action2, Action3, + Action4, CanonicalMediaBuyAction, CanonicalMediaBuyAction1, CanonicalMediaBuyAction2, @@ -1128,6 +1146,8 @@ ViewedSecondsHistogramItem, ViewedSecondsPercentiles, ) +from adcp.types.generated_poc.core.delivery_provider import DeliveryProvider +from adcp.types.generated_poc.core.delivery_recipient import DeliveryRecipient from adcp.types.generated_poc.core.demographic_age_range import DemographicAgeRange from adcp.types.generated_poc.core.demographic_predicate import DemographicPredicate from adcp.types.generated_poc.core.demographic_reporting_capability import ( @@ -1754,10 +1774,125 @@ Tracks, ) from adcp.types.generated_poc.core.registry_feed_response import Freshness, RegistryFeedResponse -from adcp.types.generated_poc.core.reporting_capabilities import ReportingCapabilities +from adcp.types.generated_poc.core.reporting_canonical_content_digest import ( + ReportingCanonicalContentDigest, +) +from adcp.types.generated_poc.core.reporting_canonicalization_contract import ( + GoldenVector, + ReportingCanonicalizationContract, +) +from adcp.types.generated_poc.core.reporting_capabilities import ( + ReportingCapabilities, + ReportingDeliveryOfferingId, +) +from adcp.types.generated_poc.core.reporting_control_total import ReportingControlTotal, ValueType +from adcp.types.generated_poc.core.reporting_coverage import ( + CoveredPackageId, + FullyCoveredMediaBuyId, + Limitation, + MediaBuyId, + PartiallyCoveredMediaBuyId, + ReportingCoverage, + UnknownMediaBuyId, + UnknownPackageId, + UnsupportedMediaBuyId, + UnsupportedPackageId, +) +from adcp.types.generated_poc.core.reporting_dataset_share_destination import ( + Recipient, + ReportingDatasetShareDestination, + ReportingDatasetShareDestination1, + ReportingDatasetShareDestination2, +) +from adcp.types.generated_poc.core.reporting_delivery_capabilities import ( + ReportingDeliveryCapabilities, +) +from adcp.types.generated_poc.core.reporting_delivery_config import ( + CoverageRequirement, + FeedPurpose, + ReportingDeliveryConfiguration, +) +from adcp.types.generated_poc.core.reporting_delivery_config_state import ( + ReportingDeliveryConfigurationState, +) +from adcp.types.generated_poc.core.reporting_delivery_method import ( + Orchestration, + ReportingDeliveryMethod, + ReportingDeliveryMethod2, + ReportingDeliveryMethod3, + ReportingDeliveryMethod4, +) +from adcp.types.generated_poc.core.reporting_delivery_offering import ( + DestinationMode, + ProducerIdentity, + ReaderCompatibilityItem, + ReportingDeliveryOffering, + ReportingProfile, +) +from adcp.types.generated_poc.core.reporting_delivery_ready_webhook import ( + Readiness, + ReportingDeliveryReadyWebhook, +) +from adcp.types.generated_poc.core.reporting_file_compression import ReportingFileCompression +from adcp.types.generated_poc.core.reporting_file_entry import ReportingFileEntry +from adcp.types.generated_poc.core.reporting_file_manifest import ReportingFileManifest +from adcp.types.generated_poc.core.reporting_materialization import ReportingMaterialization +from adcp.types.generated_poc.core.reporting_obligation import ( + ProductionStatus, + ReconciliationStatus, + ReportingObligation, +) +from adcp.types.generated_poc.core.reporting_receipt import RejectionCode, ReportingReceipt +from adcp.types.generated_poc.core.reporting_reconciliation_mode import ReportingReconciliationMode +from adcp.types.generated_poc.core.reporting_report_definition import ( + Aggregation, + Calendar, + FinalityPolicies, + FinalityPolicies1, + FinalityPolicies2, + ReportingReportDefinition, + RestatementPolicy, +) +from adcp.types.generated_poc.core.reporting_resource import Immutability, ReportingResource +from adcp.types.generated_poc.core.reporting_revision import ( + DataThroughPrecision, + FinalityBasis, + ReportingRevision, +) +from adcp.types.generated_poc.core.reporting_schedule import ReportingSchedule +from adcp.types.generated_poc.core.reporting_schedule_offering import ( + PeriodAnchorPolicy, + ReportingScheduleOffering, +) +from adcp.types.generated_poc.core.reporting_status_issue import ( + Code, + RecommendedAction, + ReportingStatusIssue, + ResponsibleParty, +) +from adcp.types.generated_poc.core.reporting_verification import ( + Algorithm, + NativeCommitEvidence, + ObservedThrough, + PhysicalChecksum, + ReportingVerification, + VerificationPath, +) +from adcp.types.generated_poc.core.reporting_verification_profile import ( + ReportingVerificationProfile, +) +from adcp.types.generated_poc.core.reporting_verification_profile_set import ( + ReportingVerificationProfileSet, + ReportingVerificationProfileSetEnum, +) from adcp.types.generated_poc.core.reporting_webhook import ReportingWebhook +from adcp.types.generated_poc.core.reporting_write_destination import ( + ReportingWriteDestination, + ReportingWriteDestination1, + ReportingWriteDestination2, +) from adcp.types.generated_poc.core.representation_destination import RepresentationDestination -from adcp.types.generated_poc.core.representation_rejection import Code, RepresentationRejection +from adcp.types.generated_poc.core.representation_rejection import RepresentationRejection from adcp.types.generated_poc.core.representation_selection import ( RepresentationSelection, ResolvedBy, @@ -2397,7 +2532,6 @@ Reveal, ScrollReference, SlotBinding, - State, SupplyMode, TransitionMode, TransitionMode9, @@ -2538,7 +2672,7 @@ ) from adcp.types.generated_poc.governance.sync_plans_response import ( ResolvedPolicy, - Status40, + Status43, SyncPlansResponse, ) from adcp.types.generated_poc.manifest import Model @@ -2807,7 +2941,7 @@ ) from adcp.types.generated_poc.media_buy.get_products_rejected import GetProductsRejected from adcp.types.generated_poc.media_buy.get_products_request import ( - Action7, + Action8, BuyingMode, Fields, GetProductsRequest, @@ -2831,6 +2965,16 @@ from adcp.types.generated_poc.media_buy.get_products_targeting_resolution import ( ProductDiscoveryTargetingResolution, ) +from adcp.types.generated_poc.media_buy.get_reporting_status_request import ( + DeliveryConfigId, + GetReportingStatusRequest, + View, +) +from adcp.types.generated_poc.media_buy.get_reporting_status_response import ( + DeliveryConfigGeneration, + GetReportingStatusResponse, + ObligationCounts, +) from adcp.types.generated_poc.media_buy.legacy_purchase_continuation_input import ( AcceptedLoss, CompatibilityPurchaseCoordinatorInput, @@ -2897,7 +3041,7 @@ ) from adcp.types.generated_poc.media_buy.product_purchase import ProductPurchase from adcp.types.generated_poc.media_buy.product_refinement import ( - Action9, + Action10, ProductRefinementRequests, ProductRefinementRequests1, ProductRefinementRequests2, @@ -3035,6 +3179,14 @@ SyncEventSourcesResponse1, SyncEventSourcesResponse2, ) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_request import ( + SyncReportingReceiptsRequest, +) +from adcp.types.generated_poc.media_buy.sync_reporting_receipts_response import ( + Results18, + Results19, + SyncReportingReceiptsResponse, +) from adcp.types.generated_poc.media_buy.update_media_buy_async_response_input_required import ( UpdateMediaBuyInputRequired, ) @@ -3123,13 +3275,13 @@ AcceptancePolicyDiscovery, Accreditation, Adcp, - Algorithm, + AgentConfiguration, AudienceTargeting, Brand, BudgetCapping, CapabilityChanges, ChangeFeed, - ChangeFeed3, + ChangeFeed1, ComplianceTesting, CompromiseNotification, CoversContentDigest, @@ -3140,7 +3292,7 @@ DefaultProfileId, DiscoveryMode, Endpoint, - EventType5, + EventType3, ExperimentalFeature, ExtensionsSupportedItem, Features, @@ -3150,10 +3302,10 @@ Governance, GovernanceEnforcement, Idempotency, - Idempotency3, + Idempotency1, Identity, IdentityUpdates, - IdentityUpdates3, + IdentityUpdates1, KeyOrigins, KeywordTargets, Language, @@ -3165,17 +3317,17 @@ MeasurementGateway, NegativeKeywords, Notifications, - Notifications5, - Notifications6, - Notifications7, + Notifications1, + Notifications2, + Notifications3, Oauth, PrimaryCountry, PropagationSurface, ProtocolMethodsRequiredForItem, ProtocolMethodsSupportedForItem, ProtocolMethodsWarnForItem, + RegistrationTask, RelationshipNotifications, - ReportingDeliveryMethod, RepresentationResolution, RequestSigning, RightsAttestations, @@ -3192,21 +3344,21 @@ SupportedProtocol, SupportedRequirementMode, SupportedScope, - SupportedTarget3, + SupportedSection, + SupportedTarget1, Targeting, Tasks, - Tasks10, - Tasks12, - Tasks13, - Tasks14, - Tasks15, - Tasks16, - Tasks17, - Tasks18, - Tasks19, - TimezoneBasis, + Tasks1, + Tasks2, + Tasks3, + Tasks4, + Tasks5, + Tasks6, + Tasks7, + Tasks8, + Tasks9, Transport, - Type9, + Type6, VastValidation, WarnForItem, WebhookSigning, @@ -3217,6 +3369,16 @@ from adcp.types.generated_poc.protocol.get_task_status_response import GetTaskStatusResponse from adcp.types.generated_poc.protocol.list_tasks_request import ListTasksRequest from adcp.types.generated_poc.protocol.list_tasks_response import ListTasksResponse +from adcp.types.generated_poc.protocol.sync_agent_configuration_request import ( + Configuration, + SyncAgentConfigurationRequest, +) +from adcp.types.generated_poc.protocol.sync_agent_configuration_response import ( + Action26, + Result11, + Result9, + SyncAgentConfigurationResponse, +) from adcp.types.generated_poc.protocol.sync_agent_notification_configs_request import ( SyncAgentNotificationConfigsRequest, ) @@ -3296,7 +3458,7 @@ DisclosureCommitment, HostReceipt, SiSponsoredContextReceipt, - Status37, + Status40, ) from adcp.types.generated_poc.sponsored_intelligence.si_terminate_session_request import ( SiTerminateSessionRequest, @@ -3356,6 +3518,30 @@ from adcp.types.generated_poc.trusted_match.tmpx_chunk import TmpxChunk # Special imports for name collisions (qualified names for types defined in multiple modules) +from adcp.types.generated_poc.core.reporting_coverage import ( + PackageId as _PackageIdFromReportingCoverage, +) +from adcp.types.generated_poc.core.reporting_status_issue import ( + PackageId as _PackageIdFromReportingStatusIssue, +) +from adcp.types.generated_poc.core.reporting_schedule import ( + Alignment as _AlignmentFromReportingSchedule, +) +from adcp.types.generated_poc.core.reporting_schedule_offering import ( + Alignment as _AlignmentFromReportingScheduleOffering, +) +from adcp.types.generated_poc.core.reporting_canonicalization_contract import ( + PrimaryKey as _PrimaryKeyFromReportingCanonicalizationContract, +) +from adcp.types.generated_poc.core.reporting_delivery_offering import ( + PrimaryKey as _PrimaryKeyFromReportingDeliveryOffering, +) +from adcp.types.generated_poc.core.reporting_report_definition import ( + TimezoneBasis as _TimezoneBasisFromReportingReportDefinition, +) +from adcp.types.generated_poc.protocol.get_adcp_capabilities_response import ( + TimezoneBasis as _TimezoneBasisFromGetAdcpCapabilitiesResponse, +) from adcp.types.generated_poc.core.package import Package as _PackageFromPackage from adcp.types.generated_poc.media_buy.get_media_buys_response import ( Package as _PackageFromGetMediaBuysResponse, @@ -3493,6 +3679,7 @@ "AcceptedAttestationIssuers2", "AcceptedAttestationIssuers3", "AcceptedEvidenceType", + "AcceptedFormat", "AcceptedGovernanceAgents", "AcceptedIssuer", "AcceptedLoss", @@ -3535,11 +3722,12 @@ "AcquireRightsResponse3", "AcquireRightsResponse4", "Action", - "Action19", - "Action2", + "Action10", + "Action21", + "Action26", "Action3", - "Action7", - "Action9", + "Action4", + "Action8", "ActionBinding", "ActionNotAllowedDetails", "ActionNotAllowedReason", @@ -3595,14 +3783,23 @@ "AgeDeterminationBasis", "AgeRestriction", "AgeVerificationMethod", + "AgentConfiguration", + "AgentConfigurationState", "AgentEncryptionKey", "AgentNotificationConfig", + "AgentNotificationConfigState", "AgentPermissionDeniedDetails", "AgentProfilePayload", + "AgentReportingDestination", + "AgentReportingDestination1", + "AgentReportingDestination2", + "AgentReportingDestination3", + "AgentReportingDestinationState", "AgentSigningKey", "AgentWebhookChallenge", "Aggregate", "AggregatedTotals", + "Aggregation", "AiActRiskClass", "AiTool", "Algorithm", @@ -3898,6 +4095,7 @@ "C2pa", "CAEnum", "CacheScope", + "Calendar", "CalibrateContentRequest", "CalibrateContentResponse", "CalibrateContentResponse1", @@ -4031,7 +4229,7 @@ "Catchment", "Category", "ChangeFeed", - "ChangeFeed3", + "ChangeFeed1", "ChangeKind", "ChangeSummary", "ChangedFields", @@ -4122,6 +4320,7 @@ "CompromiseNotification", "Condition", "ConfidenceInterval", + "Configuration", "ConflictDetails", "ConnectionType", "Consent", @@ -4172,7 +4371,9 @@ "Coverage", "CoverageGap", "CoverageRate", + "CoverageRequirement", "CoverageStatus", + "CoveredPackageId", "CoversContentDigest", "CpaPricingOption", "CpcPricingOption", @@ -4299,6 +4500,7 @@ "DataSource", "DataSubjectContestation", "DataSubjectRights", + "DataThroughPrecision", "DateRange", "DateRangeSupport", "DatetimeRange", @@ -4327,6 +4529,8 @@ "Delivery", "DeliveryAuth", "DeliveryBreakdownControls", + "DeliveryConfigGeneration", + "DeliveryConfigId", "DeliveryForecast", "DeliveryJurisdiction", "DeliveryMeasurement", @@ -4337,6 +4541,8 @@ "DeliveryMetrics2", "DeliveryMode", "DeliveryPeriodState", + "DeliveryProvider", + "DeliveryRecipient", "DeliveryReconciliationStatus", "DeliveryRecord", "DeliveryReportingPeriod", @@ -4361,6 +4567,7 @@ "Destination1", "Destination2", "DestinationItem", + "DestinationMode", "DestinationType", "Detail", "Details", @@ -4434,7 +4641,7 @@ "EventSourceHealth", "EventSurface", "EventType", - "EventType5", + "EventType3", "Evidence", "EvidencePresence", "EvidenceType", @@ -4469,6 +4676,7 @@ "Features", "Fee", "FeedFormat", + "FeedPurpose", "FeedbackSource", "Field1", "FieldTruncation", @@ -4476,6 +4684,10 @@ "File", "FilterDiagnostics", "Filters", + "FinalityBasis", + "FinalityPolicies", + "FinalityPolicies1", + "FinalityPolicies2", "Finding", "Fit", "FlatRatePricingOption", @@ -4512,6 +4724,7 @@ "Freshness", "From", "FuelType", + "FullyCoveredMediaBuyId", "GBEnum", "GenerationContext", "GenerationCredential", @@ -4588,6 +4801,8 @@ "GetProductsWorking", "GetPropertyListRequest", "GetPropertyListResponse", + "GetReportingStatusRequest", + "GetReportingStatusResponse", "GetRightsRequest", "GetRightsResponse", "GetRightsResponse1", @@ -4600,6 +4815,7 @@ "GetTaskStatusResponse", "Goal", "Goal1", + "GoldenVector", "GopType", "Governance", "GovernanceAgent", @@ -4630,7 +4846,7 @@ "IconSize", "IdType", "Idempotency", - "Idempotency3", + "Idempotency1", "IdempotencyRequirement", "Identifier", "Identifiers", @@ -4641,7 +4857,7 @@ "IdentityMatchResponseRouterPublisher", "IdentityRef", "IdentityUpdates", - "IdentityUpdates3", + "IdentityUpdates1", "Ids", "IfNotCovered", "Image", @@ -4650,6 +4866,7 @@ "ImageDecoration", "ImageFormat", "ImageRef", + "Immutability", "Impact", "Impairment", "ImpairmentOfflineState", @@ -4798,6 +5015,7 @@ "Level", "LifecycleTool", "LiftDimension", + "Limitation", "LimitedSeries", "Link", "List", @@ -4938,6 +5156,7 @@ "MediaBuyDeliveryWebhookResult", "MediaBuyFeatures", "MediaBuyHealth", + "MediaBuyId", "MediaBuyPackage", "MediaBuyStatus", "MediaBuyTermsReference", @@ -4981,6 +5200,7 @@ "MraidVersion", "Multiplicity", "Multiplicity3", + "NativeCommitEvidence", "NegativeKeyword", "NegativeKeywords", "NegativeKeywordsAddItem", @@ -4992,12 +5212,14 @@ "NotificationConfig", "NotificationType", "Notifications", - "Notifications5", - "Notifications6", - "Notifications7", + "Notifications1", + "Notifications2", + "Notifications3", "Oauth", "Objective", + "ObligationCounts", "ObservedDocumentVastVersion", + "ObservedThrough", "Offer", "OfferPrice", "Offering", @@ -5024,6 +5246,7 @@ "OptimizationGoal8", "OptimizationGoal9", "Option", + "Orchestration", "Orientation", "Origin", "OriginalError", @@ -5092,8 +5315,10 @@ "ParentLabel", "ParentMatchBehavior", "PartialFailure", + "PartiallyCoveredMediaBuyId", "Pass", "Path", + "Pattern", "PayingPrincipal", "Payload", "Payload1", @@ -5130,7 +5355,9 @@ "PerformanceStandard", "PerformanceStandardMetric", "Period", + "PeriodAnchorPolicy", "Phase", + "PhysicalChecksum", "PixelRatio", "PixelTrackerAsset", "PixelTrackingEvent", @@ -5238,6 +5465,7 @@ "PricingStructure", "PrimaryCountry", "PrivacyPolicyAcknowledged", + "ProducerIdentity", "Product", "ProductAllocation", "ProductAllowedAction", @@ -5264,6 +5492,7 @@ "ProductSignalTargetingOption", "ProductTargetingResolution", "ProductionQuality", + "ProductionStatus", "Progress", "PropagationSurface", "Property", @@ -5373,9 +5602,14 @@ "RateLimitedDetails", "ReachUnit", "ReachWindow", + "ReaderCompatibilityItem", + "Readiness", "RealEstateItem", "Reason", "ReasonCode", + "Recipient", + "RecommendedAction", + "ReconciliationStatus", "Record", "Recovery", "Rectangle", @@ -5403,6 +5637,7 @@ "RefreshCadence", "Region", "RegionAliase", + "RegistrationTask", "RegistryAcceptancePolicyProfileReference", "RegistryEvent", "RegistryEvent1", @@ -5428,6 +5663,7 @@ "RegistryFeedResponse", "RegulatoryBasi", "RegulatoryFramework", + "RejectionCode", "RelatedCollection", "Relationship", "RelationshipKind", @@ -5448,14 +5684,53 @@ "ReportedOutcomeError", "ReportedSpend", "ReportingBucket", + "ReportingCanonicalContentDigest", + "ReportingCanonicalizationContract", "ReportingCapabilities", "ReportingCommitment", + "ReportingControlTotal", + "ReportingCoverage", + "ReportingDatasetShareDestination", + "ReportingDatasetShareDestination1", + "ReportingDatasetShareDestination2", + "ReportingDeliveryCapabilities", + "ReportingDeliveryConfiguration", + "ReportingDeliveryConfigurationState", "ReportingDeliveryMethod", + "ReportingDeliveryMethod2", + "ReportingDeliveryMethod3", + "ReportingDeliveryMethod4", + "ReportingDeliveryOffering", + "ReportingDeliveryOfferingId", + "ReportingDeliveryReadyWebhook", "ReportingDimensions", + "ReportingFileCompression", + "ReportingFileEntry", + "ReportingFileManifest", + "ReportingFinality", "ReportingFrequency", + "ReportingHealth", + "ReportingMaterialization", "ReportingMode", + "ReportingObligation", "ReportingPeriod", + "ReportingProfile", + "ReportingReceipt", + "ReportingReconciliationMode", + "ReportingReportDefinition", + "ReportingResource", + "ReportingRevision", + "ReportingSchedule", + "ReportingScheduleOffering", + "ReportingStatusIssue", + "ReportingVerification", + "ReportingVerificationProfile", + "ReportingVerificationProfileSet", + "ReportingVerificationProfileSetEnum", "ReportingWebhook", + "ReportingWriteDestination", + "ReportingWriteDestination1", + "ReportingWriteDestination2", "RepresentationDestination", "RepresentationRejection", "RepresentationResolution", @@ -5493,10 +5768,14 @@ "Response", "ResponsePayload", "ResponsePayloadJwsEnvelope", + "ResponsibleParty", "Responsive", + "RestatementPolicy", "RestrictedAttribute", "Restriction", "Result", + "Result11", + "Result9", "ResultEntry", "ResultEntry1", "ResultEntry2", @@ -5508,6 +5787,8 @@ "Results13", "Results14", "Results15", + "Results18", + "Results19", "Results2", "Results3", "Results6", @@ -5669,8 +5950,8 @@ "StartingPosition", "State", "Status", - "Status37", "Status40", + "Status43", "StatusFilter", "StatusSummary", "Statuses", @@ -5735,9 +6016,10 @@ "SupportedProtocol", "SupportedRequirementMode", "SupportedScope", + "SupportedSection", "SupportedTagType", "SupportedTarget", - "SupportedTarget3", + "SupportedTarget1", "SupportedTarget5", "SupportedTimezone", "SupportedVersion", @@ -5746,6 +6028,8 @@ "SyncAccountsResponse", "SyncAccountsResponse1", "SyncAccountsResponse2", + "SyncAgentConfigurationRequest", + "SyncAgentConfigurationResponse", "SyncAgentNotificationConfigsRequest", "SyncAgentNotificationConfigsResponse", "SyncAudiencesRequest", @@ -5777,6 +6061,8 @@ "SyncGovernanceResponse", "SyncPlansRequest", "SyncPlansResponse", + "SyncReportingReceiptsRequest", + "SyncReportingReceiptsResponse", "System", "System1", "System11", @@ -5829,15 +6115,15 @@ "TaskStatus", "TaskType", "Tasks", - "Tasks10", - "Tasks12", - "Tasks13", - "Tasks14", - "Tasks15", - "Tasks16", - "Tasks17", - "Tasks18", - "Tasks19", + "Tasks1", + "Tasks2", + "Tasks3", + "Tasks4", + "Tasks5", + "Tasks6", + "Tasks7", + "Tasks8", + "Tasks9", "TasksGetRequest", "TasksGetResponse", "TasksListRequest", @@ -5856,7 +6142,6 @@ "TimeForecastDimension", "TimeRange", "TimeUnit", - "TimezoneBasis", "Timing", "TmpError", "TmpProviderRegistration", @@ -5909,7 +6194,7 @@ "Trust", "TrustedMatch", "Type", - "Type9", + "Type6", "Uid", "UidType", "UnavailableBehavior", @@ -5917,8 +6202,12 @@ "Unit", "UniversalMacro", "UnknownHandling", + "UnknownMediaBuyId", + "UnknownPackageId", "UnmatchedLocaleAction", "UnsatisfiedConstraint", + "UnsupportedMediaBuyId", + "UnsupportedPackageId", "UnsupportedRefinementDimensionDetails", "UpdateCollectionListRequest", "UpdateCollectionListResponse", @@ -5969,6 +6258,7 @@ "ValueCurrency", "ValueMapping", "ValueSource", + "ValueType", "VariableType", "Variant", "Variant2", @@ -6027,6 +6317,7 @@ "VerificationItem", "VerificationLevel", "VerificationMode", + "VerificationPath", "VerificationStatus", "VerifiedAttestationDigest", "VerifyAgent", @@ -6055,6 +6346,7 @@ "VideoCodec", "VideoPlacementType", "VideoPlayback", + "View", "ViewThreshold", "ViewThreshold1", "ViewThresholdBasis", @@ -6104,6 +6396,8 @@ "Window", "XEntityTypes", "ZipAsset", + "_AlignmentFromReportingSchedule", + "_AlignmentFromReportingScheduleOffering", "_AudienceFromGetMediaBuyDeliveryRequest", "_AudienceFromSyncAudiencesRequest", "_AudienceFromSyncAudiencesResponse", @@ -6111,6 +6405,10 @@ "_DeclaredByFromSiSponsoredContext", "_ErrorFromError", "_PackageFromPackage", + "_PackageIdFromReportingCoverage", + "_PackageIdFromReportingStatusIssue", + "_PrimaryKeyFromReportingCanonicalizationContract", + "_PrimaryKeyFromReportingDeliveryOffering", "_ProductIdFromProductDiscoveryCriteria", "_ProductIdFromRequestProposalsResponse", "_ProvenanceFromProvenance", @@ -6121,6 +6419,8 @@ "_RequiredForItemFromGetAdcpCapabilitiesResponse", "_RouteFromGetAdcpCapabilitiesResponse", "_RouteFromPreviewProvider", + "_TimezoneBasisFromGetAdcpCapabilitiesResponse", + "_TimezoneBasisFromReportingReportDefinition", "_TmpxMacroFromIdentityMatchResponse", "_TmpxMacroFromProviderRegistration", "_TotalBudgetGuidanceFromCanonicalProposal", diff --git a/src/adcp/types/generated_poc/account/sync_accounts_request.py b/src/adcp/types/generated_poc/account/sync_accounts_request.py index ca4fa6f82..4f8d843b3 100644 --- a/src/adcp/types/generated_poc/account/sync_accounts_request.py +++ b/src/adcp/types/generated_poc/account/sync_accounts_request.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: account/sync_accounts_request.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -117,7 +117,7 @@ class Accounts(AdCPBaseModel): reporting_delivery_configs: Annotated[ list[reporting_delivery_config.ReportingDeliveryConfiguration] | None, Field( - description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller/account-bound seller-issued destination_ref. Unknown, unauthorized, cross-account, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. Each generation binds the exact report_definition_id advertised by its offering. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller-scoped immutable destination-generation reference, including one registered through sync_agent_configuration. The account configuration independently authorizes disclosure for this feed and scope, so possession of a reusable reference is never account authority. Unknown, unauthorized, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", max_length=16, ), ] = None @@ -225,7 +225,7 @@ class Accounts1(AdCPBaseModel): reporting_delivery_configs: Annotated[ list[reporting_delivery_config.ReportingDeliveryConfiguration] | None, Field( - description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller/account-bound seller-issued destination_ref. Unknown, unauthorized, cross-account, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", + description="Caller-owned desired state for durable reporting delivery on this account. Declarative replacement is scoped to (authenticated caller, resolved account): omission leaves that caller's set unchanged; [] deactivates that caller's set and starts grant revocation; another caller's entries MUST NOT be read, replaced, or deleted. Entries are keyed by immutable (delivery_config_id, delivery_config_version); duplicate tuples MUST reject the entire account entry, and reusing a tuple with changed content MUST be rejected. Each generation binds the exact report_definition_id advertised by its offering. destination.mode provision asks the seller to verify caller disclosure authority and destination/recipient control from non-secret provider coordinates; destination.mode existing reuses a caller-scoped immutable destination-generation reference, including one registered through sync_agent_configuration. The account configuration independently authorizes disclosure for this feed and scope, so possession of a reusable reference is never account authority. Unknown, unauthorized, and cross-caller refs MUST be indistinguishable. Credentials never transit AdCP, including nested extension fields. Permitted in both provisioning and settings-update modes. Sellers accepting this field MUST advertise media_buy.reporting_delivery in experimental_features and echo resolved secret-free state on sync_accounts and list_accounts.", max_length=16, ), ] = None diff --git a/src/adcp/types/generated_poc/bundled/protocol/get_adcp_capabilities_response.py b/src/adcp/types/generated_poc/bundled/protocol/get_adcp_capabilities_response.py index f2cbd0b67..1b12caeae 100644 --- a/src/adcp/types/generated_poc/bundled/protocol/get_adcp_capabilities_response.py +++ b/src/adcp/types/generated_poc/bundled/protocol/get_adcp_capabilities_response.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: bundled/protocol/get_adcp_capabilities_response.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -256,7 +256,7 @@ class Idempotency(AdCPBaseModel): ] = False -class Idempotency1(AdCPBaseModel): +class Idempotency3(AdCPBaseModel): supported: Annotated[ Literal[False], Field(description='Discriminator. False means the seller does not deduplicate retries.'), @@ -296,7 +296,7 @@ class Notifications(AdCPBaseModel): ] = None -class Notifications1(AdCPBaseModel): +class Notifications5(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -335,7 +335,7 @@ class CapabilityChanges(AdCPBaseModel): ), ] = None notifications: Annotated[ - Notifications | Notifications1 | None, + Notifications | Notifications5 | None, Field( description='Whether the seller supports agent-level capability-change webhooks. When supported, interested consumers register endpoint subscribers with `sync_agent_notification_configs`; each `capabilities.changed` fire is a small invalidation payload, and consumers repair by re-reading `get_adcp_capabilities`.' ), @@ -347,7 +347,7 @@ class Mode(StrEnum): online_execution_check = 'online_execution_check' -class Tasks1(AdCPBaseModel): +class Tasks(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -355,7 +355,7 @@ class Tasks1(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks2(AdCPBaseModel): +class Tasks12(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -363,7 +363,7 @@ class Tasks2(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks3(AdCPBaseModel): +class Tasks13(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -371,7 +371,7 @@ class Tasks3(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks4(AdCPBaseModel): +class Tasks14(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -379,7 +379,7 @@ class Tasks4(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks5(AdCPBaseModel): +class Tasks15(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -387,7 +387,7 @@ class Tasks5(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks6(AdCPBaseModel): +class Tasks16(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -395,7 +395,7 @@ class Tasks6(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks7(AdCPBaseModel): +class Tasks17(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -403,7 +403,7 @@ class Tasks7(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks8(AdCPBaseModel): +class Tasks18(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -411,7 +411,7 @@ class Tasks8(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks9(AdCPBaseModel): +class Tasks19(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -419,11 +419,11 @@ class Tasks9(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks( - RootModel[Tasks1 | Tasks2 | Tasks3 | Tasks4 | Tasks5 | Tasks6 | Tasks7 | Tasks8 | Tasks9] +class Tasks10( + RootModel[Tasks | Tasks12 | Tasks13 | Tasks14 | Tasks15 | Tasks16 | Tasks17 | Tasks18 | Tasks19] ): root: Annotated[ - Tasks1 | Tasks2 | Tasks3 | Tasks4 | Tasks5 | Tasks6 | Tasks7 | Tasks8 | Tasks9, + Tasks | Tasks12 | Tasks13 | Tasks14 | Tasks15 | Tasks16 | Tasks17 | Tasks18 | Tasks19, Field(discriminator='task'), ] def __getattr__(self, name: str) -> Any: @@ -505,7 +505,7 @@ class GovernanceEnforcement(AdCPBaseModel): extra='forbid', ) tasks: Annotated[ - list[Tasks], + list[Tasks10], Field( description='Task-scoped enforcement claims. The task field is a semantic uniqueness key: an agent MUST emit at most one entry per task and combine all supported modes in that entry. JSON Schema uniqueItems only rejects structurally identical objects, so producers and capability validators MUST enforce task-key uniqueness separately. Values correspond to request schemas annotated with x-governed-commitment. Online execution checks are currently defined only for media-buy tasks, whose prepared result has the PlannedDelivery contract; other roles can enforce signed intent authorization without inventing media-buy fields.', min_length=1, @@ -722,7 +722,7 @@ class CredentialOrigin(RootModel[AnyUrl]): root: AnyUrl -class Authentication4(StrEnum): +class Authentication5(StrEnum): none = 'none' evaluator_managed = 'evaluator_managed' @@ -739,7 +739,7 @@ class Resolver(AdCPBaseModel): ), ] authentication: Annotated[ - Authentication4, + Authentication5, Field( description='Whether the resolver is public or uses credentials managed outside AdCP task payloads. Presenter-supplied credentials are never accepted.' ), @@ -783,7 +783,7 @@ class SupportedAccountCurrencyMode(StrEnum): per_media_buy = 'per_media_buy' -class Mode11(StrEnum): +class Mode16(StrEnum): seller_fixed = 'seller_fixed' account_fixed = 'account_fixed' @@ -802,7 +802,7 @@ class Timezone(AdCPBaseModel): extra='forbid', ) mode: Annotated[ - Mode11, + Mode16, Field( description='seller_fixed means every account uses fixed_timezone. account_fixed means each account has an immutable timezone returned on Account and selected or assigned during account establishment.' ), @@ -829,7 +829,7 @@ class Timezone(AdCPBaseModel): ] = None -class Notifications2(AdCPBaseModel): +class Notifications6(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -864,7 +864,7 @@ class Notifications2(AdCPBaseModel): ] = False -class Notifications3(AdCPBaseModel): +class Notifications7(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -903,7 +903,7 @@ class ChangeFeed(AdCPBaseModel): ] -class ChangeFeed1(AdCPBaseModel): +class ChangeFeed3(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -935,7 +935,7 @@ class IdentityUpdates(AdCPBaseModel): ] -class IdentityUpdates1(AdCPBaseModel): +class IdentityUpdates3(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -994,19 +994,19 @@ class Account(AdCPBaseModel): ), ] = False notifications: Annotated[ - Notifications2 | Notifications3 | None, + Notifications6 | Notifications7 | None, Field( description='Whether the seller supports durable account-lifecycle webhooks through account-level `notification_configs[]`. This capability is specifically for account status changes such as approval, rejection, payment-required, suspension, recovery, and closure. When supported, buyers register subscribers with `sync_accounts.accounts[].notification_configs[]`; each `account.status_changed` fire is an invalidation payload, and buyers repair by re-reading `list_accounts` for the account_id.' ), ] = None change_feed: Annotated[ - ChangeFeed | ChangeFeed1 | None, + ChangeFeed | ChangeFeed3 | None, Field( description='Whether the seller exposes a durable, ordered feed of material changes to authoritative account-scoped state. This is distinct from webhook_activity transport diagnostics and from current-state reads. Sellers claiming support MUST retain changes for at least 90 days after recording and MUST produce records regardless of whether a mutation originated through AdCP, a seller surface, another authorized principal, seller automation, or a connected platform within declared coverage.' ), ] = None identity_updates: Annotated[ - IdentityUpdates | IdentityUpdates1 | None, + IdentityUpdates | IdentityUpdates3 | None, Field( description='Whether the seller accepts buyer-desired operator identity reconciliation through sync_accounts settings-update entries. Sellers declaring support expose the exact identity transitions they implement, MUST return account revisions from sync_accounts and list_accounts, and MUST return identity_change_preview for dry-run identity updates.' ), @@ -1144,7 +1144,7 @@ class SupportedIndicatorType(StrEnum): budget_constrained = 'budget_constrained' -class EventType2(StrEnum): +class EventType4(StrEnum): indicators_changed = 'indicators.changed' creative_assignment_changed = 'creative.assignment_changed' @@ -1164,7 +1164,7 @@ class RelationshipNotifications(AdCPBaseModel): Field(description='Task buyers call to register account-level subscribers.'), ] = 'sync_accounts' event_types: Annotated[ - list[EventType2], + list[EventType4], Field( description='Relationship invalidation events supported by this seller. indicators.changed requires supported_indicator_types but is not required merely because polling readback is available. creative.assignment_changed is independently available when the seller can detect assignment or assignment-approval changes; it does not require indicator support or list_creatives.', max_length=2, @@ -1473,7 +1473,7 @@ class Countries9(RootModel[AnyUrl]): ] -class SupportedVersion2(SupportedTimezone): +class SupportedVersion3(SupportedTimezone): pass @@ -1522,7 +1522,7 @@ class Catalog(AdCPBaseModel): ), ] supported_versions: Annotated[ - list[SupportedVersion2], + list[SupportedVersion3], Field( description='Exact catalog versions accepted for new targeting or target-changing updates. Must include current_version. Removing a version does not mutate or silently invalidate targets already pinned to it.', min_length=1, @@ -1888,7 +1888,7 @@ class VendorMetricOptimization(AdCPBaseModel): ] = None -class SupportedTarget1(StrEnum): +class SupportedTarget3(StrEnum): cost_per = 'cost_per' per_ad_spend = 'per_ad_spend' maximize_value = 'maximize_value' @@ -2030,7 +2030,7 @@ class DiscoveryMode(StrEnum): wholesale = 'wholesale' -class Features1(AdCPBaseModel): +class Features(AdCPBaseModel): catalog_signals: Annotated[ bool | None, Field( @@ -2056,7 +2056,7 @@ class Signals(AdCPBaseModel): ), ] = [DiscoveryMode.brief] features: Annotated[ - Features1 | None, Field(description='Optional signals features supported') + Features | None, Field(description='Optional signals features supported') ] = None @@ -2185,7 +2185,7 @@ class Governance(AdCPBaseModel): ] = None -class Type6(StrEnum): +class Type9(StrEnum): mcp = 'mcp' a2a = 'a2a' @@ -2194,7 +2194,7 @@ class Transport(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) - type: Annotated[Type6, Field(description='Protocol transport type')] + type: Annotated[Type9, Field(description='Protocol transport type')] url: Annotated[AnyUrl, Field(description='Agent endpoint URL for this transport')] @@ -2207,7 +2207,7 @@ class Endpoint(AdCPBaseModel): ), ] preferred: Annotated[ - Type6 | None, Field(description='Preferred transport when host supports multiple') + Type9 | None, Field(description='Preferred transport when host supports multiple') ] = None @@ -2353,7 +2353,7 @@ class AvailableUs(StrEnum): ai_generated_image = 'ai_generated_image' -class Brand1(AdCPBaseModel): +class Brand(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -2588,7 +2588,7 @@ class FormatKind(StrEnum): custom = 'custom' -class Operation3(StrEnum): +class Operation4(StrEnum): build = 'build' validate = 'validate' preview = 'preview' @@ -3142,7 +3142,7 @@ class Error(AdCPBaseModel): ] = None -class EventType3(StrEnum): +class EventType5(StrEnum): product_created = 'product.created' product_updated = 'product.updated' product_priced = 'product.priced' @@ -3165,7 +3165,7 @@ class WholesaleFeedWebhooks(AdCPBaseModel): ), ] event_types: Annotated[ - list[EventType3] | None, + list[EventType5] | None, Field( description='Wholesale feed webhook event types this agent can emit. Sales agents emit product.* events and MUST expose list_products or the deprecated 3.x wholesale get_products compatibility path. Signals agents emit signal.* events and MUST support wholesale get_signals. wholesale_feed.bulk_change requires at least one corresponding repair path.', min_length=1, @@ -3173,7 +3173,7 @@ class WholesaleFeedWebhooks(AdCPBaseModel): ] = None -class Mode12(StrEnum): +class Mode17(StrEnum): automatic = 'automatic' bid_amount = 'bid_amount' max_bid = 'max_bid' @@ -3716,7 +3716,7 @@ class BrandKitOverride(AdCPBaseModel): tagline: Annotated[str | None, Field(description='Override tagline.')] = None -class Brand(AdCPBaseModel): +class Brand1(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -3771,7 +3771,7 @@ class Issuer(AdCPBaseModel): Literal['brand'], Field(description='The issuer is identified by an AdCP BrandRef.') ] = 'brand' brand: Annotated[ - Brand, + Brand1, Field( description='Reference to a brand by domain and optional brand_id. The domain hosts /.well-known/brand.json or is registered in the brand registry. For single-brand domains, brand_id can be omitted. For house-of-brands domains, brand_id identifies the specific brand. For creative production, brand.json is the canonical source of master brand identity (logo, palette, fonts, voice, and visual guidelines), subject only to the supported per-call fields in brand_kit_override. Catalogs supply product or item payload; catalog item asset groups, including property- or franchise-level logos, are item identity and do not override these master brand fields.', examples=[ @@ -3933,7 +3933,7 @@ class Adcp(AdCPBaseModel): ), ] = None idempotency: Annotated[ - Idempotency | Idempotency1, + Idempotency | Idempotency3, Field( description='Idempotency semantics for mutating requests. Sellers MUST declare whether they honor idempotency_key replay protection so buyers can reason about safe retry behavior. Modeled as a discriminated union on the supported boolean so that code generators produce two named types (IdempotencySupported, IdempotencyUnsupported) with the replay_ttl_seconds invariant enforced at the type level — draft-07 if/then would be dropped by most generators (openapi-typescript, zod-to-json-schema, datamodel-code-generator pre-0.25, quicktype). Clients MUST NOT assume a default — a seller without this declaration is non-compliant and should be treated as unsafe for retry-sensitive operations.' ), @@ -5484,7 +5484,7 @@ class ConversionTracking(AdCPBaseModel): ), ] = None supported_targets: Annotated[ - list[SupportedTarget1] | None, + list[SupportedTarget3] | None, Field( description='Event-goal target kinds this seller can compute against. Buyers should only submit event-kind optimization goals whose target.kind is listed here — sellers MUST reject goals with unlisted target kinds. When omitted, only target-less event goals (maximize conversion count within budget) are guaranteed; sellers MAY accept specific target kinds but buyers should not rely on it. Named to parallel `metric_optimization.supported_targets` at the product level — same concept (which target kinds are supported), one at seller-capability granularity and one at product granularity.', min_length=1, @@ -5705,12 +5705,12 @@ class SupportedFormat(AdCPBaseModel): ), ] operations: Annotated[ - list[Operation3] | None, + list[Operation4] | None, Field( description='Creative operations this capability supports. `build` means the agent can produce a conforming manifest via build_creative; `validate` means it can evaluate inputs against the declaration; `preview` means it can render a preview. New 3.2 producers MUST emit this field so buyers and registries can distinguish producers, validators, and renderers without probing tasks. Consumers interpret omission from a legacy 3.x entry as `["build"]`.', min_length=1, ), - ] = [Operation3.build] + ] = [Operation4.build] class Creative(AdCPBaseModel): @@ -5828,7 +5828,7 @@ class PolicyProfile(AdCPBaseModel): extra='forbid', ) modes: Annotated[ - list[Mode12] | None, + list[Mode17] | None, Field( description='Standalone policy modes accepted in this exact scope and allocation context. Combination-only components belong only in supported_combinations and need not appear here. `automatic` means the seller accepts and preserves an explicit `{automatic:true}` authored block; omission only invokes inheritance/default behavior.', min_length=1, @@ -5889,7 +5889,7 @@ class BiddingPolicyCapability(AdCPBaseModel): ] = None -class Features(AdCPBaseModel): +class Features1(AdCPBaseModel): inline_creative_management: Annotated[ bool | None, Field( @@ -6045,7 +6045,7 @@ class MediaBuy(AdCPBaseModel): description='Optional durable account-level invalidations for indicator, creative-assignment, and assignment-approval changes. A seller may expose indicators only through polling and omit this block. A seller without an indicator catalog may declare creative.assignment_changed alone. get_media_buys is the complete authoritative repair read. creative.assignment_changed is independent of the optional bounded list_creatives reverse projection, so inline-only sellers can advertise approval and assignment invalidations. Presence means the seller accepts the declared subscriptions through sync_accounts notification_configs. Timestamp-only reevaluation does not fire. Poll-based upstream integrations fire when they detect a change; this declaration does not promise upstream detection latency.' ), ] = None - features: Features | None = None + features: Features1 | None = None execution: Annotated[ Execution | None, Field(description='Technical execution capabilities for media buying') ] = None @@ -6245,7 +6245,7 @@ class GetAdcpCapabilitiesResponse(AdCPBaseModel): ), ] = None brand: Annotated[ - Brand1 | None, + Brand | None, Field( description='Brand protocol capabilities. Only present if brand is in supported_protocols. Brand agents provide identity data (logos, colors, tone, assets) and optionally rights clearance for licensable content (talent, music, stock media).' ), diff --git a/src/adcp/types/generated_poc/core/account.py b/src/adcp/types/generated_poc/core/account.py index 152f6b4b1..9eae0de54 100644 --- a/src/adcp/types/generated_poc/core/account.py +++ b/src/adcp/types/generated_poc/core/account.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/account.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -17,7 +17,7 @@ from . import ext as ext_1 from . import notification_config from . import operator_unit as operator_unit_1 -from . import webhook_activity_record +from . import reporting_delivery_config_state, webhook_activity_record class CreditLimit(AdCPBaseModel): @@ -245,7 +245,14 @@ class Account(AdCPBaseModel): notification_configs: Annotated[ list[notification_config.NotificationConfig] | None, Field( - description='Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, durable account-change wake-ups, and wholesale feed changes. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. account.change_recorded wakes receivers to drain list_account_changes; indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.', + description='Account-level webhook subscriptions for creative lifecycle/assignment changes, indicators.changed, account status, durable account-change wake-ups, wholesale feed changes, and reporting.delivery_ready. Buyers manage entries via sync_accounts and verify persisted state on list_accounts. account.change_recorded wakes receivers to drain list_account_changes; reporting.delivery_ready is repaired through get_reporting_status; indicator and assignment payloads are invalidations repaired completely through get_media_buys; list_creatives may provide a bounded reverse projection. Distinct from per-resource push_notification_config. Entries are keyed by account-scoped subscriber_id; credentials are write-only.', + max_length=16, + ), + ] = None + reporting_delivery_configs: Annotated[ + list[reporting_delivery_config_state.ReportingDeliveryConfigurationState] | None, + Field( + description="Resolved durable reporting delivery configurations owned by the authenticated caller for this account. list_accounts MUST expose only the calling principal's set. State and seller-issued destination_ref are returned; credentials and bearer profiles MUST NOT appear. Any setup URL is a secret-free authenticated entry point, not a bearer credential.", max_length=16, ), ] = None diff --git a/src/adcp/types/generated_poc/core/assets/card_asset.py b/src/adcp/types/generated_poc/core/assets/card_asset.py index dd5e5de7a..d4a5904f5 100644 --- a/src/adcp/types/generated_poc/core/assets/card_asset.py +++ b/src/adcp/types/generated_poc/core/assets/card_asset.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/assets/card_asset.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -9,7 +9,6 @@ from adcp.types.base import AdCPBaseModel from pydantic import ConfigDict, Field -from .. import provenance as provenance_1 from . import asset_union @@ -61,7 +60,7 @@ class CardAsset(AdCPBaseModel): ), ] = None provenance: Annotated[ - provenance_1.Provenance | None, + asset_union.Provenance | None, Field( description='Provenance metadata for this card, overrides manifest-level provenance.' ), diff --git a/src/adcp/types/generated_poc/core/canonical_media_buy_action.py b/src/adcp/types/generated_poc/core/canonical_media_buy_action.py index 9d957d2de..42adc5330 100644 --- a/src/adcp/types/generated_poc/core/canonical_media_buy_action.py +++ b/src/adcp/types/generated_poc/core/canonical_media_buy_action.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/canonical_media_buy_action.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -34,7 +34,7 @@ class Action(StrEnum): remove_packages = 'remove_packages' -class Action2(StrEnum): +class Action3(StrEnum): cancel = 'cancel' extend_flight = 'extend_flight' shorten_flight = 'shorten_flight' @@ -51,7 +51,7 @@ class Action2(StrEnum): remove_packages = 'remove_packages' -class Action3(StrEnum): +class Action4(StrEnum): replace_creative = 'replace_creative' update_creative_assignments = 'update_creative_assignments' remove_creative = 'remove_creative' @@ -64,12 +64,12 @@ class CanonicalMediaBuyAction1(CanonicalMediaBuyActionFields): class CanonicalMediaBuyAction2(CanonicalMediaBuyActionFields): task: Literal['refine_proposals'] = 'refine_proposals' - action: Action2 + action: Action3 class CanonicalMediaBuyAction3(CanonicalMediaBuyActionFields): task: Literal['sync_creatives'] = 'sync_creatives' - action: Action3 + action: Action4 | None = None class CanonicalMediaBuyAction( diff --git a/src/adcp/types/generated_poc/core/mcp_webhook_payload.py b/src/adcp/types/generated_poc/core/mcp_webhook_payload.py index 745dc9778..9b6f7f99f 100644 --- a/src/adcp/types/generated_poc/core/mcp_webhook_payload.py +++ b/src/adcp/types/generated_poc/core/mcp_webhook_payload.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/mcp_webhook_payload.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -39,7 +39,7 @@ class McpWebhookPayload(AdCPBaseModel): operation_id: Annotated[ str, Field( - description='Client-generated correlation identifier for the operation that produced this webhook. Buyers supply this value at webhook registration time via `push_notification_config.operation_id`; sellers MUST echo it verbatim in every webhook payload. Sellers MUST NOT derive `operation_id` by parsing `push_notification_config.url` — the URL is opaque to the seller. Receivers MAY dispatch endpoints by URL path or query string, but MUST correlate the operation using this payload field, not URL-derived values. See [Webhooks — Operation IDs and URL templates](/docs/building/by-layer/L3/webhooks#operation-ids-and-url-templates) for the full normative wire contract.' + description='Client-generated correlation identifier for the operation that produced this webhook. Buyers supply this value at webhook registration time via `push_notification_config.operation_id` or, for scheduled delivery reports, `reporting_webhook.operation_id`; sellers MUST echo it verbatim in every webhook payload. Sellers MUST NOT derive `operation_id` by parsing either registration URL — URLs are opaque to the seller. Receivers MAY dispatch endpoints by URL path or query string, but MUST correlate the operation using this payload field, not URL-derived values. See [Webhooks — Operation IDs and URL templates](/docs/building/by-layer/L3/webhooks#operation-ids-and-url-templates) for the full normative wire contract.' ), ] task_id: Annotated[ diff --git a/src/adcp/types/generated_poc/core/notification_config.py b/src/adcp/types/generated_poc/core/notification_config.py index aa6801608..c383530e4 100644 --- a/src/adcp/types/generated_poc/core/notification_config.py +++ b/src/adcp/types/generated_poc/core/notification_config.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/notification_config.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -30,6 +30,7 @@ class EventType(StrEnum): signal_priced = 'signal.priced' signal_removed = 'signal.removed' wholesale_feed_bulk_change = 'wholesale_feed.bulk_change' + reporting_delivery_ready = 'reporting.delivery_ready' class ProductPayloadView(StrEnum): @@ -73,7 +74,7 @@ class NotificationConfig(AdCPBaseModel): event_types: Annotated[ list[EventType], Field( - description='Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, and wholesale feed events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.', + description='Account-anchored notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new account-anchored types are added. Creative lifecycle, assignment, indicator, account status, wholesale feed, and reporting.delivery_ready events are valid here; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `window_update`, `impairment`) and agent-anchored types (`capabilities.changed`) are schema-invalid on this surface and sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.', min_length=1, ), ] diff --git a/src/adcp/types/generated_poc/core/reporting_capabilities.py b/src/adcp/types/generated_poc/core/reporting_capabilities.py index bcd2025c7..31bf5831a 100644 --- a/src/adcp/types/generated_poc/core/reporting_capabilities.py +++ b/src/adcp/types/generated_poc/core/reporting_capabilities.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_capabilities.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -8,7 +8,7 @@ from typing import Annotated from adcp.types.base import AdCPBaseModel -from pydantic import ConfigDict, Field +from pydantic import ConfigDict, Field, RootModel from ..enums import available_metric, reporting_frequency from . import ( @@ -21,6 +21,10 @@ ) +class ReportingDeliveryOfferingId(RootModel[str]): + root: Annotated[str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$')] + + class DateRangeSupport(StrEnum): date_range = 'date_range' lifetime_only = 'lifetime_only' @@ -71,6 +75,12 @@ class ReportingCapabilities(AdCPBaseModel): bool, Field(description='Whether this product supports webhook-based reporting notifications'), ] + reporting_delivery_offering_ids: Annotated[ + list[ReportingDeliveryOfferingId] | None, + Field( + description='Product-scoped subset of get_adcp_capabilities.media_buy.reporting_delivery.offerings[].offering_id that packages using this product can satisfy. This binds seller-wide managed-delivery offerings to product/package eligibility. An empty array explicitly declares no managed offering; absence means product-level applicability is unknown and MUST NOT be inferred from the seller-wide list. Account, seat, credential, or provider constraints may narrow support further during sync_accounts validation.' + ), + ] = None available_metrics: Annotated[ list[available_metric.AvailableMetric], Field( diff --git a/src/adcp/types/generated_poc/core/reporting_coverage.py b/src/adcp/types/generated_poc/core/reporting_coverage.py new file mode 100644 index 000000000..112384f6f --- /dev/null +++ b/src/adcp/types/generated_poc/core/reporting_coverage.py @@ -0,0 +1,102 @@ +# generated by datamodel-codegen: +# filename: core/reporting_coverage.json +# timestamp: 2026-08-29T05:35:33+00:00 + +from __future__ import annotations + +from adcp.types._str_enum import StrEnum +from typing import Annotated + +from adcp.types.base import AdCPBaseModel +from pydantic import AwareDatetime, ConfigDict, Field, RootModel + + +class Status(StrEnum): + full = 'full' + partial = 'partial' + none = 'none' + unknown = 'unknown' + + +class MediaBuyId(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class FullyCoveredMediaBuyId(MediaBuyId): + pass + + +class PartiallyCoveredMediaBuyId(MediaBuyId): + pass + + +class UnsupportedMediaBuyId(MediaBuyId): + pass + + +class UnknownMediaBuyId(MediaBuyId): + pass + + +class PackageId(MediaBuyId): + pass + + +class CoveredPackageId(MediaBuyId): + pass + + +class UnsupportedPackageId(MediaBuyId): + pass + + +class UnknownPackageId(MediaBuyId): + pass + + +class Reason(StrEnum): + offering_unsupported = 'offering_unsupported' + account_entitlement_unavailable = 'account_entitlement_unavailable' + credential_scope_insufficient = 'credential_scope_insufficient' + provider_limitation = 'provider_limitation' + capability_unknown = 'capability_unknown' + + +class Limitation(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + reason: Reason + media_buy_id: Annotated[str, Field(min_length=1)] + package_ids: Annotated[list[PackageId] | None, Field(min_length=1)] = None + + +class ReportingCoverage(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + status: Status + evaluated_at: AwareDatetime + media_buy_ids: Annotated[ + list[MediaBuyId], + Field( + description='Exact media-buy denominator, including unsupported and unknown buys. An empty array is an explicitly evaluated zero-buy scope.' + ), + ] + fully_covered_media_buy_ids: list[FullyCoveredMediaBuyId] + partially_covered_media_buy_ids: list[PartiallyCoveredMediaBuyId] + unsupported_media_buy_ids: list[UnsupportedMediaBuyId] + unknown_media_buy_ids: list[UnknownMediaBuyId] + package_ids: Annotated[ + list[PackageId], + Field(description='Exact package denominator for the evaluated media buys.'), + ] + covered_package_ids: list[CoveredPackageId] + unsupported_package_ids: list[UnsupportedPackageId] + unknown_package_ids: list[UnknownPackageId] + limitations: Annotated[ + list[Limitation], + Field( + description='Stable reasons that some requested scope is not covered by the exact selected offering. These are capability facts, not delivery failures.' + ), + ] diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config.py b/src/adcp/types/generated_poc/core/reporting_delivery_config.py index 191f2db27..59e8510cd 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_config.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_config.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -32,6 +32,11 @@ class Scope(AdCPBaseModel): media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None +class CoverageRequirement(StrEnum): + full = 'full' + allow_partial = 'allow_partial' + + class ReportingDeliveryConfiguration(AdCPBaseModel): model_config = ConfigDict( extra='forbid', @@ -92,6 +97,12 @@ class ReportingDeliveryConfiguration(AdCPBaseModel): ), ] scope: Annotated[Scope, Field(description='Media buys covered by this configuration.')] + coverage_requirement: Annotated[ + CoverageRequirement, + Field( + description='Whether every package in the resolved media-buy scope must support the exact selected offering. full fails closed when any package is unsupported or unknown. allow_partial permits publication only for the explicitly covered package denominator; every revision and status response still exposes partial coverage and MUST NOT present covered-subset totals as whole-buy totals.' + ), + ] required_finality: Annotated[ reporting_finality.ReportingFinality, Field( diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py index 0e86dc0a2..eae4ac296 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_config_state.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_config_state.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -10,7 +10,7 @@ from adcp.types.base import AdCPBaseModel from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field -from . import reporting_delivery_config, reporting_status_issue +from . import reporting_coverage, reporting_delivery_config, reporting_status_issue class State(StrEnum): @@ -74,6 +74,12 @@ class ReportingDeliveryConfigurationState(AdCPBaseModel): description='End of historical access to a producer-hosted share/resource for a still-authorized principal after voluntary deactivation. Inapplicable to data already written into a buyer-owned destination.' ), ] = None + current_coverage: Annotated[ + reporting_coverage.ReportingCoverage | None, + Field( + description='Current effective product/package coverage for the selected offering and resolved account. This setup-time view may change as media buys or provider capabilities change; each period obligation later freezes its own authoritative coverage.' + ), + ] = None setup: Annotated[ Setup | None, Field( diff --git a/src/adcp/types/generated_poc/core/reporting_delivery_offering.py b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py index b3c74ea65..6e3869522 100644 --- a/src/adcp/types/generated_poc/core/reporting_delivery_offering.py +++ b/src/adcp/types/generated_poc/core/reporting_delivery_offering.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_delivery_offering.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -173,7 +173,12 @@ class ReportingDeliveryOffering(AdCPBaseModel): offering_id: Annotated[ str, Field(max_length=128, min_length=1, pattern='^[A-Za-z0-9_.:-]{1,128}$') ] - feed_purpose: FeedPurpose + feed_purpose: Annotated[ + FeedPurpose, + Field( + description='Operational use of this independently scheduled offering. pacing commonly selects short-period snapshot revisions; billing requires official revisions and consumer reconciliation.' + ), + ] report_definition_id: Annotated[ str, Field( @@ -200,8 +205,19 @@ class ReportingDeliveryOffering(AdCPBaseModel): ReportingProfile, Field(description='Machine-readable semantic and validation contract for delivered rows.'), ] - schedule: reporting_schedule_offering.ReportingScheduleOffering - supported_finality: Annotated[list[reporting_finality.ReportingFinality], Field(min_length=1)] + schedule: Annotated[ + reporting_schedule_offering.ReportingScheduleOffering, + Field( + description='Period and availability SLA this offering can honor. For example, PT1H with snapshot finality explicitly advertises hourly provisional snapshots; a separate P1D official offering advertises daily finalized reporting.' + ), + ] + supported_finality: Annotated[ + list[reporting_finality.ReportingFinality], + Field( + description='Finality classes available under this exact report definition, schedule, and delivery method. snapshot is an explicit provisional capability, not inferred from poll frequency. Use separate atomic offerings when snapshot and official schedules or methods differ.', + min_length=1, + ), + ] reconciliation_mode: Annotated[ reporting_reconciliation_mode.ReportingReconciliationMode, Field( diff --git a/src/adcp/types/generated_poc/core/reporting_obligation.py b/src/adcp/types/generated_poc/core/reporting_obligation.py index 07d3dc677..fab4d6fb8 100644 --- a/src/adcp/types/generated_poc/core/reporting_obligation.py +++ b/src/adcp/types/generated_poc/core/reporting_obligation.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_obligation.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -11,7 +11,12 @@ from pydantic import AwareDatetime, ConfigDict, Field, RootModel from ..enums import reporting_finality, reporting_health -from . import reporting_reconciliation_mode, reporting_schedule, reporting_status_issue +from . import ( + reporting_coverage, + reporting_reconciliation_mode, + reporting_schedule, + reporting_status_issue, +) class FeedPurpose(StrEnum): @@ -76,6 +81,12 @@ class ReportingObligation(AdCPBaseModel): description='Instant at which the configured scope was resolved and frozen for this obligation. For all_media_buys, include every caller-authorized account media buy whose effective flight overlaps the half-open period and was known by this cutoff. Later-created or backdated buys do not rewrite this obligation.' ), ] + coverage: Annotated[ + reporting_coverage.ReportingCoverage, + Field( + description='Immutable effective coverage of the exact selected offering at this period boundary. Delivery health is evaluated separately over the covered denominator.' + ), + ] period: Period expected_at: AwareDatetime schedule: Annotated[ diff --git a/src/adcp/types/generated_poc/core/reporting_revision.py b/src/adcp/types/generated_poc/core/reporting_revision.py index 4410937f6..7b51ff6fe 100644 --- a/src/adcp/types/generated_poc/core/reporting_revision.py +++ b/src/adcp/types/generated_poc/core/reporting_revision.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_revision.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -11,7 +11,7 @@ from pydantic import AnyUrl, AwareDatetime, ConfigDict, Field, RootModel from ..enums import reporting_finality -from . import reporting_canonical_content_digest, reporting_control_total +from . import reporting_canonical_content_digest, reporting_control_total, reporting_coverage class MediaBuyId(RootModel[str]): @@ -96,6 +96,12 @@ class ReportingRevision(AdCPBaseModel): description='Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator.' ), ] + coverage: Annotated[ + reporting_coverage.ReportingCoverage, + Field( + description='Frozen product/package denominator represented by this logical content. The same coverage follows the revision to every destination.' + ), + ] period: Annotated[ Period, Field(description='Half-open reporting interval with its source calendar boundary.') ] diff --git a/src/adcp/types/generated_poc/core/reporting_status_issue.py b/src/adcp/types/generated_poc/core/reporting_status_issue.py index e23d9116a..720106ecf 100644 --- a/src/adcp/types/generated_poc/core/reporting_status_issue.py +++ b/src/adcp/types/generated_poc/core/reporting_status_issue.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/reporting_status_issue.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -17,6 +17,7 @@ class Code(StrEnum): DELIVERY_FAILED = 'DELIVERY_FAILED' ACCESS_REQUIRED = 'ACCESS_REQUIRED' CONFIGURATION_REQUIRED = 'CONFIGURATION_REQUIRED' + REPORTING_COVERAGE_INCOMPLETE = 'REPORTING_COVERAGE_INCOMPLETE' RESOURCE_EXPIRED = 'RESOURCE_EXPIRED' READER_INCOMPATIBLE = 'READER_INCOMPATIBLE' HISTORY_UNAVAILABLE = 'HISTORY_UNAVAILABLE' @@ -40,6 +41,7 @@ class RecommendedAction(StrEnum): contact_provider = 'contact_provider' repair_access = 'repair_access' update_configuration = 'update_configuration' + change_reporting_scope = 'change_reporting_scope' use_supported_reader = 'use_supported_reader' @@ -53,6 +55,10 @@ class MediaBuyId(RootModel[str]): root: Annotated[str, Field(min_length=1)] +class PackageId(MediaBuyId): + pass + + class ReportingStatusIssue(AdCPBaseModel): model_config = ConfigDict( extra='forbid', @@ -77,6 +83,7 @@ class ReportingStatusIssue(AdCPBaseModel): delivery_config_version: Annotated[int | None, Field(ge=1)] = None feed_purpose: FeedPurpose | None = None media_buy_ids: Annotated[list[MediaBuyId] | None, Field(min_length=1)] = None + package_ids: Annotated[list[PackageId] | None, Field(min_length=1)] = None period_start: AwareDatetime | None = None period_end: AwareDatetime | None = None expected_at: AwareDatetime | None = None diff --git a/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py b/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py index 64dba5263..a476b2644 100644 --- a/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py +++ b/src/adcp/types/generated_poc/core/reporting_verification_profile_set.py @@ -1,21 +1,24 @@ # generated by datamodel-codegen: # filename: core/reporting_verification_profile_set.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations +from adcp.types._str_enum import StrEnum from typing import Annotated from pydantic import Field, RootModel -from . import reporting_verification_profile +class ReportingVerificationProfileSetEnum(StrEnum): + native_commit = 'native_commit' + manifest_checksums = 'manifest_checksums' + canonical_digest = 'canonical_digest' -class ReportingVerificationProfileSet( - RootModel[list[reporting_verification_profile.ReportingVerificationProfile]] -): + +class ReportingVerificationProfileSet(RootModel[list[ReportingVerificationProfileSetEnum]]): root: Annotated[ - list[reporting_verification_profile.ReportingVerificationProfile], + list[ReportingVerificationProfileSetEnum], Field( description="Verification profiles the destination can accept. native_commit requires provider-native transaction/version evidence plus counts and control totals; manifest_checksums requires a committed file manifest with cryptographic checksums; canonical_digest requires recomputation of the canonical logical-content digest. A reporting feed selects one profile from this allowed set according to the seller offering and the feed's strictness requirements.", min_length=1, diff --git a/src/adcp/types/generated_poc/core/x_entity_types.py b/src/adcp/types/generated_poc/core/x_entity_types.py index 4d7243f7a..523250b36 100644 --- a/src/adcp/types/generated_poc/core/x_entity_types.py +++ b/src/adcp/types/generated_poc/core/x_entity_types.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: core/x_entity_types.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -72,4 +72,13 @@ class XEntityTypes(StrEnum): si_session = 'si_session' offering = 'offering' vendor_metric = 'vendor_metric' + reporting_destination = 'reporting_destination' + reporting_offering = 'reporting_offering' + reporting_delivery_config = 'reporting_delivery_config' + reporting_definition = 'reporting_definition' + reporting_obligation = 'reporting_obligation' + reporting_revision = 'reporting_revision' + reporting_materialization = 'reporting_materialization' + reporting_receipt = 'reporting_receipt' + reporting_resource = 'reporting_resource' identity_relying_party = 'identity_relying_party' diff --git a/src/adcp/types/generated_poc/enums/notification_type.py b/src/adcp/types/generated_poc/enums/notification_type.py index b36dac810..6462e9ffc 100644 --- a/src/adcp/types/generated_poc/enums/notification_type.py +++ b/src/adcp/types/generated_poc/enums/notification_type.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: enums/notification_type.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -30,3 +30,4 @@ class NotificationType(StrEnum): signal_removed = 'signal.removed' wholesale_feed_bulk_change = 'wholesale_feed.bulk_change' capabilities_changed = 'capabilities.changed' + reporting_delivery_ready = 'reporting.delivery_ready' diff --git a/src/adcp/types/generated_poc/extensions/extension_meta.py b/src/adcp/types/generated_poc/extensions/extension_meta.py index 94b25efbe..14aab7ae9 100644 --- a/src/adcp/types/generated_poc/extensions/extension_meta.py +++ b/src/adcp/types/generated_poc/extensions/extension_meta.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: extensions/extension_meta.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -14,14 +14,6 @@ class AdcpExtensionFileSchema(AdCPBaseModel): field_schema: Annotated[ Literal['http://json-schema.org/draft-07/schema#'], Field(alias='$schema') ] = 'http://json-schema.org/draft-07/schema#' - field_id: Annotated[ - str, - Field( - alias='$id', - description='Extension ID following pattern /schemas/extensions/{namespace}.json', - pattern='^/schemas/extensions/[a-z][a-z0-9_]*\\.json$', - ), - ] title: Annotated[str, Field(description='Human-readable title for the extension')] description: Annotated[str, Field(description='Description of what this extension provides')] valid_from: Annotated[ diff --git a/src/adcp/types/generated_poc/governance/sync_plans_response.py b/src/adcp/types/generated_poc/governance/sync_plans_response.py index fd68eafca..33c3392a6 100644 --- a/src/adcp/types/generated_poc/governance/sync_plans_response.py +++ b/src/adcp/types/generated_poc/governance/sync_plans_response.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: governance/sync_plans_response.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -22,7 +22,7 @@ class Status(StrEnum): error = 'error' -class Status40(StrEnum): +class Status43(StrEnum): active = 'active' inactive = 'inactive' @@ -32,7 +32,7 @@ class Category(AdCPBaseModel): extra='forbid', ) category_id: Annotated[str, Field(description='Validation category identifier.')] - status: Annotated[Status40, Field(description='Whether this category is active for this plan.')] + status: Annotated[Status43, Field(description='Whether this category is active for this plan.')] class Source(StrEnum): diff --git a/src/adcp/types/generated_poc/media_buy/get_products_request.py b/src/adcp/types/generated_poc/media_buy/get_products_request.py index 0e1aa9816..341c1a642 100644 --- a/src/adcp/types/generated_poc/media_buy/get_products_request.py +++ b/src/adcp/types/generated_poc/media_buy/get_products_request.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: media_buy/get_products_request.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -78,7 +78,7 @@ class Refine2(AdCPBaseModel): ] = None -class Action7(StrEnum): +class Action8(StrEnum): include = 'include' omit = 'omit' finalize = 'finalize' @@ -95,11 +95,11 @@ class Refine3(AdCPBaseModel): str, Field(description='Proposal ID from a previous get_products response.', min_length=1) ] action: Annotated[ - Action7 | None, + Action8 | None, Field( description="'include' (default): return this proposal with updated allocations and pricing. 'omit': exclude this proposal from the response. 'finalize': request firm pricing and inventory hold. New callers use refine_proposals with action revise for a draft successor or action finalize for a committed held successor; terminal feedback is available through decline_proposals.\n\nLegacy finalize is exclusive within the parent `refine[]` array: see the array-level description for the finalize-exclusivity rule (mixing finalize with non-finalize entries is rejected) and multi-finalize atomicity contract." ), - ] = Action7.include + ] = Action8.include ask: Annotated[ str | None, Field( diff --git a/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py b/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py index 161e01db7..da267d24b 100644 --- a/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py +++ b/src/adcp/types/generated_poc/media_buy/get_reporting_status_response.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: media_buy/get_reporting_status_response.json -# timestamp: 2026-08-28T07:58:14+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -15,6 +15,7 @@ from ..core import ext as ext_1 from ..core import ( pagination_response, + reporting_coverage, reporting_materialization, reporting_obligation, reporting_receipt, @@ -82,12 +83,11 @@ class Scope(AdCPBaseModel): delivery_config_generations: Annotated[ list[DeliveryConfigGeneration], Field( - description='Exact independently reconciled configuration generations in the denominator.', - min_length=1, + description='Exact independently reconciled configuration generations in the denominator.' ), ] - feed_purposes: Annotated[list[FeedPurpose], Field(min_length=1)] - finality: Annotated[list[reporting_finality.ReportingFinality], Field(min_length=1)] + feed_purposes: list[FeedPurpose] + finality: list[reporting_finality.ReportingFinality] ledger_retained_from: Annotated[ AwareDatetime, Field( @@ -132,6 +132,12 @@ class GetReportingStatusResponse(AdcpVersionEnvelope, ProtocolEnvelope): ), ] = None health: reporting_health.ReportingHealth | None = None + coverage: Annotated[ + reporting_coverage.ReportingCoverage | None, + Field( + description='Aggregated effective coverage for the exact selected scope. This remains independent of reporting health and finality so a fresh covered subset cannot look like complete campaign reporting.' + ), + ] = None data_through: Annotated[ AwareDatetime | None, Field( diff --git a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py index cdfab0374..02cf6c18f 100644 --- a/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py +++ b/src/adcp/types/generated_poc/media_buy/sync_reporting_receipts_request.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: media_buy/sync_reporting_receipts_request.json -# timestamp: 2026-08-29T04:02:05+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -17,7 +17,7 @@ class SyncReportingReceiptsRequest(AdcpVersionEnvelope): model_config = ConfigDict( - extra='forbid', + extra='allow', ) adcp_version: version_envelope.AdcpVersion | None = None adcp_major_version: version_envelope.AdcpMajorVersion | None = None diff --git a/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py b/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py index 3faa02f84..0e4e9e666 100644 --- a/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +++ b/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: protocol/get_adcp_capabilities_response.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -23,6 +23,7 @@ macro_resolution_capability, media_buy_features, postal_area_support, + reporting_delivery_capabilities, vendor_metric_id, ) from ..core.protocol_envelope import ProtocolEnvelope @@ -99,13 +100,52 @@ class Idempotency(AdCPBaseModel): ] = False -class Idempotency3(AdCPBaseModel): +class Idempotency1(AdCPBaseModel): supported: Annotated[ Literal[False], Field(description='Discriminator. False means the seller does not deduplicate retries.'), ] +class SupportedSection(StrEnum): + notification_configs = 'notification_configs' + reporting_destinations = 'reporting_destinations' + + +class AgentConfiguration(AdCPBaseModel): + model_config = ConfigDict( + extra='forbid', + ) + supported: Literal[True] + sync_task: Literal['sync_agent_configuration'] = 'sync_agent_configuration' + supported_sections: Annotated[ + list[SupportedSection], + Field( + description='Connection configuration sections this seller accepts. Unsupported sections are rejected rather than silently ignored.', + min_length=1, + ), + ] + max_reporting_destinations: Annotated[ + int | None, + Field( + description='Maximum caller-scoped destination bindings when reporting_destinations is supported. The task schema has a portable maximum of 64; sellers may advertise a lower operational limit.', + ge=1, + le=64, + ), + ] = None + optimistic_concurrency: Annotated[ + bool, + Field( + description='Whether expected_configuration_version is enforced. Sellers SHOULD support it when several services may authenticate as the same stable principal.' + ), + ] + + +class RegistrationTask(StrEnum): + sync_agent_notification_configs = 'sync_agent_notification_configs' + sync_agent_configuration = 'sync_agent_configuration' + + class Notifications(AdCPBaseModel): model_config = ConfigDict( extra='allow', @@ -113,15 +153,15 @@ class Notifications(AdCPBaseModel): supported: Annotated[ Literal[True], Field( - description='Discriminator. True means the seller accepts `sync_agent_notification_configs` for `capabilities.changed` subscriptions.' + description='Discriminator. True means the seller accepts the declared registration_task for capabilities.changed subscriptions.' ), ] registration_task: Annotated[ - Literal['sync_agent_notification_configs'], + RegistrationTask, Field( description='Task consumers call to manage their caller-scoped agent-level subscriber set.' ), - ] = 'sync_agent_notification_configs' + ] event_types: Annotated[ list[Literal['capabilities.changed']], Field( @@ -139,7 +179,7 @@ class Notifications(AdCPBaseModel): ] = None -class Notifications5(AdCPBaseModel): +class Notifications1(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -178,9 +218,9 @@ class CapabilityChanges(AdCPBaseModel): ), ] = None notifications: Annotated[ - Notifications | Notifications5 | None, + Notifications | Notifications1 | None, Field( - description='Whether the seller supports agent-level capability-change webhooks. When supported, interested consumers register endpoint subscribers with `sync_agent_notification_configs`; each `capabilities.changed` fire is a small invalidation payload, and consumers repair by re-reading `get_adcp_capabilities`.' + description='Whether the seller supports agent-level capability-change webhooks. When supported, interested consumers register endpoint subscribers with the declared registration_task; sync_agent_configuration is preferred when the broader connection surface is available, while sync_agent_notification_configs remains the specialized compatibility task. Each capabilities.changed fire is a small invalidation payload, and consumers repair by re-reading get_adcp_capabilities.' ), ] = None @@ -190,7 +230,7 @@ class Mode(StrEnum): online_execution_check = 'online_execution_check' -class Tasks(AdCPBaseModel): +class Tasks1(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -198,7 +238,7 @@ class Tasks(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks12(AdCPBaseModel): +class Tasks2(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -206,7 +246,7 @@ class Tasks12(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks13(AdCPBaseModel): +class Tasks3(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -214,7 +254,7 @@ class Tasks13(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks14(AdCPBaseModel): +class Tasks4(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -222,7 +262,7 @@ class Tasks14(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks15(AdCPBaseModel): +class Tasks5(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -230,7 +270,7 @@ class Tasks15(AdCPBaseModel): modes: Annotated[list[Mode], Field(min_length=1)] -class Tasks16(AdCPBaseModel): +class Tasks6(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -238,7 +278,7 @@ class Tasks16(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks17(AdCPBaseModel): +class Tasks7(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -246,7 +286,7 @@ class Tasks17(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks18(AdCPBaseModel): +class Tasks8(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -254,7 +294,7 @@ class Tasks18(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks19(AdCPBaseModel): +class Tasks9(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -262,11 +302,11 @@ class Tasks19(AdCPBaseModel): modes: Annotated[list[Literal['signed_context']], Field(max_length=1, min_length=1)] -class Tasks10( - RootModel[Tasks | Tasks12 | Tasks13 | Tasks14 | Tasks15 | Tasks16 | Tasks17 | Tasks18 | Tasks19] +class Tasks( + RootModel[Tasks1 | Tasks2 | Tasks3 | Tasks4 | Tasks5 | Tasks6 | Tasks7 | Tasks8 | Tasks9] ): root: Annotated[ - Tasks | Tasks12 | Tasks13 | Tasks14 | Tasks15 | Tasks16 | Tasks17 | Tasks18 | Tasks19, + Tasks1 | Tasks2 | Tasks3 | Tasks4 | Tasks5 | Tasks6 | Tasks7 | Tasks8 | Tasks9, Field(discriminator='task'), ] def __getattr__(self, name: str) -> Any: @@ -280,7 +320,7 @@ class GovernanceEnforcement(AdCPBaseModel): extra='forbid', ) tasks: Annotated[ - list[Tasks10], + list[Tasks], Field( description='Task-scoped enforcement claims. The task field is a semantic uniqueness key: an agent MUST emit at most one entry per task and combine all supported modes in that entry. JSON Schema uniqueItems only rejects structurally identical objects, so producers and capability validators MUST enforce task-key uniqueness separately. Values correspond to request schemas annotated with x-governed-commitment. Online execution checks are currently defined only for media-buy tasks, whose prepared result has the PlannedDelivery contract; other roles can enforce signed intent authorization without inventing media-buy fields.', min_length=1, @@ -304,7 +344,7 @@ class SupportedProtocol(StrEnum): measurement = 'measurement' -class Notifications6(AdCPBaseModel): +class Notifications2(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -339,7 +379,7 @@ class Notifications6(AdCPBaseModel): ] = False -class Notifications7(AdCPBaseModel): +class Notifications3(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -378,7 +418,7 @@ class ChangeFeed(AdCPBaseModel): ] -class ChangeFeed3(AdCPBaseModel): +class ChangeFeed1(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) @@ -410,7 +450,7 @@ class IdentityUpdates(AdCPBaseModel): ] -class IdentityUpdates3(AdCPBaseModel): +class IdentityUpdates1(AdCPBaseModel): model_config = ConfigDict( extra='forbid', ) @@ -468,19 +508,19 @@ class Account(AdCPBaseModel): ), ] = False notifications: Annotated[ - Notifications6 | Notifications7 | None, + Notifications2 | Notifications3 | None, Field( description='Whether the seller supports durable account-lifecycle webhooks through account-level `notification_configs[]`. This capability is specifically for account status changes such as approval, rejection, payment-required, suspension, recovery, and closure. When supported, buyers register subscribers with `sync_accounts.accounts[].notification_configs[]`; each `account.status_changed` fire is an invalidation payload, and buyers repair by re-reading `list_accounts` for the account_id.' ), ] = None change_feed: Annotated[ - ChangeFeed | ChangeFeed3 | None, + ChangeFeed | ChangeFeed1 | None, Field( description='Whether the seller exposes a durable, ordered feed of material changes to authoritative account-scoped state. This is distinct from webhook_activity transport diagnostics and from current-state reads. Sellers claiming support MUST retain changes for at least 90 days after recording and MUST produce records regardless of whether a mutation originated through AdCP, a seller surface, another authorized principal, seller automation, or a connected platform within declared coverage.' ), ] = None identity_updates: Annotated[ - IdentityUpdates | IdentityUpdates3 | None, + IdentityUpdates | IdentityUpdates1 | None, Field( description='Whether the seller accepts buyer-desired operator identity reconciliation through sync_accounts settings-update entries. Sellers declaring support expose the exact identity transitions they implement, MUST return account revisions from sync_accounts and list_accounts, and MUST return identity_change_preview for dry-run identity updates.' ), @@ -783,7 +823,7 @@ class VendorMetricOptimization(AdCPBaseModel): ] = None -class SupportedTarget3(StrEnum): +class SupportedTarget1(StrEnum): cost_per = 'cost_per' per_ad_spend = 'per_ad_spend' maximize_value = 'maximize_value' @@ -1093,7 +1133,7 @@ class Governance(AdCPBaseModel): ] = None -class Type9(StrEnum): +class Type6(StrEnum): mcp = 'mcp' a2a = 'a2a' @@ -1102,7 +1142,7 @@ class Transport(AdCPBaseModel): model_config = ConfigDict( extra='allow', ) - type: Annotated[Type9, Field(description='Protocol transport type')] + type: Annotated[Type6, Field(description='Protocol transport type')] url: Annotated[AnyUrl, Field(description='Agent endpoint URL for this transport')] @@ -1115,7 +1155,7 @@ class Endpoint(AdCPBaseModel): ), ] preferred: Annotated[ - Type9 | None, Field(description='Preferred transport when host supports multiple') + Type6 | None, Field(description='Preferred transport when host supports multiple') ] = None @@ -1370,7 +1410,7 @@ class WebhookSigning(AdCPBaseModel): bool | None, Field( deprecated=True, - description='Whether this agent will fall back to HMAC-SHA256 on the legacy push_notification_config.authentication, accounts[].notification_configs[].authentication, or sync_agent_notification_configs.notification_configs[].authentication paths for receivers that have not adopted RFC 9421. Deprecated; removed in AdCP 4.0.', + description='Whether this agent will fall back to HMAC-SHA256 on the legacy push_notification_config.authentication, accounts[].notification_configs[].authentication, sync_agent_configuration.configuration.notification_configs[].authentication, or sync_agent_notification_configs.notification_configs[].authentication paths for receivers that have not adopted RFC 9421. Deprecated; removed in AdCP 4.0.', ), ] = False delivery_retry_horizon_seconds: Annotated[ @@ -1557,7 +1597,7 @@ class WholesaleFeedVersioning(AdCPBaseModel): ] = None -class EventType5(StrEnum): +class EventType3(StrEnum): product_created = 'product.created' product_updated = 'product.updated' product_priced = 'product.priced' @@ -1580,7 +1620,7 @@ class WholesaleFeedWebhooks(AdCPBaseModel): ), ] event_types: Annotated[ - list[EventType5] | None, + list[EventType3] | None, Field( description='Wholesale feed webhook event types this agent can emit. Sales agents emit product.* events and MUST expose list_products or the deprecated 3.x wholesale get_products compatibility path. Signals agents emit signal.* events and MUST support wholesale get_signals. wholesale_feed.bulk_change requires at least one corresponding repair path.', min_length=1, @@ -1783,7 +1823,7 @@ class ConversionTracking(AdCPBaseModel): ), ] = None supported_targets: Annotated[ - list[SupportedTarget3] | None, + list[SupportedTarget1] | None, Field( description='Event-goal target kinds this seller can compute against. Buyers should only submit event-kind optimization goals whose target.kind is listed here — sellers MUST reject goals with unlisted target kinds. When omitted, only target-less event goals (maximize conversion count within budget) are guaranteed; sellers MAY accept specific target kinds but buyers should not rely on it. Named to parallel `metric_optimization.supported_targets` at the product level — same concept (which target kinds are supported), one at seller-capability granularity and one at product granularity.', min_length=1, @@ -2265,6 +2305,12 @@ class MediaBuy(AdCPBaseModel): min_length=1, ), ] = None + reporting_delivery: Annotated[ + reporting_delivery_capabilities.ReportingDeliveryCapabilities | None, + Field( + description='Managed reporting status and durable delivery capability. Presence requires media_buy.reporting_delivery in experimental_features. This generalizes, but does not remove, the legacy reporting_delivery_methods/offline_delivery_protocols surface.' + ), + ] = None supports_proposals: Annotated[ bool | None, Field( @@ -2408,11 +2454,17 @@ class Adcp(AdCPBaseModel): ), ] = None idempotency: Annotated[ - Idempotency | Idempotency3, + Idempotency | Idempotency1, Field( description='Idempotency semantics for mutating requests. Sellers MUST declare whether they honor idempotency_key replay protection so buyers can reason about safe retry behavior. Modeled as a discriminated union on the supported boolean so that code generators produce two named types (IdempotencySupported, IdempotencyUnsupported) with the replay_ttl_seconds invariant enforced at the type level — draft-07 if/then would be dropped by most generators (openapi-typescript, zod-to-json-schema, datamodel-code-generator pre-0.25, quicktype). Clients MUST NOT assume a default — a seller without this declaration is non-compliant and should be treated as unsafe for retry-sensitive operations.' ), ] + agent_configuration: Annotated[ + AgentConfiguration | None, + Field( + description='Caller-scoped durable connection configuration accepted by this agent. This is the buyer-to-seller configuration half of negotiation, not a second seller capability document: the seller advertises objective support here, while each authenticated caller submits its desired webhooks and reusable destinations through sync_agent_configuration. Per-account authority and feed selection remain in account/reporting configuration. Sellers exposing this block MUST list protocol.agent_configuration in experimental_features.' + ), + ] = None capability_changes: Annotated[ CapabilityChanges | None, Field( diff --git a/src/adcp/types/generated_poc/sponsored_intelligence/si_sponsored_context_receipt.py b/src/adcp/types/generated_poc/sponsored_intelligence/si_sponsored_context_receipt.py index 0a2bac1e1..99c6787f4 100644 --- a/src/adcp/types/generated_poc/sponsored_intelligence/si_sponsored_context_receipt.py +++ b/src/adcp/types/generated_poc/sponsored_intelligence/si_sponsored_context_receipt.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: sponsored_intelligence/si_sponsored_context_receipt.json -# timestamp: 2026-08-28T20:03:29+00:00 +# timestamp: 2026-08-29T05:35:33+00:00 from __future__ import annotations @@ -19,7 +19,7 @@ class Status(StrEnum): rejected = 'rejected' -class Status37(StrEnum): +class Status40(StrEnum): accepted = 'accepted' not_required = 'not_required' @@ -29,7 +29,7 @@ class DisclosureCommitment(AdCPBaseModel): extra='allow', ) status: Annotated[ - Status37, + Status40, Field( description="Host commitment status for the disclosure obligation. Use accepted when the declaration requires disclosure and the host will satisfy it; use not_required only when the declaration's disclosure_obligation.required is false. A host that will not satisfy a required disclosure rejects the sponsored context." ), diff --git a/src/adcp/validation/schema_loader.py b/src/adcp/validation/schema_loader.py index e4b10d38c..f764472fe 100644 --- a/src/adcp/validation/schema_loader.py +++ b/src/adcp/validation/schema_loader.py @@ -354,6 +354,29 @@ def _make_ref_resolver(state: _LoaderState, base_file: Path, schema: dict[str, A return RefResolver(base_uri=base_uri, referrer=schema, store=dict(state.registry)) +def _absolute_schema_reference_file(state: _LoaderState, reference: str) -> Path: + """Map versioned or source-style absolute AdCP refs into one local bundle.""" + parsed = urlparse(reference) + if parsed.scheme: + if parsed.scheme not in {"http", "https"} or parsed.hostname != "adcontextprotocol.org": + raise ValueError("schema reference is outside the local version bundle") + if not parsed.path.startswith("/schemas/"): + raise ValueError("schema reference is outside the local version bundle") + + root = state.root.root.resolve() + suffix = unquote(parsed.path.removeprefix("/schemas/")) + candidates = [root / suffix] + _, separator, without_version = suffix.partition("/") + if separator: + candidates.append(root / without_version) + + for candidate in candidates: + resolved = candidate.resolve() + if resolved.is_relative_to(root) and resolved.is_file(): + return resolved + raise ValueError("schema reference is outside the local version bundle") + + def _reachable_schema_store( state: _LoaderState, base_file: Path, @@ -376,19 +399,11 @@ def referenced_file(reference: str, current_file: Path) -> tuple[str, Path] | No return None parsed = urlparse(target) if parsed.scheme in {"http", "https"}: - prefix = f"/schemas/{state.bundle_key}/" - if parsed.hostname != "adcontextprotocol.org" or not parsed.path.startswith(prefix): - raise ValueError("schema reference is outside the local version bundle") - relative = Path(unquote(parsed.path[len(prefix) :])) - candidate = root / relative + candidate = _absolute_schema_reference_file(state, reference) elif parsed.scheme: raise ValueError("schema reference uses a non-local scheme") elif parsed.path.startswith("/schemas/"): - bundle_prefix = f"/schemas/{state.bundle_key}/" - if not parsed.path.startswith(bundle_prefix): - raise ValueError("schema reference is outside the local version bundle") - relative = Path(unquote(parsed.path[len(bundle_prefix) :])) - candidate = root / relative + candidate = _absolute_schema_reference_file(state, reference) else: candidate = current_file.parent / unquote(parsed.path) resolved = candidate.resolve() @@ -655,14 +670,7 @@ def get_bundle_adcp_version(*, version: str | None = None) -> str | None: def _reference_file(state: _LoaderState, current_file: Path, reference: str) -> Path: parsed = urlparse(reference) if parsed.scheme or parsed.path.startswith("/schemas/"): - marker = "/schemas/" - if marker not in parsed.path: - raise ValueError(f"unsupported external schema reference: {reference}") - version_and_path = parsed.path.split(marker, 1)[1] - _, separator, relative_path = version_and_path.partition("/") - if not separator: - raise ValueError(f"schema reference has no document path: {reference}") - return state.root.root / unquote(relative_path) + return _absolute_schema_reference_file(state, reference) return (current_file.parent / unquote(parsed.path)).resolve() diff --git a/tests/test_code_generation.py b/tests/test_code_generation.py index 9fa3091db..ac1ffad66 100644 --- a/tests/test_code_generation.py +++ b/tests/test_code_generation.py @@ -30,6 +30,30 @@ def test_rewrite_refs_localizes_canonical_schema_urls_without_corrupting_prerele assert schema["$ref"] == "../core/platform_extension_ref.json#/$defs/custom-shape" +def test_rewrite_refs_preserves_domain_in_root_relative_source_refs(): + """The first component after /schemas is a domain, not a version.""" + from scripts.generate_types import rewrite_refs + + enum_ref = {"$ref": "/schemas/enums/account-status.json"} + core_ref = {"$ref": "/schemas/core/brand-ref.json"} + + rewrite_refs(enum_ref, Path("core/account.json")) + rewrite_refs(core_ref, Path("account/sync-accounts-request.json")) + + assert enum_ref["$ref"] == "../enums/account_status.json" + assert core_ref["$ref"] == "../core/brand_ref.json" + + +def test_post_generate_ref_resolution_preserves_root_relative_domain(): + """Post-generation alias restoration resolves the same source ref shape.""" + from scripts.post_generate_fixes import _resolve_schema_ref + + assert _resolve_schema_ref( + Path("account/sync-accounts-response.json"), + "/schemas/core/brand-ref.json#/$defs/brand", + ) == Path("core/brand-ref.json") + + def test_rewrite_refs_preserves_external_urls_and_json_pointer_fragments(): """Hyphen normalization applies to local files, never external identifiers.""" from scripts.generate_types import rewrite_refs diff --git a/tests/test_reporting_reconciliation.py b/tests/test_reporting_reconciliation.py index 15c88e758..627ee507e 100644 --- a/tests/test_reporting_reconciliation.py +++ b/tests/test_reporting_reconciliation.py @@ -39,6 +39,20 @@ "end": "2026-09-01T00:00:00Z", "source_timezone": "UTC", } +COVERAGE = { + "status": "full", + "evaluated_at": PERIOD["end"], + "media_buy_ids": ["buy-1", "buy-2"], + "fully_covered_media_buy_ids": ["buy-1", "buy-2"], + "partially_covered_media_buy_ids": [], + "unsupported_media_buy_ids": [], + "unknown_media_buy_ids": [], + "package_ids": [], + "covered_package_ids": [], + "unsupported_package_ids": [], + "unknown_package_ids": [], + "limitations": [], +} TOTALS = [ { "name": "impressions", @@ -122,6 +136,7 @@ def test_capability_uses_public_reporting_delivery_model() -> None: "schema_ref_policy": "local_fragment_only", "account_id": "account-1", "media_buy_ids": ["buy-1", "buy-2"], + "coverage": COVERAGE, "period": PERIOD, "finality": "official", "observed_at": "2026-09-02T00:00:00Z", @@ -144,6 +159,7 @@ def _obligation(identifier: str = "obligation-billing") -> dict[str, object]: "reporting_profile": "billing-v1", "account_id": "account-1", "media_buy_ids": ["buy-1", "buy-2"], + "coverage": COVERAGE, "scope_resolved_at": PERIOD["end"], "period": PERIOD, "expected_at": "2026-09-02T00:00:00Z", @@ -466,6 +482,48 @@ async def test_missing_denominator_prevents_definitive_result() -> None: assert not result.missing_expected_periods +@pytest.mark.asyncio +async def test_partial_reporting_coverage_prevents_definitive_result() -> None: + raw = _response() + partial = deepcopy(COVERAGE) + partial.update( + status="partial", + fully_covered_media_buy_ids=["buy-1"], + partially_covered_media_buy_ids=["buy-2"], + ) + raw["periods"][0].update( + coverage=partial, + reconciliation_mode="delivery_only", + reconciliation_status="not_required", + health="complete", + ) + raw["revisions"][0]["coverage"] = deepcopy(partial) + + class PartialCoverageClient(_Client): + async def get_reporting_status( + self, request: GetReportingStatusRequest + ) -> TaskResult[GetReportingStatusResponse]: + return TaskResult( + status=TaskStatus.COMPLETED, + data=GetReportingStatusResponse.model_validate(deepcopy(raw)), + ) + + ledger = await load_reporting_ledger( + PartialCoverageClient(), + GetReportingStatusRequest.model_validate( + {"account": {"account_id": "account-1"}, "view": "periods"} + ), + ) + result = evaluate_reporting_ledger( + ledger, + expected_periods=[], + now=datetime.fromisoformat("2026-09-03T00:00:00+00:00"), + ) + + assert not result.definitive + assert "REPORTING_COVERAGE_INCOMPLETE" in result.obligations[0].reasons + + @pytest.mark.asyncio async def test_incomplete_associated_history_prevents_definitive_result() -> None: raw = _response() diff --git a/tests/test_schema_loader_per_version.py b/tests/test_schema_loader_per_version.py index 4fb9c55f1..aa9501d86 100644 --- a/tests/test_schema_loader_per_version.py +++ b/tests/test_schema_loader_per_version.py @@ -161,6 +161,22 @@ def test_root_relative_legacy_refs_resolve_from_offline_registry( assert not invalid.valid +def test_absolute_ref_mapper_accepts_versioned_and_source_style_paths( + synthetic_legacy_bundle: tuple[str, Path], +) -> None: + """Source `$id` refs retain their domain while released refs drop a version.""" + legacy_key, legacy_root = synthetic_legacy_bundle + state = _loader_mod._ensure_state(legacy_key) + + assert state is not None + assert _loader_mod._absolute_schema_reference_file( + state, "/schemas/core/result.json" + ) == (legacy_root / "core" / "result.json").resolve() + assert _loader_mod._absolute_schema_reference_file( + state, "/schemas/2.5.0/core/result.json" + ) == (legacy_root / "core" / "result.json").resolve() + + def test_get_validator_same_tool_different_versions_compiles_separately( synthetic_legacy_bundle: tuple[str, Path], ) -> None: From 2d1ed3db2143dafa170c3c6420d31a6c35ae6b1a Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 08:11:31 +0200 Subject: [PATCH 09/12] fix(packaging): support schema-complete VCS wheels --- setup.py | 45 +++++++++++++++++++++++++ src/adcp/types/__init__.py | 20 +++++++++++ src/adcp/types/_eager.py | 20 +++++++++++ src/adcp/types/protocol.py | 4 +++ tests/fixtures/public_api_snapshot.json | 30 +++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..4d98f6b06 --- /dev/null +++ b/setup.py @@ -0,0 +1,45 @@ +"""Setuptools hooks needed when the SDK is built directly from a VCS checkout.""" + +from __future__ import annotations + +import shutil +from pathlib import Path + +from setuptools import setup +from setuptools.command.build_py import build_py as _build_py + +_REPOSITORY_ROOT = Path(__file__).resolve().parent +_PINNED_ADCP_VERSION = (_REPOSITORY_ROOT / "src" / "adcp" / "ADCP_VERSION").read_text().strip() +_CURRENT_SCHEMA_BUNDLE = ( + _PINNED_ADCP_VERSION + if "-" in _PINNED_ADCP_VERSION + else ".".join(_PINNED_ADCP_VERSION.split(".")[:2]) +) +_BUNDLED_SCHEMA_VERSIONS = ("2.5", "3.0", "3.1", _CURRENT_SCHEMA_BUNDLE) + + +class BuildPy(_build_py): + """Copy supported schema bundles into the wheel build directory. + + Release jobs pre-populate ``src/adcp/_schemas``. PEP 517 VCS installs do + not run that release preparation step, so copying from the tracked cache + here keeps direct Git installs functionally equivalent to released wheels. + """ + + def run(self) -> None: + super().run() + source_root = _REPOSITORY_ROOT / "schemas" / "cache" + destination_root = Path(self.build_lib) / "adcp" / "_schemas" + for version in _BUNDLED_SCHEMA_VERSIONS: + source = source_root / version + if not source.is_dir(): + raise RuntimeError(f"required schema bundle is missing: {source}") + shutil.copytree( + source, + destination_root / version, + dirs_exist_ok=True, + ignore=shutil.ignore_patterns("*.md", ".hashes.json"), + ) + + +setup(cmdclass={"build_py": BuildPy}) diff --git a/src/adcp/types/__init__.py b/src/adcp/types/__init__.py index 6b05b3dd0..c3ac6c7b1 100644 --- a/src/adcp/types/__init__.py +++ b/src/adcp/types/__init__.py @@ -127,6 +127,14 @@ "AccountResponse", "AccountScope", "AccountWithAuthorization", + "AgentConfigurationState", + "AgentEncryptionKey", + "AgentNotificationConfig", + "AgentNotificationConfigState", + "AgentReportingDestination", + "AgentReportingDestinationState", + "AgentSigningKey", + "AgentWebhookChallenge", "CreditLimit", "GetAccountFinancialsRequest", "GetAccountFinancialsResponse", @@ -168,6 +176,8 @@ "Setup", "SyncAccountsRequest", "SyncAccountsResponse", + "SyncAgentConfigurationRequest", + "SyncAgentConfigurationResponse", "SyncReportingReceiptsRequest", "SyncReportingReceiptsResponse", # Request/Response types @@ -1193,9 +1203,17 @@ def __dir__() -> list[str]: AdcpProtocol, AdvertiserIndustry, AgentConfig, + AgentConfigurationState, AgentDeployment, AgentDestination, + AgentEncryptionKey, + AgentNotificationConfig, + AgentNotificationConfigState, AgentPermissionDeniedDetails, + AgentReportingDestination, + AgentReportingDestinationState, + AgentSigningKey, + AgentWebhookChallenge, AggregatedTotals, AiTool, Artifact, @@ -1867,6 +1885,8 @@ def __dir__() -> list[str]: SyncAccountsResponse1, SyncAccountsSetup, SyncAccountsSuccessResponse, + SyncAgentConfigurationRequest, + SyncAgentConfigurationResponse, SyncAgentNotificationConfigsRequest, SyncAgentNotificationConfigsResponse, SyncAudiencesAudience, diff --git a/src/adcp/types/_eager.py b/src/adcp/types/_eager.py index 647ea55fc..cf305e525 100644 --- a/src/adcp/types/_eager.py +++ b/src/adcp/types/_eager.py @@ -71,7 +71,15 @@ ActivateSignalResponse, AdcpProtocol, AdvertiserIndustry, + AgentConfigurationState, + AgentEncryptionKey, + AgentNotificationConfig, + AgentNotificationConfigState, AgentPermissionDeniedDetails, + AgentReportingDestination, + AgentReportingDestinationState, + AgentSigningKey, + AgentWebhookChallenge, AggregatedTotals, AiTool, Artifact, @@ -413,6 +421,8 @@ StatusSummary, SyncAccountsRequest, SyncAccountsResponse, + SyncAgentConfigurationRequest, + SyncAgentConfigurationResponse, SyncAgentNotificationConfigsRequest, SyncAgentNotificationConfigsResponse, SyncAudiencesRequest, @@ -1158,8 +1168,16 @@ def __init__(self, *args: object, **kwargs: object) -> None: "AdcpProtocol", "AdvertiserIndustry", "AgentConfig", + "AgentConfigurationState", "AgentDeployment", "AgentDestination", + "AgentEncryptionKey", + "AgentNotificationConfig", + "AgentNotificationConfigState", + "AgentReportingDestination", + "AgentReportingDestinationState", + "AgentSigningKey", + "AgentWebhookChallenge", "AggregatedTotals", "AiTool", "Artifact", @@ -1781,6 +1799,8 @@ def __init__(self, *args: object, **kwargs: object) -> None: "SyncAccountsResponse1", "SyncAccountsSetup", "SyncAccountsSuccessResponse", + "SyncAgentConfigurationRequest", + "SyncAgentConfigurationResponse", "SyncAudiencesAudience", "SyncAudiencesErrorResponse", "SyncAudiencesRequest", diff --git a/src/adcp/types/protocol.py b/src/adcp/types/protocol.py index 5ab51caf6..3e2afc130 100644 --- a/src/adcp/types/protocol.py +++ b/src/adcp/types/protocol.py @@ -51,6 +51,8 @@ "GeneratedTaskStatus", "GetAdcpCapabilitiesRequest", "GetAdcpCapabilitiesResponse", + "SyncAgentConfigurationRequest", + "SyncAgentConfigurationResponse", "WebhookChallenge", "WebhookChallengeResponse", "WebhookResponseType", @@ -115,6 +117,8 @@ SortApplied, SortDirection, StatusSummary, + SyncAgentConfigurationRequest, + SyncAgentConfigurationResponse, TaskResult, TaskType, WebhookChallenge, diff --git a/tests/fixtures/public_api_snapshot.json b/tests/fixtures/public_api_snapshot.json index b5a876956..3cbfd4a3d 100644 --- a/tests/fixtures/public_api_snapshot.json +++ b/tests/fixtures/public_api_snapshot.json @@ -720,9 +720,17 @@ "AdcpProtocol", "AdvertiserIndustry", "AgentConfig", + "AgentConfigurationState", "AgentDeployment", "AgentDestination", + "AgentEncryptionKey", + "AgentNotificationConfig", + "AgentNotificationConfigState", "AgentPermissionDeniedDetails", + "AgentReportingDestination", + "AgentReportingDestinationState", + "AgentSigningKey", + "AgentWebhookChallenge", "AggregatedTotals", "AiTool", "Artifact", @@ -1299,16 +1307,36 @@ "ReportUsageResponse", "ReportingBucket", "ReportingCanonicalContentDigest", + "ReportingCanonicalizationContract", "ReportingCapabilities", "ReportingControlTotal", + "ReportingDatasetShareDestination", + "ReportingDeliveryCapabilities", + "ReportingDeliveryConfiguration", + "ReportingDeliveryConfigurationState", + "ReportingDeliveryMethod", + "ReportingDeliveryOffering", + "ReportingDeliveryReadyWebhook", + "ReportingFileCompression", + "ReportingFileEntry", + "ReportingFileManifest", "ReportingFrequency", "ReportingMaterialization", "ReportingObligation", "ReportingPeriod", "ReportingReceipt", + "ReportingReconciliationMode", + "ReportingReportDefinition", + "ReportingResource", "ReportingRevision", + "ReportingSchedule", + "ReportingScheduleOffering", + "ReportingStatusIssue", + "ReportingVerification", + "ReportingVerificationProfile", "ReportingWebhook", "ReportingWebhookAuthentication", + "ReportingWriteDestination", "Request", "RequestProposalsProductId", "RequestProposalsRequest", @@ -1374,6 +1402,8 @@ "SyncAccountsResponse1", "SyncAccountsSetup", "SyncAccountsSuccessResponse", + "SyncAgentConfigurationRequest", + "SyncAgentConfigurationResponse", "SyncAgentNotificationConfigsRequest", "SyncAgentNotificationConfigsResponse", "SyncAudiencesAudience", From 0b1a61328a4133fcfc1fb301830f93b534503296 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 08:26:05 +0200 Subject: [PATCH 10/12] test(types): align reporting webhook adopter example --- tests/type_checks/versioned_types.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/type_checks/versioned_types.py b/tests/type_checks/versioned_types.py index 6eb29adc1..f1d377878 100644 --- a/tests/type_checks/versioned_types.py +++ b/tests/type_checks/versioned_types.py @@ -115,7 +115,6 @@ proposal_terms_digest="sha256:terms", reporting_webhook={ "url": "https://buyer.example/reporting", - "operation_id": "reporting.accept-1", "authentication": { "schemes": ["Bearer"], "credentials": "buyer-reporting-token-1234567890", From 03b40ca501d57b7f24ac203f4894b71d29d128a2 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 09:11:03 +0200 Subject: [PATCH 11/12] fix(runtime): expose agent configuration and reporting tools --- src/adcp/__main__.py | 9 +++++++++ src/adcp/client.py | 26 ++++++++++++++++++++++++++ src/adcp/decisioning/webhook_emit.py | 2 ++ src/adcp/protocols/a2a.py | 4 ++++ src/adcp/protocols/base.py | 6 ++++++ src/adcp/protocols/mcp.py | 4 ++++ src/adcp/server/base.py | 9 +++++++++ src/adcp/server/builder.py | 1 + src/adcp/server/mcp_tools.py | 19 +++++++++++++++++++ src/adcp/types/__init__.py | 8 ++++++++ src/adcp/types/capabilities.py | 7 ++++++- tests/test_decisioning_specialisms.py | 12 ++++++++++++ tests/test_serialize_as_any_default.py | 12 ++++++++++++ 13 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/adcp/__main__.py b/src/adcp/__main__.py index da18d160f..4187d384b 100644 --- a/src/adcp/__main__.py +++ b/src/adcp/__main__.py @@ -227,6 +227,11 @@ def _ta(tp: Any) -> TypeAdapter[Any]: "update_media_buy": ("update_media_buy", _ta(UpdateMediaBuyRequest)), "get_media_buy_delivery": ("get_media_buy_delivery", _ta(gen.GetMediaBuyDeliveryRequest)), "get_media_buys": ("get_media_buys", _ta(gen.GetMediaBuysRequest)), + "get_reporting_status": ("get_reporting_status", _ta(gen.GetReportingStatusRequest)), + "sync_reporting_receipts": ( + "sync_reporting_receipts", + _ta(gen.SyncReportingReceiptsRequest), + ), # Signals "get_signals": ("get_signals", _ta(gen.GetSignalsRequest)), "activate_signal": ("activate_signal", _ta(gen.ActivateSignalRequest)), @@ -263,6 +268,10 @@ def _ta(tp: Any) -> TypeAdapter[Any]: "sync_agent_notification_configs", _ta(gen.SyncAgentNotificationConfigsRequest), ), + "sync_agent_configuration": ( + "sync_agent_configuration", + _ta(gen.SyncAgentConfigurationRequest), + ), "get_task_status": ("get_task_status", _ta(gen.GetTaskStatusRequest)), "list_tasks": ("list_tasks", _ta(gen.ListTasksRequest)), # V3 Content Standards diff --git a/src/adcp/client.py b/src/adcp/client.py index 235288f32..bd2868b1c 100644 --- a/src/adcp/client.py +++ b/src/adcp/client.py @@ -350,6 +350,12 @@ from adcp.types.generated_poc.protocol.get_task_status_response import GetTaskStatusResponse from adcp.types.generated_poc.protocol.list_tasks_request import ListTasksRequest from adcp.types.generated_poc.protocol.list_tasks_response import ListTasksResponse +from adcp.types.generated_poc.protocol.sync_agent_configuration_request import ( + SyncAgentConfigurationRequest, +) +from adcp.types.generated_poc.protocol.sync_agent_configuration_response import ( + SyncAgentConfigurationResponse, +) from adcp.types.generated_poc.protocol.sync_agent_notification_configs_request import ( SyncAgentNotificationConfigsRequest, ) @@ -3735,6 +3741,23 @@ async def sync_agent_notification_configs( ), ) + @_task_options_method + async def sync_agent_configuration( + self, + request: SyncAgentConfigurationRequest, + *, + options: TaskOptions | None = None, + ) -> TaskResult[SyncAgentConfigurationResponse]: + """Synchronize caller-scoped webhooks and reusable reporting destinations.""" + return cast( + TaskResult[SyncAgentConfigurationResponse], + await self._execute_typed_task( + "sync_agent_configuration", + request, + SyncAgentConfigurationResponse, + ), + ) + @_task_options_method async def get_task_status( self, @@ -5700,6 +5723,9 @@ def _parse_webhook_result( # V3 Protocol Discovery "get_adcp_capabilities": GetAdcpCapabilitiesResponse, "sync_agent_notification_configs": SyncAgentNotificationConfigsResponse, + "sync_agent_configuration": SyncAgentConfigurationResponse, + "get_reporting_status": GetReportingStatusResponse, + "sync_reporting_receipts": SyncReportingReceiptsResponse, # V3 Content Standards "create_content_standards": CreateContentStandardsResponse, "get_content_standards": GetContentStandardsResponse, diff --git a/src/adcp/decisioning/webhook_emit.py b/src/adcp/decisioning/webhook_emit.py index 04b5c33bc..0d8fac7ec 100644 --- a/src/adcp/decisioning/webhook_emit.py +++ b/src/adcp/decisioning/webhook_emit.py @@ -100,6 +100,8 @@ def _sdk_task_outbox_pair_ready(registry: Any, task_outbox: Any) -> bool: "acquire_rights", "update_rights", "sync_agent_notification_configs", + "sync_agent_configuration", + "sync_reporting_receipts", } ) diff --git a/src/adcp/protocols/a2a.py b/src/adcp/protocols/a2a.py index 663819b90..3edcc06c9 100644 --- a/src/adcp/protocols/a2a.py +++ b/src/adcp/protocols/a2a.py @@ -991,6 +991,10 @@ async def sync_agent_notification_configs(self, params: dict[str, Any]) -> TaskR """Replace caller-scoped agent notification subscribers.""" return await self._call_a2a_tool("sync_agent_notification_configs", params) + async def sync_agent_configuration(self, params: dict[str, Any]) -> TaskResult[Any]: + """Synchronize caller-scoped webhooks and reusable reporting destinations.""" + return await self._call_a2a_tool("sync_agent_configuration", params) + async def get_task_status(self, params: dict[str, Any]) -> TaskResult[Any]: """Get task status from the agent.""" return await self._call_a2a_tool("get_task_status", params) diff --git a/src/adcp/protocols/base.py b/src/adcp/protocols/base.py index e90c38047..1a572f4fe 100644 --- a/src/adcp/protocols/base.py +++ b/src/adcp/protocols/base.py @@ -390,6 +390,12 @@ async def sync_agent_notification_configs(self, params: dict[str, Any]) -> TaskR "sync_agent_notification_configs is not implemented by this protocol adapter" ) + async def sync_agent_configuration(self, params: dict[str, Any]) -> TaskResult[Any]: + """Synchronize caller-scoped webhooks and reusable reporting destinations.""" + raise NotImplementedError( + "sync_agent_configuration is not implemented by this protocol adapter" + ) + @abstractmethod async def get_task_status(self, params: dict[str, Any]) -> TaskResult[Any]: """Get task status from the agent.""" diff --git a/src/adcp/protocols/mcp.py b/src/adcp/protocols/mcp.py index eef78ba2b..310218918 100644 --- a/src/adcp/protocols/mcp.py +++ b/src/adcp/protocols/mcp.py @@ -1227,6 +1227,10 @@ async def sync_agent_notification_configs(self, params: dict[str, Any]) -> TaskR """Replace caller-scoped agent notification subscribers.""" return await self._call_mcp_tool("sync_agent_notification_configs", params) + async def sync_agent_configuration(self, params: dict[str, Any]) -> TaskResult[Any]: + """Synchronize caller-scoped webhooks and reusable reporting destinations.""" + return await self._call_mcp_tool("sync_agent_configuration", params) + async def get_task_status(self, params: dict[str, Any]) -> TaskResult[Any]: """Get task status from the agent.""" return await self._call_mcp_tool("get_task_status", params) diff --git a/src/adcp/server/base.py b/src/adcp/server/base.py index a5fb8e4d9..0c3431af6 100644 --- a/src/adcp/server/base.py +++ b/src/adcp/server/base.py @@ -85,6 +85,7 @@ SiSendMessageRequest, SiTerminateSessionRequest, SyncAccountsRequest, + SyncAgentConfigurationRequest, SyncAgentNotificationConfigsRequest, SyncAudiencesRequest, SyncCatalogsRequest, @@ -673,6 +674,14 @@ async def sync_agent_notification_configs( """Replace caller-scoped agent notification subscribers.""" return self._not_supported("sync_agent_notification_configs") + async def sync_agent_configuration( + self, + params: SyncAgentConfigurationRequest | dict[str, Any], + context: TContext | None = None, + ) -> Any: + """Synchronize caller-scoped webhooks and reusable reporting destinations.""" + return self._not_supported("sync_agent_configuration") + async def get_task_status( self, params: GetTaskStatusRequest | dict[str, Any], diff --git a/src/adcp/server/builder.py b/src/adcp/server/builder.py index d08ca1fd7..a21f0037c 100644 --- a/src/adcp/server/builder.py +++ b/src/adcp/server/builder.py @@ -63,6 +63,7 @@ async def capabilities(params, context=None): "get_task_status": "protocol", "list_tasks": "protocol", "sync_agent_notification_configs": "protocol", + "sync_agent_configuration": "protocol", # Signals "get_signals": "signals", "activate_signal": "signals", diff --git a/src/adcp/server/mcp_tools.py b/src/adcp/server/mcp_tools.py index 57770ea4e..4fcb4126d 100644 --- a/src/adcp/server/mcp_tools.py +++ b/src/adcp/server/mcp_tools.py @@ -609,6 +609,21 @@ def _widen_media_buy_output_schema_for_legacy_statuses( "required": ["idempotency_key", "notification_configs"], }, }, + { + "name": "sync_agent_configuration", + "description": "Synchronize the authenticated caller's agent-level webhooks and reusable reporting destinations. Idempotent.", + "annotations": _IDEMP, + "inputSchema": { + "type": "object", + "properties": { + "idempotency_key": {"type": "string"}, + "expected_configuration_version": {"type": "string"}, + "configuration": {"type": "object"}, + "dry_run": {"type": "boolean"}, + }, + "required": ["idempotency_key", "configuration"], + }, + }, { "name": "get_task_status", "description": "Get status, progress, and optional result details for an async task.", @@ -1653,6 +1668,7 @@ def _generate_pydantic_schemas( SiSendMessageRequest, SiTerminateSessionRequest, SyncAccountsRequest, + SyncAgentConfigurationRequest, SyncAgentNotificationConfigsRequest, SyncAudiencesRequest, SyncCatalogsRequest, @@ -1728,6 +1744,7 @@ def _generate_pydantic_schemas( # Protocol Discovery "get_adcp_capabilities": GetAdcpCapabilitiesRequest, "sync_agent_notification_configs": SyncAgentNotificationConfigsRequest, + "sync_agent_configuration": SyncAgentConfigurationRequest, "get_task_status": GetTaskStatusRequest, "list_tasks": ListTasksRequest, # Compliance @@ -1873,6 +1890,7 @@ def _generate_pydantic_output_schemas( SiSendMessageResponse, SiTerminateSessionResponse, SyncAccountsResponse, + SyncAgentConfigurationResponse, SyncAgentNotificationConfigsResponse, SyncAudiencesResponse, SyncCatalogsResponse, @@ -1949,6 +1967,7 @@ def _generate_pydantic_output_schemas( # Protocol Discovery "get_adcp_capabilities": GetAdcpCapabilitiesResponse, "sync_agent_notification_configs": SyncAgentNotificationConfigsResponse, + "sync_agent_configuration": SyncAgentConfigurationResponse, "get_task_status": GetTaskStatusResponse, "list_tasks": ListTasksResponse, # Compliance diff --git a/src/adcp/types/__init__.py b/src/adcp/types/__init__.py index c3ac6c7b1..71cc28ef0 100644 --- a/src/adcp/types/__init__.py +++ b/src/adcp/types/__init__.py @@ -1138,6 +1138,14 @@ def __getattr__(name: str) -> object: raise AttributeError(f"module {__name__!r} has no attribute {name!r}") value = getattr(importlib.import_module("adcp.types._eager"), name) + if name == "McpWebhookPayload": + # This envelope owns the generated union of every async task result. + # Pydantic otherwise leaves serializers for nested result arms + # deferred until model_dump(), where patched clocks (notably + # freezegun's datetime.date subclass) can make a late forward-ref + # rebuild fail. Resolve the complete union while the public type is + # imported so construction and serialization have one stable schema. + value.model_rebuild(force=True) globals()[name] = value # cache: __getattr__ fires once per name return value diff --git a/src/adcp/types/capabilities.py b/src/adcp/types/capabilities.py index 0fd1f10ff..d1ff42837 100644 --- a/src/adcp/types/capabilities.py +++ b/src/adcp/types/capabilities.py @@ -148,7 +148,7 @@ ) -class CapabilitiesMediaBuy(_MediaBuy): +class MediaBuy(_MediaBuy): """Media-buy capabilities with the canonical reporting-delivery model. The bundled capability schema is generated independently from its canonical @@ -160,6 +160,11 @@ class CapabilitiesMediaBuy(_MediaBuy): reporting_delivery: ReportingDeliveryCapabilities | None = None +# Keep the collision-safe public export while preserving the wire-spec class +# name used by the adopter-facing decisioning capabilities namespace. +CapabilitiesMediaBuy = MediaBuy + + # ``Signals.features`` and the unsupported arm of the ``Adcp.idempotency`` # discriminated union are inline schemas the codegen materializes under # numbered class names (``Features`` / ``Idempotency``). Those diff --git a/tests/test_decisioning_specialisms.py b/tests/test_decisioning_specialisms.py index 50aef8b2b..ed1b05163 100644 --- a/tests/test_decisioning_specialisms.py +++ b/tests/test_decisioning_specialisms.py @@ -313,6 +313,12 @@ def sync_creatives(self, req, ctx): def get_media_buy_delivery(self, req, ctx): return {} + def get_reporting_status(self, req, ctx): + return {} + + def sync_reporting_receipts(self, req, ctx): + return {} + # Signals methods def get_signals(self, req, ctx): return {"signals": []} @@ -387,6 +393,12 @@ def sync_creatives(self, req, ctx): def get_media_buy_delivery(self, req, ctx): return {} + def get_reporting_status(self, req, ctx): + return {} + + def sync_reporting_receipts(self, req, ctx): + return {} + def get_media_buys(self, req, ctx): return {} diff --git a/tests/test_serialize_as_any_default.py b/tests/test_serialize_as_any_default.py index c5be23b37..19824fffc 100644 --- a/tests/test_serialize_as_any_default.py +++ b/tests/test_serialize_as_any_default.py @@ -153,6 +153,18 @@ def test_serialize_as_any_builds_deferred_nested_serializer() -> None: assert json.loads(parent.model_dump_json())["child"] == {"spec_field": "ok"} +def test_public_mcp_webhook_payload_resolves_complete_result_union() -> None: + """Webhook serialization must not defer the all-task result graph. + + Adopters commonly construct the payload under patched clocks. Resolving + date-bearing forward references only at ``model_dump`` time can then bind + the patching library's date subclass instead of the standard-library type. + """ + from adcp.types import McpWebhookPayload + + assert McpWebhookPayload.__pydantic_complete__ is True + + def test_caller_can_still_pass_exclude_none_false() -> None: """The two defaults are independent — overriding one doesn't disturb the other.""" From 98402079f4b995f9d8f4a0a6b698f870c93bfca4 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 29 Aug 2026 09:33:19 +0200 Subject: [PATCH 12/12] fix(types): serialize deferred models under patched clocks --- src/adcp/types/base.py | 27 ++++++++++++++---- tests/test_serialize_as_any_default.py | 39 +++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/adcp/types/base.py b/src/adcp/types/base.py index 0a7b09fea..d38b47dcd 100644 --- a/src/adcp/types/base.py +++ b/src/adcp/types/base.py @@ -6,7 +6,8 @@ from collections.abc import Callable from typing import Any, Literal -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, PydanticSchemaGenerationError +from pydantic_core import PydanticSerializationError # Type alias to shorten long type annotations MessageFormatter = Callable[[Any], str] @@ -280,10 +281,22 @@ def model_dump(self, **kwargs: Any) -> dict[str, Any]: kwargs["serialize_as_any"] = True try: return super().model_dump(**kwargs) - except TypeError as exc: + except (TypeError, PydanticSerializationError) as exc: if "MockValSer" not in str(exc): raise - _build_deferred_serializers(self, set()) + try: + _build_deferred_serializers(self, set()) + except PydanticSchemaGenerationError: + # Clock-freezing libraries temporarily replace Pydantic's + # recognized ``date``/``datetime`` classes. A nested model + # whose own serializer is still deferred cannot safely build + # during that patch. The already-built parent serializer has + # the complete declared schema, so use it for this dump rather + # than failing or accepting the patched class as an arbitrary + # type. Runtime-subclass serialization remains the default + # whenever the nested serializers can be built normally. + kwargs["serialize_as_any"] = False + return super().model_dump(**kwargs) return super().model_dump(**kwargs) def model_dump_json(self, **kwargs: Any) -> str: @@ -293,10 +306,14 @@ def model_dump_json(self, **kwargs: Any) -> str: kwargs["serialize_as_any"] = True try: return super().model_dump_json(**kwargs) - except TypeError as exc: + except (TypeError, PydanticSerializationError) as exc: if "MockValSer" not in str(exc): raise - _build_deferred_serializers(self, set()) + try: + _build_deferred_serializers(self, set()) + except PydanticSchemaGenerationError: + kwargs["serialize_as_any"] = False + return super().model_dump_json(**kwargs) return super().model_dump_json(**kwargs) def model_summary(self) -> str: diff --git a/tests/test_serialize_as_any_default.py b/tests/test_serialize_as_any_default.py index 19824fffc..8d9e5df27 100644 --- a/tests/test_serialize_as_any_default.py +++ b/tests/test_serialize_as_any_default.py @@ -17,7 +17,14 @@ import json from typing import Any -from pydantic import BaseModel, Field, SerializationInfo, model_serializer +from pydantic import ( + BaseModel, + Field, + PydanticSchemaGenerationError, + SerializationInfo, + model_serializer, +) +from pytest import MonkeyPatch from adcp.types.base import AdCPBaseModel @@ -165,6 +172,36 @@ def test_public_mcp_webhook_payload_resolves_complete_result_union() -> None: assert McpWebhookPayload.__pydantic_complete__ is True +def test_deferred_nested_serializer_falls_back_when_runtime_blocks_rebuild( + monkeypatch: MonkeyPatch, +) -> None: + """A patched runtime must not make an otherwise valid payload undumpable. + + Clock-freezing libraries temporarily replace Pydantic's recognized date + classes. If a nested serializer is still deferred, its late rebuild can + then raise ``PydanticSchemaGenerationError``. The already-built parent + schema remains authoritative and can serialize the declared wire shape. + """ + + class _ClockSensitiveChild(AdCPBaseModel): + value: str + + class _ClockSafeParent(AdCPBaseModel): + child: _ClockSensitiveChild + + parent = _ClockSafeParent.model_validate({"child": {"value": "ok"}}) + assert _ClockSafeParent.__pydantic_complete__ is True + assert _ClockSensitiveChild.__pydantic_complete__ is False + + def _blocked_rebuild(*args: Any, **kwargs: Any) -> None: + raise PydanticSchemaGenerationError("simulated patched date type") + + monkeypatch.setattr(_ClockSensitiveChild, "model_rebuild", _blocked_rebuild) + + assert parent.model_dump() == {"child": {"value": "ok"}} + assert json.loads(parent.model_dump_json()) == {"child": {"value": "ok"}} + + def test_caller_can_still_pass_exclude_none_false() -> None: """The two defaults are independent — overriding one doesn't disturb the other."""