diff --git a/.changeset/reporting-subscription-beta3.md b/.changeset/reporting-subscription-beta3.md new file mode 100644 index 000000000..be62bd9fd --- /dev/null +++ b/.changeset/reporting-subscription-beta3.md @@ -0,0 +1,18 @@ +--- +'@adcp/sdk': minor +--- + +**Beta-channel break:** this SDK advertises and negotiates only the AdCP `3.3-beta.3` preview and no longer packages or advertises `3.3-beta.2`. A buyer or seller still on beta.2 (SDK 17.0.0-beta.10) will not select the 3.3 preview with this release; the pair negotiates a shared stable release (3.2.7, 3.1.31 or 3.0.25) instead. Upgrade both sides together to keep exercising 3.3 preview features. An explicit `adcpVersion: '3.3.0-beta.2'` pin now fails with a configuration error. + +Adopt the signed AdCP 3.3.0-beta.3 bundle, replacing 3.3.0-beta.2. Public types, Zod schemas, tool metadata and the packaged compliance corpus are regenerated from the beta.3 release. + +- Every 3.3 task response composes the protocol envelope (adcp#8547): `status` is required on every response, and the generated response types no longer restate envelope fields. +- Account requests (adcp#8620): resolved `matched`/`created` records carry `account` with its money terms, an `updated` money change carries `effective_at`, and a change that `created` a separate account carries `not_carried_over`. +- Experimental live creative updates: `creative.live_updates` types, `CREATIVE_LIVE_UPDATE_UNSUPPORTED`, and the `creative.staged_update_changed` notification type, which joins `ACCOUNT_NOTIFICATION_TYPES`. +- Reporting subscriptions: `authorization.regranted_at` joins the account authorization fields (`toWireAccount` and `windDownGrant` keep it); media buys carry `cancellation_effective_at` and `flight_history`, packages `reporting_delivery_offering_ids`, offerings `available_from`/`withdrawn_at`, billing obligations `stub`, and `subscription_coverage[].status` is served as `inactive` with `deactivated_at`. Readbacks list at most 16 `prior_versions` and carry `prior_versions_count`, `accounts_with_exceptions_count` and `accounts_unauthorized_count`. A subscription response served without a negotiated release uses the pinned release, as in the Python SDK. + +**Removed from `@adcp/sdk/reporting/advanced`:** the hand-modelled wire types `ReportingDeliveryOfferingWithDimensionsV1`, `ReportingSubscriptionCoverageWithOfferingsV1`, `ReportingSubscriptionExclusionEntryV1`, `ReportingSubscriptionGapV1`, `ReportingSubscriptionInactiveIntervalV1`, `ReportingSubscriptionStateWithIntervalsV1` and `ReportingSubscriptionTimezoneCutoverV1`. The generated `ReportingDeliveryOffering`, `ReportingSubscriptionCoverage` and `ReportingSubscriptionState` carry every field; `ReportingSubscriptionOfferingV1` is now an alias of `ReportingDeliveryOffering`. + +Codegen follows the beta.3 envelope layout: the `request_proposals`, `refine_proposals` and `decline_proposals` submitted arms keep `status: 'submitted'` and the required `task_id` (folded from `core/task-submitted.json`), and generated Zod response schemas keep the `adcp_version`, `adcp_major_version`, `task_id` and `message` constraints they inherit through the composed envelopes. + +A terminal task webhook's `result` is the task's full response, so on 3.1+ it now carries the task `status` (`completed` or `rejected`) like a synchronous response, and a media-buy lifecycle value a platform returned in `status` moves to `media_buy_status`, as on the synchronous path. A 3.2 `list_products` / `decline_proposals` result and a 3.0 result are left as returned. diff --git a/ADCP_VERSION b/ADCP_VERSION index 1bf0a931f..0c9efdf90 100644 --- a/ADCP_VERSION +++ b/ADCP_VERSION @@ -1 +1 @@ -3.3.0-beta.2 +3.3.0-beta.3 diff --git a/AGENTS.md b/AGENTS.md index 2baae70b5..698c45c60 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -265,7 +265,7 @@ npm run generate-zod-schemas # Generate runtime validation ### Wire-version compat (v3 SDK ↔ legacy sellers) -The SDK speaks one AdCP major (`ADCP_VERSION` in `src/lib/version.ts`, currently `3.3.0-beta.2`) on its public surface and adapts to legacy sellers underneath. AdCP 2 support has been removed following its August 1, 2026 end of life. Maintained AdCP 3 compatibility and the policy for future major-version support are documented in [`docs/development/WIRE-VERSION-COMPAT.md`](https://github.com/adcontextprotocol/adcp-client/blob/main/docs/development/WIRE-VERSION-COMPAT.md). Touch that doc whenever you add to `src/lib/adapters/legacy/`, `src/lib/types/v*-*/`, or `schemas/cache//`. +The SDK speaks one AdCP major (`ADCP_VERSION` in `src/lib/version.ts`, currently `3.3.0-beta.3`) on its public surface and adapts to legacy sellers underneath. AdCP 2 support has been removed following its August 1, 2026 end of life. Maintained AdCP 3 compatibility and the policy for future major-version support are documented in [`docs/development/WIRE-VERSION-COMPAT.md`](https://github.com/adcontextprotocol/adcp-client/blob/main/docs/development/WIRE-VERSION-COMPAT.md). Touch that doc whenever you add to `src/lib/adapters/legacy/`, `src/lib/types/v*-*/`, or `schemas/cache//`. ## Testing Strategies diff --git a/README.md b/README.md index 3310862e1..18c366fb7 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,12 @@ AdCP operations are **distributed and asynchronous by default**. An agent might: ```bash npm install @adcp/sdk # 16.x, AdCP 3.2 -npm install @adcp/sdk@beta # 17.x beta, AdCP 3.3.0-beta.2 (development/staging) +npm install @adcp/sdk@beta # 17.x beta, AdCP 3.3.0-beta.3 (development/staging) npm install @adcp/sdk@adcp-3.1 # 13.x, maintained AdCP 3.1 line npm install @adcp/sdk@adcp-3.0 # 7.11.x, AdCP 3.0 ``` -SDK 17 beta adopts the signed AdCP `3.3.0-beta.2` bundle and includes the breaking +SDK 17 beta adopts the signed AdCP `3.3.0-beta.3` bundle and includes the breaking HTML-markup `display_tag` mapping. See the [beta release notes](./docs/releases/17.0.0-beta.0.md) and [16 → 17 migration guide](./docs/migration-16-to-17.md). Keep production on SDK 16. diff --git a/bin/adcp.js b/bin/adcp.js index 6e251c981..fb0ce6db2 100755 --- a/bin/adcp.js +++ b/bin/adcp.js @@ -2079,7 +2079,7 @@ RUN OPTIONS (full assessment): --storyboards IDS Comma-separated storyboard/bundle IDs to run --compliance-version VERSION Select a compliance cache version, e.g. 3.1.31 or - 3.3.0-beta.2. The runner uses this cache for + 3.3.0-beta.3. The runner uses this cache for storyboard resolution and wire-version defaults. When --test-kit points into a compliance cache, its version is selected automatically; an explicit mismatch is rejected. diff --git a/docs/TYPE-SUMMARY.md b/docs/TYPE-SUMMARY.md index 7ceed0d5f..a875e66a0 100644 --- a/docs/TYPE-SUMMARY.md +++ b/docs/TYPE-SUMMARY.md @@ -1,6 +1,6 @@ # AdCP Type Summary -> Generated at: 2026-10-30 +> Generated at: 2026-10-31 > @adcp/sdk v17.0.0-beta.10 Curated reference of the types that matter for using the AdCP client. For full generated types see `src/lib/types/tools.generated.ts` and `src/lib/types/core.generated.ts`. @@ -575,7 +575,7 @@ Request parameters for get_task_status, the 3. _Request:_ ``` { - task_id: string // required + task_id: Task Id // required account: Account Ref include_history: boolean include_result: boolean @@ -586,10 +586,8 @@ _Request:_ _Response (success branch):_ ``` { - task_id: string // required task_type: Task Type // required protocol: Adcp Protocol // required - status: Task Status // required created_at: string // required updated_at: string // required completed_at: string @@ -684,6 +682,7 @@ Read caller-scoped connection configuration, version, and destination setup stat _Request:_ ``` { + reporting_subscription_page: object context: Context } ``` @@ -998,12 +997,10 @@ _Response (success branch):_ products: Canonical Product[] // required feed_version: string // required cache_scope: 'public' | 'account' // required - adcp_version: string collections: Response Collection[] next_cursor: string pricing_version: string incomplete: object[] - replayed: 'true' context: Context } ``` @@ -1038,7 +1035,6 @@ _Response (success branch):_ proposals: object[] // required opportunities: object[] // required next_cursor: string - replayed: 'true' context: Context } ``` @@ -1069,7 +1065,6 @@ _Response (success branch):_ collections_version: string // required cache_scope: 'public' | 'account' // required pagination: Pagination Response - replayed: 'true' context: Context } ``` @@ -1102,16 +1097,13 @@ _Response (success branch):_ outcome: 'proposed' // required proposals: Canonical Proposal[] // required products: Canonical Product[] // required - adcp_version: string collections: Response Collection[] incomplete: object[] targeting_resolution: Get Products Targeting Resolution later_proposals: Later Proposals State - status: 'completed' - message: string errors: Error[] context: Context - replayed: 'true' + status: 'completed' } ``` @@ -1138,13 +1130,10 @@ _Response (success branch):_ { results: union[] // required products: Canonical Product[] // required - adcp_version: string collections: Response Collection[] - status: 'completed' - message: string errors: Error[] context: Context - replayed: 'true' + status: 'completed' } ``` @@ -1170,10 +1159,9 @@ _Response (success branch):_ ``` { results: object[] // required - message: string errors: Error[] context: Context - replayed: 'true' + status: 'completed' } ``` @@ -1289,7 +1277,6 @@ _Response (success branch):_ available_actions: Canonical Media Buy Action[] warnings: Warning[] context: Context - replayed: 'true' } ``` @@ -1688,7 +1675,6 @@ _Response (success branch):_ outcome: 'recorded' // required issue: Media Buy Issue // required context: Context - replayed: boolean } ``` @@ -1716,7 +1702,6 @@ _Response (success branch):_ outcome: 'found' // required issue: Media Buy Issue // required context: Context - replayed: boolean } ``` @@ -2100,7 +2085,7 @@ _Request:_ include_webhook_activity: boolean webhook_activity_limit: integer account: Account Ref - fields: ('creative_id' | 'name' | 'format_id' | 'format_kind' | 'format_option_ref' | 'assets' | 'status' | 'created_date' | 'updated_date' | 'tags' | 'provenance' | 'rights' | 'rights_attestation_evaluations' | 'localization' | 'localization_unavailable' | 'assignments' | 'snapshot' | 'items' | 'variables' | 'concept' | 'pricing_options')[] + fields: ('creative_id' | 'name' | 'format_id' | 'format_kind' | 'format_option_ref' | 'assets' | 'status' | 'created_date' | 'updated_date' | 'tags' | 'provenance' | 'rights' | 'rights_attestation_evaluations' | 'localization' | 'localization_unavailable' | 'assignments' | 'snapshot' | 'items' | 'variables' | 'concept' | 'pricing_options' | 'staged_update')[] context: Context } ``` @@ -2268,7 +2253,6 @@ _Response (success branch):_ { list: Property List // required auth_token: string // required - replayed: boolean context: Context } ``` @@ -2297,7 +2281,6 @@ _Response (success branch):_ ``` { list: Property List // required - replayed: boolean context: Context } ``` @@ -2372,7 +2355,6 @@ _Response (success branch):_ { deleted: boolean // required list_id: string // required - replayed: boolean context: Context } ``` @@ -2400,7 +2382,6 @@ _Response (success branch):_ { list: Collection List // required auth_token: string // required - replayed: boolean context: Context } ``` @@ -2429,7 +2410,6 @@ _Response (success branch):_ ``` { list: Collection List // required - replayed: boolean context: Context } ``` @@ -2504,7 +2484,6 @@ _Response (success branch):_ { deleted: boolean // required list_id: string // required - replayed: boolean context: Context } ``` @@ -2727,7 +2706,6 @@ _Response (success branch):_ ``` { plans: object[] // required - replayed: boolean context: Context } ``` @@ -2762,7 +2740,6 @@ _Response (success branch):_ delivery_period_state: 'open' | 'closed' findings: object[] plan_summary: object - replayed: boolean context: Context } ``` @@ -2800,7 +2777,6 @@ _Response (success branch):_ amount: object // required headroom_restored: number // required plan_summary: object // required - replayed: boolean context: Context } ``` @@ -2878,7 +2854,6 @@ _Response (success branch):_ mode: Governance Mode runtime_attestation_evaluations: Attestation Evaluation[] runtime_attestation_binding_digest: string - governance_context: string context: Context } ``` diff --git a/docs/development/WIRE-VERSION-COMPAT.md b/docs/development/WIRE-VERSION-COMPAT.md index 92177f457..b94e7524f 100644 --- a/docs/development/WIRE-VERSION-COMPAT.md +++ b/docs/development/WIRE-VERSION-COMPAT.md @@ -79,7 +79,7 @@ from `@adcp/sdk/v2/projection`. These advisories remain outside the wire JSON. ```text schemas/cache/ -├── 3.3.0-beta.2/ # primary SDK pin +├── 3.3.0-beta.3/ # primary SDK pin ├── 3.2.7/ # maintained stable release ├── 3.1.31/ # maintained stable release ├── 3.0.25/ # maintained stable release @@ -88,11 +88,11 @@ schemas/cache/ Run `npm run sync-schemas:all` to refresh the primary and maintained bundles. Run `npm run generate-types:all` to regenerate public types, then `npm run build:lib` to build and copy supported schemas into the package. `copy-schemas-to-dist.ts` excludes retired AdCP 2 caches even when present locally. `check-publish-protocol-artifacts.mjs` checks the published schema inventory and rejects retired type exports. -The v17 beta primary pin is the signed AdCP 3.3.0-beta.2 bundle; it replaces 3.3.0-beta.1, which is no longer packaged or advertised. Stable SDK 16 remains on AdCP 3.2.7. The beta retains stable AdCP 3.2.7, 3.1.31 and 3.0.25 bundles for negotiation, schema projection and compliance runs. +The v17 beta primary pin is the signed AdCP 3.3.0-beta.3 bundle; it replaces 3.3.0-beta.2, which is no longer packaged or advertised. Stable SDK 16 remains on AdCP 3.2.7. The beta retains stable AdCP 3.2.7, 3.1.31 and 3.0.25 bundles for negotiation, schema projection and compliance runs. Compliance pins select exact fixture bytes, unlike same-minor wire schema aliases. SDK 16.5.0 packages the 3.2.7 corpus; when upgrading from SDK 16.4.0, update explicit `--compliance-version 3.2.5` flags to `3.2.7`. A development pin of `3.2.6` must likewise advance. Retain the matching historical SDK if a run requires that older corpus. The maintained 3.1.31 and 3.0.25 corpora remain packaged. -Build tooling also understands exact AdCP 3.3.0 `beta.N` and `rc.N` pins. Such a build retains maintained AdCP 3.0, 3.1, and 3.2 GA aliases through 3.2.7 while advertising only the selected prerelease, without a moving beta/RC-family alias. SDK 17 selects the exact 3.3.0-beta.2 preview. The stable v16 compatibility list continues to advertise only AdCP 3.2 and earlier. +Build tooling also understands exact AdCP 3.3.0 `beta.N` and `rc.N` pins. Such a build retains maintained AdCP 3.0, 3.1, and 3.2 GA aliases through 3.2.7 while advertising only the selected prerelease, without a moving beta/RC-family alias. SDK 17 selects the exact 3.3.0-beta.3 preview. The stable v16 compatibility list continues to advertise only AdCP 3.2 and earlier. Conformance validates current and unversioned response payloads without synthesizing task status. The existing status-optional compatibility shim applies only to explicitly declared AdCP 3.0 payloads, and never to status-free compact tools. Closed response schemas admit only the canonical version-envelope fields alongside their declared task fields; other root restrictions and nested-body constraints remain enforced. diff --git a/docs/development/v17-beta-plan.md b/docs/development/v17-beta-plan.md index d2fa99673..3623a3613 100644 --- a/docs/development/v17-beta-plan.md +++ b/docs/development/v17-beta-plan.md @@ -1,17 +1,17 @@ # SDK 17 beta adoption -SDK 17 beta adopts the published AdCP `3.3.0-beta.2` protocol bundle and publishes under `beta`. SDK 16 remains the stable AdCP 3.2 line on npm `latest`. +SDK 17 beta adopts the published AdCP `3.3.0-beta.3` protocol bundle and publishes under `beta`. SDK 16 remains the stable AdCP 3.2 line on npm `latest`. ## Selected protocol bundle -- Release: [AdCP v3.3.0-beta.2](https://github.com/adcontextprotocol/adcp/releases/tag/v3.3.0-beta.2), published October 30, 2026. It replaces [v3.3.0-beta.1](https://github.com/adcontextprotocol/adcp/releases/tag/v3.3.0-beta.1) (commit `c0dfa90c28bcb768f70b4da1dfc3ca057050fa0a`), which SDK 17 no longer packages or advertises. -- Protocol commit: `fa39ca874b10ab7cf17d5cfa52abdce58b2dd274`. -- Bundle SHA-256: `d75dc90192a2d13ffae2103f30bd505040a7ff0a40f8a7946d82730428dd6e8a`. +- Release: [AdCP v3.3.0-beta.3](https://github.com/adcontextprotocol/adcp/releases/tag/v3.3.0-beta.3), published October 31, 2026. It replaces [v3.3.0-beta.2](https://github.com/adcontextprotocol/adcp/releases/tag/v3.3.0-beta.2) (commit `fa39ca874b10ab7cf17d5cfa52abdce58b2dd274`), which SDK 17 no longer packages or advertises. +- Protocol commit: `a6106149a2b5c929eec0caa0042adbae4ccf3a9c`. +- Bundle SHA-256: `ba61919ca0c9d67874604fbbca8945c133eaceed65da1ac962f78d94d7879f00`. - Source: the versioned protocol release tarball, verified by SHA-256 and the AdCP release workflow's cosign certificate. No moving branch or PR snapshot is used. ## SDK changes -The primary pin is `3.3.0-beta.2`, with generated public types, runtime validators, tool metadata and documentation from that bundle. The package retains stable 3.2.7, 3.1.31 and 3.0.25 schemas and compliance corpora. Preview compatibility is exact: `3.3.0-beta.2` and `3.3-beta.2`, without a moving family alias. Moving from beta.1 to beta.2 is a beta-channel break: a beta.1 peer no longer negotiates the preview with this SDK and falls back to a shared stable release. Buyer negotiation requires an exact advertised preview and otherwise uses an available stable release. +The primary pin is `3.3.0-beta.3`, with generated public types, runtime validators, tool metadata and documentation from that bundle. The package retains stable 3.2.7, 3.1.31 and 3.0.25 schemas and compliance corpora. Preview compatibility is exact: `3.3.0-beta.3` and `3.3-beta.3`, without a moving family alias. Moving from beta.2 to beta.3 is a beta-channel break: a beta.2 peer no longer negotiates the preview with this SDK and falls back to a shared stable release. Buyer negotiation requires an exact advertised preview and otherwise uses an available stable release. The HTML-markup `display_tag` mapping from [#3361](https://github.com/adcontextprotocol/adcp-client/pull/3361) is included as a major changeset. `display_html` and `display_WxH_html` project to inline-markup `display_tag`; actual `html5` zip creatives no longer match HTML-markup-only products. Delivery retains seller format identity, filters by delivery type and emits markup through the legacy HTML asset contract. SDK 16 keeps its previous mapping. See the [16 → 17 migration guide](../migration-16-to-17.md). diff --git a/docs/guides/DELIVERY-WEBHOOK-PARSING.md b/docs/guides/DELIVERY-WEBHOOK-PARSING.md index e4fc2a8a4..aad27e1af 100644 --- a/docs/guides/DELIVERY-WEBHOOK-PARSING.md +++ b/docs/guides/DELIVERY-WEBHOOK-PARSING.md @@ -120,7 +120,7 @@ is not a delivery-data webhook. `notification_type: 'final'` concerns report scheduling; envelope `completed` does not mean the media buy has finished. Per-buy state remains in `media_buy_deliveries[].status`. This follows the protocol's -[envelope/result distinction](https://github.com/adcontextprotocol/adcp/blob/v3.3.0-beta.2/docs/building/by-layer/L3/webhooks.mdx#payload-anatomy-envelope-vs-result). +[envelope/result distinction](https://github.com/adcontextprotocol/adcp/blob/v3.3.0-beta.3/docs/building/by-layer/L3/webhooks.mdx#payload-anatomy-envelope-vs-result). The protocol also requires receivers to ignore `aggregated_totals` in pushed reports as an authority source. The parser preserves that field for auditing diff --git a/docs/guides/PROPOSAL-TERMS-VERIFICATION.md b/docs/guides/PROPOSAL-TERMS-VERIFICATION.md index 26186a8d4..9e56695d5 100644 --- a/docs/guides/PROPOSAL-TERMS-VERIFICATION.md +++ b/docs/guides/PROPOSAL-TERMS-VERIFICATION.md @@ -193,7 +193,7 @@ keep its external root registered throughout client creation and the workflow: import { ADCPMultiAgentClient } from '@adcp/sdk'; import { withExternalSchemaRoot } from '@adcp/sdk/testing'; -const candidateVersion = '3.3.0-beta.2'; +const candidateVersion = '3.3.0-beta.3'; const candidateSchemaRoot = '/absolute/path/to/extracted/candidate/schemas'; await withExternalSchemaRoot(candidateVersion, candidateSchemaRoot, async () => { @@ -219,6 +219,6 @@ For shape-only verification, pass `{ adcpVersion: actualServedSchemaVersion }` to `validateRefineProposalsResponseShape()` to pin the already-selected served contract explicitly. -AdCP 3.3.0-beta.2 withdraws definition pins, purchase rights and installment selection from 3.3 (adcp#8537); they return through a `commercial_terms` extension point in 4.0. The verifier reads this from the selected schema: against beta.2, `definition_pins` and purchase `installments[]` / `rights[]` are unknown fields that the closed `commercial_terms` rejects, and publisher format references and placement, collection or signal targeting compare as ordinary snapshot terms. A snapshot verified against a retained beta.0 or beta.1 schema root still fails closed on definition pins and the references they covered, because that release required current-source pin verification. The verifier enforces collection-list uniqueness by reference identity. +AdCP 3.3.0-beta.2 withdraws definition pins, purchase rights and installment selection from 3.3 (adcp#8537); they return through a `commercial_terms` extension point in 4.0. The verifier reads this from the selected schema: against beta.2 and later, `definition_pins` and purchase `installments[]` / `rights[]` are unknown fields that the closed `commercial_terms` rejects, and publisher format references and placement, collection or signal targeting compare as ordinary snapshot terms. A snapshot verified against a retained beta.0 or beta.1 schema root still fails closed on definition pins and the references they covered, because that release required current-source pin verification. The verifier enforces collection-list uniqueness by reference identity. AdCP 3.3 snapshot rules that need data the snapshot does not carry: the verifier fails closed on SLA windows that name a `business_calendar_id` (business-clock SLAs resolve against capability calendars). Elapsed-clock SLA windows verify normally. Against a retained beta.1 schema root it also fails closed on purchase `installments[]`. For `price_adjustments`, the accepted snapshot deliberately omits the discovery-time table, so the verifier checks schema validity and `pricing_option_id` identity but does not re-resolve `pricing.fixed_price`; a buyer holding the table must resolve it before accepting. diff --git a/docs/llms.txt b/docs/llms.txt index e164c80c0..30a0a5701 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -1,6 +1,6 @@ # Ad Context Protocol (AdCP) -> Generated at: 2026-10-30 +> Generated at: 2026-10-31 > Library: @adcp/sdk v17.0.0-beta.10 > AdCP major version: 3 > Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt @@ -11,7 +11,7 @@ AdCP is an open protocol for AI agents to buy, manage, and optimize advertising programmatically. It defines MCP tools that agents call on publisher ad servers — discover inventory, create media buys, sync creatives, manage brand safety, and track delivery. Every tool follows request/response JSON schemas; the TypeScript client wraps them with async task handling, conversation context, and governance middleware. -## Start here: AdCP 3.3.0-beta.2 +## Start here: AdCP 3.3.0-beta.3 The SDK requires Node.js `^20.19.0 || >=22.12.0`. Install this reference's release train with `npm install @adcp/sdk@beta`; use the documentation from the exact published SDK version you install. For reproducible CLI runs, pin that exact SDK version. After installation, `node -p "require('@adcp/sdk').ADCP_VERSION"` reports its protocol pin; `ls node_modules/@adcp/sdk/compliance/cache` lists its packaged compliance versions. The `adcp-3.2` npm tag selects the maintained SDK 16 line. SDK 17 previews use `beta` and are intended for development and staging. @@ -310,11 +310,11 @@ Request parameters for cross-protocol capability discovery. Request parameters for get_task_status, the 3. **Request:** -- Required: `task_id: string` +- Required: `task_id: Task Id` - Optional: `account: Account Ref`, `include_history: boolean`, `include_result: boolean`, `context: Context` **Response (success branch):** -- Required: `task_id: string`, `task_type: Task Type`, `protocol: Adcp Protocol`, `status: Task Status`, `created_at: string`, `updated_at: string` +- Required: `task_type: Task Type`, `protocol: Adcp Protocol`, `created_at: string`, `updated_at: string` - Optional: `completed_at: string`, `has_webhook: boolean`, `progress: object`, `error: object`, `history: object[]`, `result: object`, `context: Context` #### `list_tasks` @@ -357,7 +357,7 @@ Declaratively synchronize caller-scoped webhooks and reusable reporting destinat Read caller-scoped connection configuration, version, and destination setup states without mutation. **Request:** -- Optional: `context: Context` +- Optional: `reporting_subscription_page: object`, `context: Context` **Response (success branch):** - Required: `result: union` @@ -477,7 +477,7 @@ Request parameters for synchronous product-offer reads. **Response (success branch):** - Required: `outcome: 'listed'`, `products: Canonical Product[]`, `feed_version: string`, `cache_scope: 'public' | 'account'` -- Optional: `adcp_version: string`, `collections: Response Collection[]`, `next_cursor: string`, `pricing_version: string`, `incomplete: object[]`, `replayed: 'true'`, `context: Context` +- Optional: `collections: Response Collection[]`, `next_cursor: string`, `pricing_version: string`, `incomplete: object[]`, `context: Context` #### `list_proposals` @@ -489,7 +489,7 @@ Request parameters for reading proposals and their dispositions (experimental). **Response (success branch):** - Required: `outcome: 'listed'`, `proposals: object[]`, `opportunities: object[]` -- Optional: `next_cursor: string`, `replayed: 'true'`, `context: Context` +- Optional: `next_cursor: string`, `context: Context` #### `list_collections` @@ -500,7 +500,7 @@ Experimental: request parameters for reading a seller's collection card catalog **Response (success branch):** - Required: `outcome: 'listed'`, `collections: Response Collection[]`, `collections_version: string`, `cache_scope: 'public' | 'account'` -- Optional: `pagination: Pagination Response`, `replayed: 'true'`, `context: Context` +- Optional: `pagination: Pagination Response`, `context: Context` #### `request_proposals` @@ -512,7 +512,7 @@ Request parameters for creating actionable seller proposals. **Response (success branch):** - Required: `outcome: 'proposed'`, `proposals: Canonical Proposal[]`, `products: Canonical Product[]` -- Optional: `adcp_version: string`, `collections: Response Collection[]`, `incomplete: object[]`, `targeting_resolution: Get Products Targeting Resolution`, `later_proposals: Later Proposals State`, `status: 'completed'`, `message: string`, `errors: Error[]`, +2 more +- Optional: `collections: Response Collection[]`, `incomplete: object[]`, `targeting_resolution: Get Products Targeting Resolution`, `later_proposals: Later Proposals State`, `errors: Error[]`, `context: Context`, `status: 'completed'` #### `refine_proposals` @@ -524,7 +524,7 @@ Request parameters for creating one or more proposal revisions. **Response (success branch):** - Required: `results: union[]`, `products: Canonical Product[]` -- Optional: `adcp_version: string`, `collections: Response Collection[]`, `status: 'completed'`, `message: string`, `errors: Error[]`, `context: Context`, `replayed: 'true'` +- Optional: `collections: Response Collection[]`, `errors: Error[]`, `context: Context`, `status: 'completed'` #### `decline_proposals` @@ -536,7 +536,7 @@ Request parameters for terminally declining one or more proposals. **Response (success branch):** - Required: `results: object[]` -- Optional: `message: string`, `errors: Error[]`, `context: Context`, `replayed: 'true'` +- Optional: `errors: Error[]`, `context: Context`, `status: 'completed'` #### `buy_products` @@ -564,7 +564,7 @@ Apply operational controls inside accepted commercial terms. **Response (success branch):** - Required: `status: 'completed'`, `media_buy_id: string`, `revision: integer` -- Optional: `media_buy_status: Media Buy Status`, `implementation_date: string,null`, `affected_package_ids: string[]`, `available_actions: Canonical Media Buy Action[]`, `warnings: Warning[]`, `context: Context`, `replayed: 'true'` +- Optional: `media_buy_status: Media Buy Status`, `implementation_date: string,null`, `affected_package_ids: string[]`, `available_actions: Canonical Media Buy Action[]`, `warnings: Warning[]`, `context: Context` #### `list_creative_formats` @@ -684,7 +684,7 @@ Raise a seller-action report against an authorized media buy, optionally scoped **Response (success branch):** - Required: `outcome: 'recorded'`, `issue: Media Buy Issue` -- Optional: `context: Context`, `replayed: boolean` +- Optional: `context: Context` #### `get_media_buy_issue` @@ -696,7 +696,7 @@ Read the latest seller-owned state of one issue within an authorized account and **Response (success branch):** - Required: `outcome: 'found'`, `issue: Media Buy Issue` -- Optional: `context: Context`, `replayed: boolean` +- Optional: `context: Context` #### `provide_performance_feedback` @@ -913,7 +913,7 @@ Request parameters for creating a new property list. **Response (success branch):** - Required: `list: Property List`, `auth_token: string` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `update_property_list` @@ -925,7 +925,7 @@ Request parameters for updating an existing property list. **Response (success branch):** - Required: `list: Property List` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `get_property_list` @@ -960,7 +960,7 @@ Request parameters for deleting a property list. **Response (success branch):** - Required: `deleted: boolean`, `list_id: string` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `create_collection_list` @@ -972,7 +972,7 @@ Request parameters for creating a new collection list. **Response (success branch):** - Required: `list: Collection List`, `auth_token: string` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `update_collection_list` @@ -984,7 +984,7 @@ Request parameters for updating an existing collection list. **Response (success branch):** - Required: `list: Collection List` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `get_collection_list` @@ -1019,7 +1019,7 @@ Request parameters for deleting a collection list. **Response (success branch):** - Required: `deleted: boolean`, `list_id: string` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `list_content_standards` @@ -1125,7 +1125,7 @@ Push campaign plans to the governance agent. **Response (success branch):** - Required: `plans: object[]` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `report_plan_outcome` @@ -1137,7 +1137,7 @@ Report the outcome of an action to the governance agent. **Response (success branch):** - Required: `outcome_id: string`, `outcome_state: 'accepted' | 'findings'` -- Optional: `committed_budget: number`, `delivery_reconciliation_status: 'consistent' | 'measurement_variance' | 'disputed' | 'unmatched' | 'closed_unresolved'`, `delivery_period_state: 'open' | 'closed'`, `findings: object[]`, `plan_summary: object`, `replayed: boolean`, `context: Context` +- Optional: `committed_budget: number`, `delivery_reconciliation_status: 'consistent' | 'measurement_variance' | 'disputed' | 'unmatched' | 'closed_unresolved'`, `delivery_period_state: 'open' | 'closed'`, `findings: object[]`, `plan_summary: object`, `context: Context` #### `report_plan_adjustment` @@ -1149,7 +1149,7 @@ Seller-authenticated append-only commitment adjustment report. **Response (success branch):** - Required: `adjustment_id: string`, `adjustment_state: 'reported' | 'verified' | 'disputed'`, `adjustment_type: 'decommitment' | 'refund' | 'credit' | 'makegood'`, `amount: object`, `headroom_restored: number`, `plan_summary: object` -- Optional: `replayed: boolean`, `context: Context` +- Optional: `context: Context` #### `get_plan_audit_logs` @@ -1172,7 +1172,7 @@ Orchestrator or seller calls the governance agent to validate an action against **Response (success branch):** - Required: `check_id: string`, `verdict: Governance Decision`, `explanation: string` -- Optional: `check_type: 'intent' | 'execution'`, `plan_id: string`, `budget_period_id: string`, `findings: object[]`, `conditions: object[]`, `consultation_context: string`, `expires_at: string`, `next_check: string`, +8 more +- Optional: `check_type: 'intent' | 'execution'`, `plan_id: string`, `budget_period_id: string`, `findings: object[]`, `conditions: object[]`, `consultation_context: string`, `expires_at: string`, `next_check: string`, +7 more **Deep dive:** - docs/guides/HANDLER-PATTERNS-GUIDE.md — input handler patterns for governance flows @@ -1313,6 +1313,12 @@ Flow: `get_adcp_capabilities → sync_creatives → list_creatives` **Policy-backed creative rejections** — Reports each violated registry policy as its own CREATIVE_REJECTED error entry. Flow: `get_products → sync_creatives` +**Seller refuses an undeclared change to a live creative and leaves it unchanged** — Verifies that a seller declaring creative.live_updates without format refuses a format change to a live creative with CREATIVE_LIVE_UPDATE_UNSUPPORTED, names the refused kind and the live package, returns the same refusal on dry_run, and leaves the creative unchanged. +Flow: `sync_creatives → comply_test_controller → sync_creatives → list_creatives` + +**Seller applies declared changes to a live creative under the same creative_id** — Verifies that a seller declaring creative.live_updates always accepts name changes, applies uninterrupted changes immediately, and keeps the approved prior version serving while a staged update is reviewed, promoting it on approval and keeping the prior version on rejection. +Flow: `get_adcp_capabilities → sync_creatives → comply_test_controller → sync_creatives → list_creatives → sync_creatives → list_creatives → comply_test_controller → list_creatives → sync_creatives → comply_test_controller → list_creatives → sync_creatives` + **Sales agent with creative capabilities** — Stateful sales agent that accepts pushed creative assets and renders them in its environment. Flow: `get_adcp_capabilities → sync_creatives → preview_creative` @@ -1550,7 +1556,7 @@ Flow: `create_media_buy → sync_plans → sync_accounts → sync_governance → Flow: `create_media_buy → sync_plans → sync_accounts → sync_governance → get_products → check_governance → sync_plans → create_media_buy` **Seller accepts corrected buy after governance denial** — Verifies that a buyer can recover from GOVERNANCE_DENIED by shrinking the buy to fit the amended plan, obtaining a fresh intent approval, and retrying. -Flow: `create_media_buy → sync_plans → sync_accounts → sync_governance → get_products → check_governance → sync_plans → create_media_buy → check_governance → create_media_buy` +Flow: `create_media_buy → sync_accounts → get_products → sync_plans → sync_governance → get_products → check_governance → sync_plans → create_media_buy → check_governance → create_media_buy` **Inline media-buy creatives without sync_creatives** — Verifies that a seller advertising inline_creative_management accepts package creatives on create_media_buy and update_media_buy without requiring the Creative Protocol or sync_creatives. Flow: `get_adcp_capabilities → get_products → create_media_buy → update_media_buy → get_media_buys → create_media_buy → update_media_buy → get_media_buys → create_media_buy → update_media_buy → get_media_buys → get_products → create_media_buy → update_media_buy → get_media_buys` @@ -1753,7 +1759,7 @@ Flow: `sync_accounts → get_products → create_media_buy → comply_test_contr Flow: `sync_accounts → create_media_buy → comply_test_controller → get_media_buy_delivery` **End-to-end metric accountability through the media buy lifecycle** — Buyer requires specific reporting metrics at discovery; seller filters products to those that can deliver; delivery report exposes any gaps via missing_metrics. -Flow: `sync_accounts → get_products → create_media_buy → comply_test_controller → get_media_buy_delivery` +Flow: `comply_test_controller → sync_accounts → get_products → create_media_buy → comply_test_controller → get_media_buy_delivery` **Container-subsumption evaluation for metric set operations** — Verifies a container token (e.g. viewability) subsumes its leaf identities (e.g. viewable_rate) for required_metrics filtering and requested_metrics carrier selection, and that a leaf never subsumes a sibling leaf. Flow: `sync_accounts → get_products → create_media_buy → comply_test_controller → get_media_buy_delivery → get_products` @@ -1768,7 +1774,7 @@ Flow: `get_media_buys → comply_test_controller → get_media_buy_delivery` Flow: `create_media_buy → comply_test_controller → get_media_buy_delivery` **End-to-end vendor-metric accountability: declaration → commitment → delivery audit** — Buyer commits vendor metrics on two packages, then verifies one clean package, one overdue gap, and one not-yet-measurable omission. -Flow: `sync_accounts → get_products → create_media_buy → get_media_buys → comply_test_controller → get_media_buy_delivery` +Flow: `comply_test_controller → sync_accounts → get_products → create_media_buy → get_media_buys → comply_test_controller → get_media_buy_delivery` **Reliable Reporting: Managed Delivery** — Validates the Managed Delivery tier's explicit capability, atomic managed offering, resource retention, and authorization-revocation contract. Flow: `get_adcp_capabilities → comply_test_controller → get_reporting_status → comply_test_controller` @@ -1778,8 +1784,14 @@ Flow: `get_adcp_capabilities → comply_test_controller → get_reporting_status ### Products +**Seller preserves custom canonical formats** — Verifies a seeded custom canonical formats declaration only after native catalog discovery establishes that optional format family. +Flow: `comply_test_controller → get_products` + +**Seller preserves experimental canonical image formats** — Verifies a seeded experimental canonical image formats declaration only after native catalog discovery establishes that optional format family. +Flow: `comply_test_controller → get_products` + **Canonical formats and deprecated named-format compatibility** — Validates canonical product formats and the optional, explicitly deprecated named-format compatibility projection. -Flow: `get_products → sync_accounts → get_products → create_media_buy` +Flow: `comply_test_controller → get_products → sync_accounts → get_products → create_media_buy` ### Signals @@ -2033,6 +2045,7 @@ Agents use the `recovery` classification to decide what to do: `transient` → r | `CONFLICTING_SELECTORS` | correctable | A 3.x package request carries multiple resolvable format selector routes that select different canonical product format declaration sets. Sellers MUST first resolve every present route independently (`format_option_refs`, direct `format_kind` plus `params`, and deprecated `format_ids`) without applying precedence. An unresolved option reference or an unprojectable legacy ID is rejected with `UNSUPPORTED_FEATURE`, not this code. Once all routes resolve, sellers derive the product `format_options[]` entries selected by each route using directional product satisfaction and require those sets to match. Legacy parameter compatibility uses the asymmetric v2-narrows-v1 relation defined by canonical formats, not raw object equality. For fixed-size image selectors, both width and height participate in compatibility. Sellers MUST reject different format shapes, selected option sets, or incompatible dimensions rather than silently choosing the canonical route. `error.field` SHOULD point at the conflicting package, and `error.details` SHOULD identify the supplied selector routes and their normalized canonical summaries. | | `CREATIVE_DEADLINE_EXCEEDED` | correctable | Creative change submitted after the package's creative_deadline. Distinct from CREATIVE_REJECTED (content-policy, brand-safety, or accessibility-review failure). | | `CREATIVE_INACCESSIBLE` | correctable | A creative governance agent (get_creative_features) could not retrieve the submitted creative_manifest assets for evaluation — an asset URL was unreachable, returned an error, or required credentials the agent does not hold. Distinct from CREATIVE_NOT_FOUND (a creative_id absent from the agent's library, not an asset-fetch failure) and CREATIVE_REJECTED (assets retrieved but failed creative review). | +| `CREATIVE_LIVE_UPDATE_UNSUPPORTED` | correctable | A sync_creatives item changed a live creative in a way the seller does not apply in place under the same creative_id. A creative is live when its status is approved and it has at least one assignment on a package that is not canceled, whose flight has not ended, and whose media buy is not in a terminal state; a paused package still counts. Returned only by sellers that declare creative.live_updates (others keep returning INVALID_STATE). The seller MUST fail only that item, MUST leave the creative, its review state, and its serving unchanged, SHOULD set error.field to the item, and SHOULD return details conforming to error-details/creative-live-update-unsupported.json naming the refused change kinds and the live packages. A dry_run returns the same refusal. | | `CREATIVE_LOCALE_NOT_ACCEPTED` | correctable | A creative bound to a locale-constrained product format has no materialized variant matching locale_policy.accepted_language_ranges, lacks protocol-declared locale topology, or uses serve_default with a seller-ineligible default variant. Seller ranges use RFC 4647 Basic Filtering and are applied independently for every placement where the assignment may serve, before buyer Lookup, locale_fallbacks, or default selection. Distinct from CREATIVE_REJECTED because this is a mechanically discoverable assignment-eligibility mismatch, not subjective content review. error.field SHOULD point to the offending creative or assignment; error.details SHOULD include format_option_id when present, accepted_language_ranges, available_variant_locales, and placement identity when applicable. | | `CREATIVE_MERGE_REJECTED` | correctable | One or more sync_creatives merge assignment operations failed seller verification. The seller evaluates every merge in the request, MUST leave every assignment unchanged (assignment operations are atomic), SHOULD set error.field to the first rejected assignment_operations entry, and SHOULD return details conforming to error-details/creative-merge-rejected.json listing each rejected merge with a reason: content_mismatch (the seller judges the copy is a different creative), format_mismatch (the buyer's creative cannot take over the copy's serving object), not_on_package (merged_creative_id is not a seller-assigned creative assigned to the package in this account, reported uniformly for unknown IDs), or not_supported (the seller cannot merge this pairing on this package). A seller that does not declare creative.supports_assignment_merge returns UNSUPPORTED_FEATURE instead. | | `CREATIVE_MISSING_CLICK_URL` | correctable | A submitted creative that requires a destination URL does not provide one. Sellers SHOULD identify the missing buyer-visible field in error.field and MUST NOT expose downstream ad-server names or internal object identifiers in the buyer-facing message. | diff --git a/docs/migration-14.x-rc-worksheet.md b/docs/migration-14.x-rc-worksheet.md index e02b8546a..f189c0326 100644 --- a/docs/migration-14.x-rc-worksheet.md +++ b/docs/migration-14.x-rc-worksheet.md @@ -19,8 +19,8 @@ pin using `ADCP_VERSION` inside that tarball. | Checkout `package.json` version | `@adcp/sdk@17.0.0-beta.10` | | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@17.0.0-beta.10 dist.integrity` | | Node.js runtime | `^20.19.0 || >=22.12.0` | -| Default AdCP wire release | `3.3.0-beta.2` | -| Maintained wire releases | `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.1.25`, `3.1.26`, `3.1.27`, `3.1.28`, `3.1.29`, `3.1.30`, `3.1.31`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4`, `3.2.5`, `3.2.6`, `3.2.7`, `3.3.0-beta.2`, `3.3-beta.2` | +| Default AdCP wire release | `3.3.0-beta.3` | +| Maintained wire releases | `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.1.25`, `3.1.26`, `3.1.27`, `3.1.28`, `3.1.29`, `3.1.30`, `3.1.31`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4`, `3.2.5`, `3.2.6`, `3.2.7`, `3.3.0-beta.3`, `3.3-beta.3` | | Canonical migration notes | [SDK 15 OAuth](./migration-oauth-issuer-bindings.md), [issuer-binding and storage](./guides/OAUTH-ISSUER-BINDING.md); historical [13.x → 14](./migration-13-to-14.md) | For a checkout at the published release commit, install the exact package version: diff --git a/docs/migration-16-to-17.md b/docs/migration-16-to-17.md index b36e8877c..41cd654c4 100644 --- a/docs/migration-16-to-17.md +++ b/docs/migration-16-to-17.md @@ -1,6 +1,6 @@ # Migrating from SDK 16 to 17 -SDK 17 beta pins the signed AdCP `3.3.0-beta.2` release. Use the beta in +SDK 17 beta pins the signed AdCP `3.3.0-beta.3` release. Use the beta in development and staging; production remains on SDK 16 and AdCP 3.2. ## Companion packages @@ -106,7 +106,7 @@ request release. Existing cursor, account identity, and acknowledgement checks still apply. A `3.3.0` or `3.3` configuration pin does not select a beta. Use the exact -`3.3.0-beta.2` bundle (wire alias `3.3-beta.2`); unavailable pins now produce a +`3.3.0-beta.3` bundle (wire alias `3.3-beta.3`); unavailable pins now produce a short list of bundled release lines instead of every compatible patch. ## pnpm peer resolution @@ -140,7 +140,7 @@ and [peer-dependency settings](https://pnpm.io/settings#dedupepeerdependents). The SDK packages the exact 3.3 beta schema and compliance bundle alongside maintained AdCP 3.2.7, 3.1.29 and 3.0.25 bundles. A seller must advertise -`3.3-beta.2` (or its full bundle version, `3.3.0-beta.2`) before the buyer +`3.3-beta.3` (or its full bundle version, `3.3.0-beta.3`) before the buyer selects that preview. A different beta, a moving `3.3-beta` alias, or a served-version echo alone does not establish support. The buyer can negotiate an older stable release the seller advertises. Missing or synthetic capability @@ -152,9 +152,56 @@ server handlers are `mediaBuy.listCollections` and `mediaBuy.listProposals`, or optional methods on `MediaBuyLifecyclePlatform`. Their synchronous results use `outcome` and do not acquire a synthetic task `status` field. +## AdCP 3.3.0-beta.3 + +SDK 17 now pins AdCP `3.3.0-beta.3` and no longer packages or advertises +`3.3.0-beta.2`. Preview negotiation is exact, so a beta.2 seller and a beta.3 +buyer settle on a stable release they share, and an explicit +`adcpVersion: '3.3.0-beta.2'` pin fails with a configuration error. Upgrade +both sides together when you test preview-only features. + +- **Protocol envelope on every response (adcp#8547).** Every 3.3 task response + composes `core/protocol-envelope.json`, so `status` is required on every + response and the generated response types no longer restate envelope fields + (`task_id`, `message`, `replayed`, `adcp_version`). `createAdcpServer` stamps + the envelope; a hand-built 3.3 response must carry `status`. +- **Account requests (adcp#8620).** A request that resolves as `matched` or + `created` must carry `account` with its money terms; one that resolves as + `updated` and changed `billing`, `billing_entity` or `payment_terms` carries + `effective_at`; a change request that resolves as `created` carries + `not_carried_over`. A `requestAccount` handler that returns a resolved + record without them now fails response validation. +- **Live creative updates (experimental `creative.live_updates`).** The types, + the `CREATIVE_LIVE_UPDATE_UNSUPPORTED` error code and the + `creative.staged_update_changed` notification type are generated; + `ACCOUNT_NOTIFICATION_TYPES` includes the notification type. +- **Reporting subscriptions (experimental).** `authorization.regranted_at` is + an account authorization field; `toWireAccount` and `windDownGrant` keep it. Media buys carry + `cancellation_effective_at` and `flight_history`, packages carry + `reporting_delivery_offering_ids`, offerings carry `available_from` and + `withdrawn_at`, billing obligations may carry `stub: true`, and + `subscription_coverage[].status` may be `inactive` with `deactivated_at`. + Readbacks list at most 16 `prior_versions` and carry + `prior_versions_count`, `accounts_with_exceptions_count` and + `accounts_unauthorized_count`. A subscription response served without a + negotiated release now uses the pinned release, as the Python SDK does. +- **Hand-modelled wire types removed from `@adcp/sdk/reporting/advanced`.** + The generated types now carry every field, so + `ReportingDeliveryOfferingWithDimensionsV1`, + `ReportingSubscriptionCoverageWithOfferingsV1`, + `ReportingSubscriptionExclusionEntryV1`, `ReportingSubscriptionGapV1`, + `ReportingSubscriptionInactiveIntervalV1`, + `ReportingSubscriptionStateWithIntervalsV1` and + `ReportingSubscriptionTimezoneCutoverV1` are gone. Use + `ReportingDeliveryOffering`, `ReportingSubscriptionCoverage` and + `ReportingSubscriptionState` (and their indexed members, such as + `NonNullable[number]`) from + `@adcp/sdk`. `ReportingSubscriptionOfferingV1` is now an alias of + `ReportingDeliveryOffering`. + ## AdCP 3.3.0-beta.2 -SDK 17 now pins AdCP `3.3.0-beta.2` and no longer packages or advertises +SDK 17 beta.10 pinned AdCP `3.3.0-beta.2` and no longer packaged or advertised `3.3.0-beta.1`. Preview negotiation is exact, so a beta.1 seller and a beta.2 buyer settle on a stable release they share, and an explicit `adcpVersion: '3.3.0-beta.1'` pin fails with a configuration error. Upgrade diff --git a/docs/migration-agent-identity-3.3.md b/docs/migration-agent-identity-3.3.md index 44793c8d1..d4539e794 100644 --- a/docs/migration-agent-identity-3.3.md +++ b/docs/migration-agent-identity-3.3.md @@ -3,7 +3,7 @@ The experimental identity rollout is tracked in [adcp-client#3233](https://github.com/adcontextprotocol/adcp-client/issues/3233). This release implements the rollout behind explicit experimental configuration. -SDK 17 beta pins `ADCP_VERSION` to **3.3.0-beta.2**; SDK 16 remains on 3.2. +SDK 17 beta pins `ADCP_VERSION` to **3.3.0-beta.3**; SDK 16 remains on 3.2. The identity experiment can change before graduation. Setting `identity33` selects the 3.3 schema scope for the entire server instance, including its non-identity tools. To keep an existing 3.2 endpoint while evaluating identity, diff --git a/examples/hello_seller_adapter_multi_tenant.ts b/examples/hello_seller_adapter_multi_tenant.ts index 30ca26a86..5ccfae765 100644 --- a/examples/hello_seller_adapter_multi_tenant.ts +++ b/examples/hello_seller_adapter_multi_tenant.ts @@ -635,6 +635,7 @@ class MultiTenantAdapter implements DecisioningPlatform, T const verdict = overBudget ? 'denied' : plan.custom_policies.length > 0 ? 'conditions' : 'approved'; const response: CheckGovernanceResponse = { + status: 'completed', check_id: checkId, verdict, plan_id: plan.plan_id, @@ -690,6 +691,7 @@ class MultiTenantAdapter implements DecisioningPlatform, T detail: { outcome: req.outcome, purchase_type: req.purchase_type, committed_budget: committed }, }); return { + status: 'completed', outcome_id: randomUUID(), outcome_state: 'accepted', committed_budget: committed, diff --git a/package.json b/package.json index f34ffa3e7..7d7f2d91e 100644 --- a/package.json +++ b/package.json @@ -598,7 +598,7 @@ "compliance/cache/3.0.25/**/*", "compliance/cache/3.1.31/**/*", "compliance/cache/3.2.7/**/*", - "compliance/cache/3.3.0-beta.2/**/*", + "compliance/cache/3.3.0-beta.3/**/*", "ADCP_VERSION", "docs/README.md", "docs/TYPE-SUMMARY.md", @@ -863,7 +863,7 @@ "launch-editor": "^2.14.2", "markdown-it": "^14.3.3" }, - "adcp_version": "3.3.0-beta.2", + "adcp_version": "3.3.0-beta.3", "sideEffects": [ "**/default-invariants.*" ] diff --git a/scripts/check-package-size.mjs b/scripts/check-package-size.mjs index c04aa6617..6e54bcbc9 100644 --- a/scripts/check-package-size.mjs +++ b/scripts/check-package-size.mjs @@ -162,7 +162,11 @@ import { assertPublishProtocolArtifacts } from './check-publish-protocol-artifac // packed bytes; allow about 44 KB above that for compressor variance. Other budgets stay fixed. // The storage facade, the accounts.ensure outcome and the reporting-subscription guides, README section and // skill (#3504, T8-T10) measured 26,613,272 packed bytes; allow about 27 KB above that. Other budgets stay fixed. -const MAX_PACKED_TARBALL_BYTES = 26_640_000; +// AdCP 3.3.0-beta.3 (#3504, T1) replaces the beta.2 schemas and compliance corpus with larger +// ones (the composed protocol envelope on every response, live creative updates, the +// reporting_subscription_probe controller scenario) and regenerates the types. Measured +// 26,825,751 packed bytes; allow about 44 KB above that. Other budgets stay fixed. +const MAX_PACKED_TARBALL_BYTES = 26_870_000; const MAX_UNPACKED_PACKAGE_BYTES = 144 * 1024 * 1024; // AdCP 3.2.0-beta.10 adds the account-change schema family. The seller reporting // ledger adds ten public module artifacts. AdCP 3.2.0-rc.2 replaced the preview @@ -329,7 +333,6 @@ const MAX_PACKED_FILE_COUNT = 8 + // Discovery currency and required-metric invariants (two dual-format runtime/declaration sets). 1840 + // SDK 17: 3.3 schemas/compliance, per-tool type entrypoints and migration/release notes. 20 + // Reporting subscription calendar, selection, coverage, capabilities and index (five dual-format sets). - 4 + // Reporting subscription hand-modeled wire types until 3.3.0-beta.2 (one dual-format set). 8 + // Reporting subscription engine and principal subscription runtime (two dual-format sets). 4 + // Reporting subscription release gate (one dual-format set). 12 + // Reporting subscription engine store, buyer expectations and client helper (three dual-format sets). @@ -339,7 +342,10 @@ const MAX_PACKED_FILE_COUNT = 4 + // Buyer reporting-subscription write facade, client.reporting (one dual-format set). 8 + // `storage` subpath: memoryStorage() and its in-memory ledger (two dual-format sets). 4 + // Account outcomes for client.accounts.ensure: AccountOutcome, nextStep, formatPendingAction (one dual-format set). - 3; // Reporting-subscription seller and buyer guides, and the reporting-subscriptions skill. + 3 + // Reporting-subscription seller and buyer guides, and the reporting-subscriptions skill. + // AdCP 3.3.0-beta.3: eleven new source schemas (task-id, task-message and the task-status envelopes; live + // creative updates) and the new compliance storyboards and controller-scenario files that ship with them. + 21; const MAX_BUNDLED_SCHEMA_BYTES = 2000 * 1024; const MAX_CJS_SCHEMA_DECLARATION_BYTES = 45 * 1024 * 1024; const MAX_ESM_SCHEMA_FACADE_BYTES = 1024; diff --git a/scripts/generate-types.ts b/scripts/generate-types.ts index 1018b2856..18234b4a8 100644 --- a/scripts/generate-types.ts +++ b/scripts/generate-types.ts @@ -2416,6 +2416,34 @@ export function applyCodegenSchemaWorkarounds(schema: any, schemaName: string): return schema; } +/** + * A referenced arm can compose its own contract: AdCP 3.3.0-beta.3's + * core/compact-task-submitted.json is `allOf: [protocol-envelope, task-submitted]` + * plus its body fields, and core/task-submitted.json carries `status: submitted` + * and the required `task_id` (adcp#8547). Fold those members into the arm so the + * discriminator and the task handle survive. Members the root already composes + * (the protocol envelope) stay with the root. + */ +function foldComposedOverlay(overlay: any, rootAllOf: unknown): any { + if (!overlay || !Array.isArray(overlay.allOf)) return overlay; + const rootRefs = new Set( + (Array.isArray(rootAllOf) ? rootAllOf : []) + .map((member: any) => (typeof member?.$ref === 'string' ? member.$ref : undefined)) + .filter(Boolean) + ); + let properties = { ...(overlay.properties ?? {}) }; + let required = [...(overlay.required ?? [])]; + for (const member of overlay.allOf) { + if (typeof member?.$ref === 'string' && rootRefs.has(member.$ref)) continue; + const part = + typeof member?.$ref === 'string' ? foldComposedOverlay(loadCachedSchema(member.$ref), rootAllOf) : member; + if (!part || typeof part !== 'object') continue; + properties = { ...(part.properties ?? {}), ...properties }; + required = [...required, ...(part.required ?? [])]; + } + return { ...overlay, properties, required: [...new Set(required)] }; +} + function materializeProposalResponseBranches(schema: any, schemaName: string): any { if (!schema?.properties || !Array.isArray(schema.anyOf) || schema.anyOf.length < 2) return schema; @@ -2437,7 +2465,7 @@ function materializeProposalResponseBranches(schema: any, schemaName: string): a for (const member of schema.anyOf) { let overlay = member; if (typeof member?.$ref === 'string') { - overlay = loadCachedSchema(member.$ref); + overlay = foldComposedOverlay(loadCachedSchema(member.$ref), schema.allOf); if (!overlay?.properties) return schema; } const branch: any = { diff --git a/scripts/generate-zod-from-ts.ts b/scripts/generate-zod-from-ts.ts index 02a3e537f..2ed99e7f5 100644 --- a/scripts/generate-zod-from-ts.ts +++ b/scripts/generate-zod-from-ts.ts @@ -3541,6 +3541,36 @@ export function postProcessCanonicalPrimitiveConstraints(content: string): strin }; const versionEnvelopeProperties = envelopeProperties('version-envelope.json'); const protocolEnvelopeProperties = envelopeProperties('protocol-envelope.json'); + // AdCP 3.3.0-beta.3 (adcp#8547) names shared primitives in their own core files + // (`task_id` is core/task-id.json) and composes envelopes inside envelopes (the + // protocol envelope composes the version envelope; task-submitted carries + // `task_id`). Follow a `$ref` to a core document so its constraints still apply. + const coreDocuments = new Map | null>(); + const coreDocument = (ref: unknown): Record | null => { + if (typeof ref !== 'string') return null; + const match = /\/core\/([a-z0-9-]+\.json)$/.exec(ref); + if (!match) return null; + const file = match[1]!; + if (!coreDocuments.has(file)) { + const absolute = path.join(cacheRoot, 'core', file); + coreDocuments.set( + file, + existsSync(absolute) ? (JSON.parse(readFileSync(absolute, 'utf8')) as Record) : null + ); + } + return coreDocuments.get(file) ?? null; + }; + const primitive = (schema: Record | undefined): Record | undefined => { + if (!schema || typeof schema.$ref !== 'string') return schema; + const target = coreDocument(schema.$ref); + return target && (target.type === 'string' || target.type === 'number' || target.type === 'integer') + ? target + : schema; + }; + const taskSubmittedProperties = (() => { + const target = coreDocument('/core/task-submitted.json'); + return (target?.properties ?? {}) as Record>; + })(); const constrainExpression = (expression: string, constraints: CanonicalPrimitiveConstraints): string => { let result = expression; @@ -3656,7 +3686,7 @@ export function postProcessCanonicalPrimitiveConstraints(content: string): strin if (node.properties && typeof node.properties === 'object' && !Array.isArray(node.properties)) { for (const [propertyName, propertySchema] of Object.entries(node.properties)) { if (!propertySchema || typeof propertySchema !== 'object' || Array.isArray(propertySchema)) continue; - const constraints = constraintsFor(propertySchema as Record); + const constraints = constraintsFor(primitive(propertySchema as Record)!); const signature = JSON.stringify(constraints); const bySignature = occurrences.get(propertyName) ?? new Map(); bySignature.set(signature, constraints); @@ -3670,10 +3700,17 @@ export function postProcessCanonicalPrimitiveConstraints(content: string): strin }; visitSchema(schema); - const constrainProperty = (propertyName: string, constraints: CanonicalPrimitiveConstraints): void => { + const constrainProperty = ( + propertyName: string, + constraints: CanonicalPrimitiveConstraints, + options: { topLevel?: boolean } = {} + ): void => { if (Object.keys(constraints).length === 0) return; const escapedName = escapeRegExp(propertyName); - const propertyLine = new RegExp(`^(\\s*)(?:${escapedName}|${JSON.stringify(propertyName)}): ([^\\n]+)$`, 'gm'); + // topLevel: only the block's own root properties (four-space indent), never a nested + // field that reuses the name with its own contract. + const indent = options.topLevel ? '( {4})' : '(\\s*)'; + const propertyLine = new RegExp(`^${indent}(?:${escapedName}|${JSON.stringify(propertyName)}): ([^\\n]+)$`, 'gm'); block = block.replace(propertyLine, (line, indent: string, expression: string) => { return `${indent}${line.slice(indent.length, line.length - expression.length)}${constrainExpression(expression, constraints)}`; }); @@ -3687,6 +3724,18 @@ export function postProcessCanonicalPrimitiveConstraints(content: string): strin // intermediary. Restore only the fields from the exact canonical envelope // a titled schema references; this avoids globally constraining unrelated // properties that happen to reuse names such as `adcp_version`. + // Envelopes compose envelopes, so follow each referenced core document's own + // allOf references (protocol envelope -> version envelope). + const pending = [...references]; + while (pending.length > 0) { + const target = coreDocument(pending.pop()); + for (const member of Array.isArray(target?.allOf) ? (target!.allOf as Array>) : []) { + if (typeof member?.$ref === 'string' && !references.has(member.$ref)) { + references.add(member.$ref); + pending.push(member.$ref); + } + } + } const inherits = (file: string): boolean => [...references].some(ref => ref.endsWith(`/core/${file}`)); if (inherits('version-envelope.json')) { for (const propertyName of ['adcp_version', 'adcp_major_version']) { @@ -3697,6 +3746,14 @@ export function postProcessCanonicalPrimitiveConstraints(content: string): strin for (const propertyName of ['timestamp', 'governance_context']) { constrainProperty(propertyName, constraintsFor(protocolEnvelopeProperties[propertyName]!)); } + for (const propertyName of ['task_id', 'message']) { + const property = primitive(protocolEnvelopeProperties[propertyName]); + if (property) constrainProperty(propertyName, constraintsFor(property), { topLevel: true }); + } + } + if (inherits('task-submitted.json')) { + const property = primitive(taskSubmittedProperties.task_id); + if (property) constrainProperty('task_id', constraintsFor(property), { topLevel: true }); } content = content.slice(0, exportStart) + block + content.slice(exportEnd); diff --git a/src/lib/compliance-fixtures/canonical-storyboards-provenance.json b/src/lib/compliance-fixtures/canonical-storyboards-provenance.json index 5aa586419..751445562 100644 --- a/src/lib/compliance-fixtures/canonical-storyboards-provenance.json +++ b/src/lib/compliance-fixtures/canonical-storyboards-provenance.json @@ -1,10 +1,10 @@ { "schema_version": 1, - "protocol_version": "3.3.0-beta.2", + "protocol_version": "3.3.0-beta.3", "source_repository": "adcontextprotocol/adcp", - "source_tag": "v3.3.0-beta.2", - "source_commit": "fa39ca874b10ab7cf17d5cfa52abdce58b2dd274", - "bundle_sha256": "d75dc90192a2d13ffae2103f30bd505040a7ff0a40f8a7946d82730428dd6e8a", + "source_tag": "v3.3.0-beta.3", + "source_commit": "a6106149a2b5c929eec0caa0042adbae4ccf3a9c", + "bundle_sha256": "ba61919ca0c9d67874604fbbca8945c133eaceed65da1ac962f78d94d7879f00", "files": { "principal": { "source_path": "static/compliance/source/universal/principal.yaml", diff --git a/src/lib/negotiation/commercial-terms-semantics.ts b/src/lib/negotiation/commercial-terms-semantics.ts index 45ce66b73..f680ec047 100644 --- a/src/lib/negotiation/commercial-terms-semantics.ts +++ b/src/lib/negotiation/commercial-terms-semantics.ts @@ -1,11 +1,49 @@ /** * Reviewed non-JSON-Schema semantics from the 3.2 beta.8 / rc.2 / rc.3 / rc.4 / rc.6 / rc.7 / 3.2.1 / 3.2.3 / - * 3.2.4 / 3.2.5 / 3.2.6 / 3.2.7 / 3.3.0-beta.0 / 3.3.0-beta.1 / 3.3.0-beta.2 bundles. + * 3.2.4 / 3.2.5 / 3.2.6 / 3.2.7 / 3.3.0-beta.0 / 3.3.0-beta.1 / 3.3.0-beta.2 / 3.3.0-beta.3 bundles. * These are semantic contracts, NOT a binding-field allowlist: properties and * comparison always come from the selected runtime schema. Additions to these * annotations require a deliberate implementation/review instead of AJV silently * ignoring a new contract. See docs/guides/PROPOSAL-TERMS-VERIFICATION.md. */ +// adcp#8537 withdrew definition pins, purchase rights and installment selection +// from 3.3 after beta.1, so beta.2 carries none of their verifier contracts. +// The pin and installment fail-closed checks therefore never fire for it. +// beta.3 carries the same commercial-term contracts as beta.2 (checked against the bundle). +const SEMANTICS_3_3_BETA_2: Readonly> = { + 'core/sla-window.json': { + verifier_constraints: { + calendar_reference: + 'A business_calendar_id resolves to exactly one immutable get_adcp_capabilities.business_calendars declaration whose coverage includes receipt and the computed deadline. Invalid or unresolved calendars never fall back to elapsed time.', + request_snapshot: + 'Pending requests retain the SLA and calendar resolved at receipt. Maxima are independent upper bounds; a completion maximum shorter than the response maximum does not invalidate either commitment.', + }, + }, + 'core/targeting.json/properties/collection_lists': { + unique_by: ['agent_url', 'list_id'], + spec: 'docs/governance/collection/index.mdx#combining-several-collection-lists-experimental', + }, + 'core/targeting.json/properties/collection_lists_exclude': { + unique_by: ['agent_url', 'list_id'], + spec: 'docs/governance/collection/index.mdx#combining-several-collection-lists-experimental', + }, + 'media-buy/product-purchase.json': { + verifier_constraints: { + accepted_snapshot_terms: + 'Inside canonical-proposal.commercial_terms, each purchase MUST carry resolved start_time and end_time and MUST preserve every applicable measurement term and performance standard. Omission of measurement_terms or performance_standards means the accepted offer declared none.', + // Requires the discovery-time price_adjustments table, which the accepted + // snapshot deliberately does not embed. The snapshot verifier checks + // schema validity and pricing identity; callers holding the table resolve it. + price_adjustments_resolution: + "When the option identified by pricing_option_id declares price_adjustments, pricing.fixed_price MUST equal the resolution of that option's table over this purchase's format_option_refs, placement selection and flight, and pricing.price_breakdown MUST record the declared adjustments followed by each fired row in declared order (a rate row as its rate when below 1, otherwise and for an amount row as its currency amount). The table itself is not embedded in the snapshot: pricing_option_id, covered by terms_digest, identifies exactly one immutable table.", + pricing_identity: { + pricing_option_id: 'equals_pricing.pricing_option_id_when_pricing_present', + on_violation: 'reject_before_commitment', + }, + }, + }, +}; + export const REVIEWED_COMMERCIAL_TERMS_SEMANTICS: Readonly> = { 'media-buy/commercial-terms.json': { verifier_constraints: { @@ -317,42 +355,8 @@ export const COMMERCIAL_SEMANTIC_OVERRIDES_BY_RELEASE: Readonly; + coverage?: Pick; /** The seller's `subscriptions.backfill_on_regrant`. Defaults to false. */ backfill_on_regrant?: boolean; /** The seller's `status_retention_days`. Required when a grant was revoked and re-granted. */ @@ -539,7 +538,7 @@ function normalizeVersions( } /** The readback's `inactive_intervals` as half-open windows. */ -function inactiveWindows(intervals: readonly ReportingSubscriptionInactiveIntervalV1[] | undefined): Window[] { +function inactiveWindows(intervals: ReportingSubscriptionState['inactive_intervals']): Window[] { if (intervals !== undefined && !Array.isArray(intervals)) throw new CoverageInputError('COVERAGE_INPUT_INVALID', 'inactive_intervals must be an array', 'invalid_input'); return (intervals ?? []).map(interval => { @@ -645,7 +644,7 @@ interface TimezoneTimeline { function timezoneTimeline( current: string | undefined, - entries: readonly ReportingSubscriptionTimezoneCutoverV1[] | undefined + entries: ReportingSubscriptionCoverage['timezone_cutovers'] ): TimezoneTimeline { if (current !== undefined) assertReportingIanaTimezoneV1(current, 'account.timezone'); const cutovers = [...(entries ?? [])] diff --git a/src/lib/reporting/subscriptions/engine.ts b/src/lib/reporting/subscriptions/engine.ts index 03ea8437c..7bb4912d2 100644 --- a/src/lib/reporting/subscriptions/engine.ts +++ b/src/lib/reporting/subscriptions/engine.ts @@ -33,7 +33,11 @@ import { canonicalize } from '../../utils/jcs'; import { ReportingSubscriptionEngineError } from '../../errors'; import { PlatformConfigError } from '../../server/decisioning/runtime/validate-platform'; -import type { PendingAction } from '../../types/core.generated'; +import type { + PendingAction, + ReportingSubscriptionCoverage, + ReportingSubscriptionState, +} from '../../types/core.generated'; import type { PrincipalLifecycleRuntimeSubscriptions, PrincipalReportingSubscriptionState, @@ -44,11 +48,6 @@ import type { StoredReportingSubscriptionVersion, } from '../../server/principal/reporting-subscriptions'; import { createReportingPeriodCalendarV1, type ReportingPeriodCalendarV1 } from './calendar'; -import type { - ReportingSubscriptionGapV1, - ReportingSubscriptionInactiveIntervalV1, - ReportingSubscriptionTimezoneCutoverV1, -} from './wire'; import { owedSubscriptionPeriodsV1, groupOwedSubscriptionPeriodsV1, @@ -65,6 +64,10 @@ import { type ReportingSubscriptionOfferingV1, } from './selection'; +type ReportingSubscriptionGapV1 = NonNullable[number]; +type ReportingSubscriptionTimezoneCutoverV1 = NonNullable[number]; +type ReportingSubscriptionInactiveIntervalV1 = NonNullable[number]; + type MaybePromise = T | Promise; const DAY_MS = 86_400_000; const MAX_AUTHORIZED_ACCOUNT_PAGES = 10_000; diff --git a/src/lib/reporting/subscriptions/expectations.ts b/src/lib/reporting/subscriptions/expectations.ts index 777d6e3e7..5aaad514e 100644 --- a/src/lib/reporting/subscriptions/expectations.ts +++ b/src/lib/reporting/subscriptions/expectations.ts @@ -25,10 +25,7 @@ export function reportingSubscriptionVersionRecordsV1(input: { destinationMethods?: Readonly>; }): ReportingSubscriptionVersionRecordV1[] { const { state } = input; - // TODO(3.3.0-beta.2): read prior_versions[].configuration from the generated type. - const priors = (state.prior_versions ?? []) as ReadonlyArray< - NonNullable[number] & { configuration?: ReportingSubscription } - >; + const priors = state.prior_versions ?? []; const entries = [ ...[...priors].reverse().map(prior => ({ version: prior.subscription_version, diff --git a/src/lib/reporting/subscriptions/index.ts b/src/lib/reporting/subscriptions/index.ts index 8f3282acd..482042d80 100644 --- a/src/lib/reporting/subscriptions/index.ts +++ b/src/lib/reporting/subscriptions/index.ts @@ -52,12 +52,3 @@ export type { } from './coverage'; export { reportingConfigurationCapabilitiesV1 } from './capabilities'; export type { ReportingConfigurationCapabilitiesInputV1, ReportingConfigurationCapabilitiesV1 } from './capabilities'; -export type { - ReportingDeliveryOfferingWithDimensionsV1, - ReportingSubscriptionCoverageWithOfferingsV1, - ReportingSubscriptionExclusionEntryV1, - ReportingSubscriptionGapV1, - ReportingSubscriptionInactiveIntervalV1, - ReportingSubscriptionStateWithIntervalsV1, - ReportingSubscriptionTimezoneCutoverV1, -} from './wire'; diff --git a/src/lib/reporting/subscriptions/selection.ts b/src/lib/reporting/subscriptions/selection.ts index 66d4563df..448c0f43c 100644 --- a/src/lib/reporting/subscriptions/selection.ts +++ b/src/lib/reporting/subscriptions/selection.ts @@ -7,7 +7,6 @@ */ import { CoverageInputError } from '../../errors'; import type { ReportingDeliveryOffering, ReportingSubscription } from '../../types/core.generated'; -import type { ReportingDeliveryOfferingWithDimensionsV1 } from './wire'; /** * A seller delivery offering as published in `media_buy.reporting_delivery.offerings`. @@ -19,17 +18,7 @@ import type { ReportingDeliveryOfferingWithDimensionsV1 } from './wire'; * * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md */ -export type ReportingSubscriptionOfferingV1 = ReportingDeliveryOfferingWithDimensionsV1 & { - /** - * When the seller began offering it. A resolution that changes because an offering - * appears or is withdrawn is a cutover at that instant. Absent: always available. Not on - * the wire (a withdrawn offering simply disappears from `reporting_delivery.offerings`), so a - * buyer MUST retain offering history to agree with the seller across a resolution change. - */ - available_from?: string; - /** When the seller withdrew it. Absent: still available. */ - withdrawn_at?: string; -}; +export type ReportingSubscriptionOfferingV1 = ReportingDeliveryOffering; /** @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md */ export type ReportingSubscriptionSelectorV1 = ReportingSubscription['selector']; diff --git a/src/lib/reporting/subscriptions/wire.ts b/src/lib/reporting/subscriptions/wire.ts deleted file mode 100644 index e22365e27..000000000 --- a/src/lib/reporting/subscriptions/wire.ts +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Reporting-subscription wire fields settled after AdCP 3.3.0-beta.1 (adcontextprotocol/adcp#8585), - * hand-modeled until the next published bundle. - * - * TODO(3.3.0-beta.2): regenerate types from the published bundle and replace these with the - * generated `ReportingDeliveryOffering`, `ReportingSubscriptionState` and - * `ReportingSubscriptionCoverage` shapes. - */ -import type { - ReportingDeliveryOffering, - ReportingDimension, - ReportingSubscriptionCoverage, - ReportingSubscriptionState, -} from '../../types/core.generated'; - -/** - * `core/reporting-delivery-offering.json` with the 3.3 subscription matching fields. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export type ReportingDeliveryOfferingWithDimensionsV1 = ReportingDeliveryOffering & { - /** - * The offering's breakdown in the standard vocabulary. Empty for totals only. Sellers - * advertising `media_buy.reporting_subscriptions` MUST include it on every offering. - */ - standard_dimensions?: ReportingDimension[] | string[]; - /** Native report-definition dimensions with no standard mapping. Present when any exist. */ - unmapped_dimensions?: string[]; -}; - -/** - * One `inactive_intervals[]` readback entry. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export interface ReportingSubscriptionInactiveIntervalV1 { - deactivated_at: string; - /** Absent for the current interval while the subscription is inactive. */ - reactivated_at?: string; -} - -/** - * `core/reporting-subscription-state.json` with `inactive_intervals`. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export type ReportingSubscriptionStateWithIntervalsV1 = ReportingSubscriptionState & { - inactive_intervals?: ReportingSubscriptionInactiveIntervalV1[]; -}; - -/** - * One `timezone_cutovers[]` entry with `previous_timezone` and an optional `offering_id`. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export interface ReportingSubscriptionTimezoneCutoverV1 { - /** Sellers MUST include it. */ - previous_timezone?: string; - /** Absent: every account_timezone offering on the account. */ - offering_id?: string; - effective_at: string; - timezone: string; -} - -/** - * One `gaps[]` entry with an optional `offering_id`. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export interface ReportingSubscriptionGapV1 { - /** Absent: every offering on the account. */ - offering_id?: string; - from: string; - until: string; - reason: 'unauthorized'; -} - -/** - * One `excluded[]` entry with an optional `offering_id`: the offering whose periods it removes, when the - * account's covered offerings have different period boundaries. Absent: every offering on the account - * (or the buy, with `media_buy_id`). - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export type ReportingSubscriptionExclusionEntryV1 = ReportingSubscriptionCoverage['excluded'][number] & { - offering_id?: string; -}; - -/** - * `core/reporting-subscription-coverage.json` with per-offering exclusions, cutovers and gaps. - * - * @experimental Low-level reporting-subscription building block, published from `@adcp/sdk/reporting/advanced`: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md - */ -export type ReportingSubscriptionCoverageWithOfferingsV1 = Omit< - ReportingSubscriptionCoverage, - 'timezone_cutovers' | 'gaps' | 'excluded' -> & { - excluded: ReportingSubscriptionExclusionEntryV1[]; - timezone_cutovers?: ReportingSubscriptionTimezoneCutoverV1[]; - gaps?: ReportingSubscriptionGapV1[]; -}; diff --git a/src/lib/server/decisioning/account.ts b/src/lib/server/decisioning/account.ts index a843c208e..54d021b06 100644 --- a/src/lib/server/decisioning/account.ts +++ b/src/lib/server/decisioning/account.ts @@ -63,6 +63,7 @@ export const ACCOUNT_AUTHORIZATION_WIRE_KEYS = [ 'scope_name', 'read_only', 'authorized_at', + 'regranted_at', ] as const satisfies readonly (keyof AccountAuthorization)[]; type MissingAccountAuthorizationWireKey = Exclude< @@ -1218,6 +1219,7 @@ function projectAccountAuthorization(authorization: AccountAuthorization): Accou if (authorization.scope_name !== undefined) projected.scope_name = authorization.scope_name; if (authorization.read_only !== undefined) projected.read_only = authorization.read_only; if (authorization.authorized_at !== undefined) projected.authorized_at = authorization.authorized_at; + if (authorization.regranted_at !== undefined) projected.regranted_at = authorization.regranted_at; return projected; } @@ -1246,8 +1248,8 @@ export const REPORTING_WIND_DOWN_TASKS = Object.freeze([ * {@link REPORTING_WIND_DOWN_TASKS} and `read_only` is `false`, because receipts and statuses are * writes. Coverage continues while the grant lists `get_reporting_status`. * - * Pass the grant being wound down to keep its `authorized_at`: a reduced grant continues the - * current authorization chain, so `authorized_at` must not move. Its `field_scopes` and + * Pass the grant being wound down to keep its `authorized_at` and `regranted_at`: a reduced grant + * continues the current authorization chain, so neither moves. Its `field_scopes` and * `scope_name` describe the old task set and are dropped. * * ```ts @@ -1256,11 +1258,14 @@ export const REPORTING_WIND_DOWN_TASKS = Object.freeze([ * * @experimental Reporting subscriptions (`media_buy.reporting_subscriptions`, AdCP 3.3). */ -export function windDownGrant(current?: Pick): AccountAuthorization { +export function windDownGrant( + current?: Pick +): AccountAuthorization { return { allowed_tasks: [...REPORTING_WIND_DOWN_TASKS], read_only: false, ...(current?.authorized_at !== undefined ? { authorized_at: current.authorized_at } : {}), + ...(current?.regranted_at !== undefined ? { regranted_at: current.regranted_at } : {}), }; } diff --git a/src/lib/server/decisioning/runtime/entity-hydration.generated.ts b/src/lib/server/decisioning/runtime/entity-hydration.generated.ts index f5d642cd9..ba2c9d222 100644 --- a/src/lib/server/decisioning/runtime/entity-hydration.generated.ts +++ b/src/lib/server/decisioning/runtime/entity-hydration.generated.ts @@ -1,6 +1,6 @@ // Generated entity-hydration field map — do NOT edit by hand // -// Source: `schemas/cache/3.3.0-beta.2/manifest.json` + per-tool request +// Source: `schemas/cache/3.3.0-beta.3/manifest.json` + per-tool request // schemas. Every top-level `x-entity`-tagged string field on a request // schema lands here. The runtime hydrator (`from-platform.ts` → // `hydrateForTool`) walks this map plus the hand-curated @@ -86,9 +86,6 @@ export const TOOL_ENTITY_FIELDS: Readonly) }; + if ( + WEBHOOK_MEDIA_BUY_RESULT_TOOLS.has(opts.tool) && + typeof body.status === 'string' && + MEDIA_BUY_ONLY_STATUS_VALUES.has(body.status) + ) { + body.media_buy_status ??= body.status; + delete body.status; + } + body.status ??= status; + return body; +} + function resolveWebhookPayloadOperationId(opts: DispatchHitlOpts, taskId: string): string { if (opts.pushNotificationOperationId === undefined && isAdcpVersionAtLeast(opts.servedAdcpVersion, '3.2.0-beta.5')) { throw new AdcpError('INVALID_REQUEST', { diff --git a/src/lib/server/notification-subscriptions/runtime.ts b/src/lib/server/notification-subscriptions/runtime.ts index 526809395..12b969eff 100644 --- a/src/lib/server/notification-subscriptions/runtime.ts +++ b/src/lib/server/notification-subscriptions/runtime.ts @@ -41,6 +41,8 @@ export const ACCOUNT_NOTIFICATION_TYPES = Object.freeze([ 'creative.assignment_changed', 'indicators.changed', 'creative.purged', + // AdCP 3.3 experimental creative.live_updates (adcp#8404): a staged update's review outcome. + 'creative.staged_update_changed', 'account.status_changed', 'account.change_recorded', 'product.created', diff --git a/src/lib/server/principal/reporting-subscriptions.ts b/src/lib/server/principal/reporting-subscriptions.ts index afdcbd46d..5c54e887b 100644 --- a/src/lib/server/principal/reporting-subscriptions.ts +++ b/src/lib/server/principal/reporting-subscriptions.ts @@ -408,6 +408,9 @@ function pickInPlace(subscription: ReportingSubscription): Partial ({ deactivated_at: interval.from, reactivated_at: interval.until })), ...(history.deactivatedAt !== undefined ? [{ deactivated_at: history.deactivatedAt }] : []), ]; - const prior = history.versions + const priorVersions = history.versions .slice(0, -1) .reverse() .map(version => ({ @@ -465,22 +468,31 @@ export function projectReportingSubscriptionState( // adcontextprotocol/adcp#8588: each prior version carries its configuration. configuration: structuredClone(version.configuration), })); + // adcp#8619: the 16 newest are listed inline, and prior_versions_count gives the total. + const prior = priorVersions.slice(0, MAX_INLINE_PRIOR_VERSIONS); return { subscription_id: history.subscriptionId, subscription_version: current.subscriptionVersion, state, accepted_at: current.acceptedAt, - ...(prior.length > 0 ? { prior_versions: prior } : {}), + ...(prior.length > 0 ? { prior_versions: prior, prior_versions_count: priorVersions.length } : {}), ...(history.deactivatedAt !== undefined ? { deactivated_at: history.deactivatedAt } : {}), ...(intervals.length > 0 ? { inactive_intervals: intervals } : {}), ...(destination ? { destination_ref: destination.destination_ref } : {}), configuration, ...(issues.length > 0 ? { issues: issues.slice(0, 16) } : {}), ...(previous?.accounts_with_exceptions?.length - ? { accounts_with_exceptions: structuredClone(previous.accounts_with_exceptions) } + ? { + accounts_with_exceptions: structuredClone(previous.accounts_with_exceptions), + accounts_with_exceptions_count: + previous.accounts_with_exceptions_count ?? previous.accounts_with_exceptions.length, + } : {}), ...(previous?.accounts_unauthorized?.length - ? { accounts_unauthorized: structuredClone(previous.accounts_unauthorized) } + ? { + accounts_unauthorized: structuredClone(previous.accounts_unauthorized), + accounts_unauthorized_count: previous.accounts_unauthorized_count ?? previous.accounts_unauthorized.length, + } : {}), }; } diff --git a/src/lib/server/principal/runtime.ts b/src/lib/server/principal/runtime.ts index b8a775dcd..46b7b8ba9 100644 --- a/src/lib/server/principal/runtime.ts +++ b/src/lib/server/principal/runtime.ts @@ -1048,10 +1048,21 @@ export function createPrincipalLifecycle( const unauthorized = [...update.accountsUnauthorized].sort((left, right) => compareBytes(left.account_id, right.account_id) ); - if (withExceptions.length > 0) state.accounts_with_exceptions = structuredClone(withExceptions); - else delete state.accounts_with_exceptions; - if (unauthorized.length > 0) state.accounts_unauthorized = structuredClone(unauthorized); - else delete state.accounts_unauthorized; + // adcp#8619: each list carries its total. + if (withExceptions.length > 0) { + state.accounts_with_exceptions = structuredClone(withExceptions); + state.accounts_with_exceptions_count = withExceptions.length; + } else { + delete state.accounts_with_exceptions; + delete state.accounts_with_exceptions_count; + } + if (unauthorized.length > 0) { + state.accounts_unauthorized = structuredClone(unauthorized); + state.accounts_unauthorized_count = unauthorized.length; + } else { + delete state.accounts_unauthorized; + delete state.accounts_unauthorized_count; + } if (canonicalJsonSha256([state.accounts_with_exceptions ?? [], state.accounts_unauthorized ?? []]) !== before) { changed = true; } diff --git a/src/lib/server/reporting-subscription-release.ts b/src/lib/server/reporting-subscription-release.ts index 85d5dd91e..b7c70107a 100644 --- a/src/lib/server/reporting-subscription-release.ts +++ b/src/lib/server/reporting-subscription-release.ts @@ -1,14 +1,16 @@ /** * Which reporting-subscription wire fields a served release defines. * - * Fields settled after AdCP 3.3.0-beta.1 (adcontextprotocol/adcp#8585, #8588) are emitted only - * when the served release's own bundled schema declares them: earlier response shapes are - * closed (`additionalProperties: false`). The answer comes from the bundle, not from a - * version literal, so a release cut without these fields never opens the gate. A response - * without a served release (a direct handler call outside protocol dispatch) gets none of - * them; read the internal state APIs for the complete record. + * Fields settled after AdCP 3.3.0-beta.1 (adcontextprotocol/adcp#8585, #8588, #8613, #8619) are + * emitted only when the served release's own bundled schema declares them: earlier response + * shapes are closed (`additionalProperties: false`). The answer comes from the bundle, not from + * a version literal, so a release cut without these fields never opens the gate. The SDK's own + * pin (3.3.0-beta.3) defines all of them; the gate stays for callers served an older release + * (an external schema root, for example). A response without a served release (a direct + * handler call outside protocol dispatch) is the pinned release, as in the Python SDK. */ import { canonicalize } from '../utils/jcs'; +import { ADCP_VERSION } from '../version'; import { getSchemaDocumentByRef } from '../validation/schema-loader'; export interface ReportingSubscriptionReleaseFieldsV1 { @@ -26,25 +28,26 @@ export interface ReportingSubscriptionReleaseFieldsV1 { perOfferingExclusions: boolean; /** `reporting-subscription-coverage.json` `status: "inactive"` with `deactivated_at` (adcp#8613). */ inactiveCoverageStatus: boolean; + /** + * `reporting-subscription-state.json` `prior_versions_count`, `accounts_with_exceptions_count` and + * `accounts_unauthorized_count` (adcp#8619): each bounded list carries its total. + */ + readbackCounts: boolean; } -const NONE: ReportingSubscriptionReleaseFieldsV1 = Object.freeze({ - offeringDimensions: false, - inactiveIntervals: false, - priorVersionConfiguration: false, - cutoverPreviousTimezone: false, - perOfferingEntries: false, - perOfferingExclusions: false, - inactiveCoverageStatus: false, -}); - const cache = new Map(); type Schema = Readonly> | undefined; const properties = (schema: Schema): Record => ((schema?.properties as Record | undefined) ?? {}) as Record; +/** A local `#/definitions/...` reference resolved within the same document (beta.3 names its item shapes). */ +function local(root: Schema, schema: Schema): Schema { + const ref = (schema as { $ref?: unknown } | undefined)?.$ref; + if (typeof ref !== 'string' || !ref.startsWith('#/definitions/')) return schema; + return (root?.definitions as Record | undefined)?.[ref.slice('#/definitions/'.length)]; +} const itemProperties = (schema: Schema, field: string): Record => - properties((properties(schema)[field] as { items?: Schema } | undefined)?.items); + properties(local(schema, (properties(schema)[field] as { items?: Schema } | undefined)?.items)); function read(ref: string, version: string): Schema { try { @@ -54,11 +57,10 @@ function read(ref: string, version: string): Schema { } } -/** The settled fields the served release's bundle defines; none when no release is served. */ +/** The settled fields the served release's bundle defines; absent means the SDK's pinned release. */ export function reportingSubscriptionReleaseFieldsV1( - servedAdcpVersion: string | undefined + servedAdcpVersion: string | undefined = ADCP_VERSION ): ReportingSubscriptionReleaseFieldsV1 { - if (servedAdcpVersion === undefined) return NONE; const cached = cache.get(servedAdcpVersion); if (cached) return cached; const offering = read('core/reporting-delivery-offering.json', servedAdcpVersion); @@ -76,6 +78,10 @@ export function reportingSubscriptionReleaseFieldsV1( inactiveCoverageStatus: 'deactivated_at' in properties(coverage) && ((properties(coverage).status as { enum?: unknown[] } | undefined)?.enum ?? []).includes('inactive'), + readbackCounts: + 'prior_versions_count' in properties(state) && + 'accounts_with_exceptions_count' in properties(state) && + 'accounts_unauthorized_count' in properties(state), }); if (cache.size > 64) cache.clear(); cache.set(servedAdcpVersion, result); @@ -117,6 +123,13 @@ export function reportingSubscriptionCoverageForReleaseV1( configuration: T, @@ -133,6 +146,11 @@ export function reportingSubscriptionStatesForReleaseV1 prior ); } + for (const [list, count] of READBACK_LISTS) { + if (!fields.readbackCounts || !Array.isArray(next[list])) delete next[count]; + // A record written before the counts existed lists every entry it has, so its length is the total. + else if (typeof next[count] !== 'number') next[count] = (next[list] as unknown[]).length; + } return next; }), }; diff --git a/src/lib/server/wire-spec-fields.generated.ts b/src/lib/server/wire-spec-fields.generated.ts index c13166800..3448e2215 100644 --- a/src/lib/server/wire-spec-fields.generated.ts +++ b/src/lib/server/wire-spec-fields.generated.ts @@ -1,6 +1,6 @@ // AUTO-GENERATED by scripts/generate-wire-spec-fields.ts. DO NOT EDIT. -// Source: schemas/cache/3.3.0-beta.2/**/*-request.json -// Generated at: 2026-10-30T16:08:35.946Z +// Source: schemas/cache/3.3.0-beta.3/**/*-request.json +// Generated at: 2026-10-31T11:05:25.520Z import type { AcquireRightsRequest, @@ -56,162 +56,162 @@ import type { * pollution or shared-state mutation of the allowlist. */ export const WIRE_SPEC_FIELDS = Object.freeze({ - /** schemas/cache/3.3.0-beta.2/brand/acquire-rights-request.json */ + /** schemas/cache/3.3.0-beta.3/brand/acquire-rights-request.json */ AcquireRightsRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","buyer","campaign","context","ext","governance_context","idempotency_key","pricing_option_id","push_notification_config","revocation_webhook","rights_id"]) as readonly string[], __type: null as unknown as AcquireRightsRequest, }), - /** schemas/cache/3.3.0-beta.2/signals/activate-signal-request.json */ + /** schemas/cache/3.3.0-beta.3/signals/activate-signal-request.json */ ActivateSignalRequest: Object.freeze({ fields: Object.freeze(["account","action","adcp_major_version","adcp_version","context","destinations","ext","governance_context","idempotency_key","pricing_option_id","signal_agent_segment_id"]) as readonly string[], __type: null as unknown as ActivateSignalRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/build-creative-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/build-creative-request.json */ BuildCreativeRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","brand","concept_id","config","context","creative_id","creative_manifest","creative_representation_set","evaluator","ext","governance_context","idempotency_key","include_preview","item_limit","keep_mode","macro_values","max_creatives","max_spend","max_variants","media_buy_id","message","mode","package_id","preview_inputs","preview_output_format","preview_quality","push_notification_config","quality","refine_from_build_variant_id","representation_destination","representation_selection_strategy","selection_strategy","signal_conditions","target_capability_id","target_capability_ids","target_format_id","target_format_ids","transformer_id","variant_axis"]) as readonly string[], __type: null as unknown as BuildCreativeRequest, }), - /** schemas/cache/3.3.0-beta.2/content-standards/calibrate-content-request.json */ + /** schemas/cache/3.3.0-beta.3/content-standards/calibrate-content-request.json */ CalibrateContentRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","artifact","context","ext","idempotency_key","standards_id"]) as readonly string[], __type: null as unknown as CalibrateContentRequest, }), - /** schemas/cache/3.3.0-beta.2/collection/create-collection-list-request.json */ + /** schemas/cache/3.3.0-beta.3/collection/create-collection-list-request.json */ CreateCollectionListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","base_collections","brand","context","description","ext","filters","idempotency_key","name"]) as readonly string[], __type: null as unknown as CreateCollectionListRequest, }), - /** schemas/cache/3.3.0-beta.2/content-standards/create-content-standards-request.json */ + /** schemas/cache/3.3.0-beta.3/content-standards/create-content-standards-request.json */ CreateContentStandardsRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","calibration_exemplars","context","ext","idempotency_key","policies","registry_policy_ids","scope"]) as readonly string[], __type: null as unknown as CreateContentStandardsRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/create-media-buy-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/create-media-buy-request.json */ CreateMediaBuyRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","advertiser_industry","agency_estimate_number","artifact_webhook","bidding","brand","budget_allocation","budget_cap_timezone","context","daily_budget_cap","end_time","ext","frequency_cap","governance_context","idempotency_key","invoice_recipient","io_acceptance","lineage_reason","name","opportunity","pacing","packages","paused","plan_id","po_number","predecessor_media_buy_id","proposal_id","push_notification_config","reporting_webhook","start_time","total_budget"]) as readonly string[], __type: null as unknown as CreateMediaBuyRequest, }), - /** schemas/cache/3.3.0-beta.2/property/create-property-list-request.json */ + /** schemas/cache/3.3.0-beta.3/property/create-property-list-request.json */ CreatePropertyListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","base_properties","brand","context","description","ext","filters","idempotency_key","name"]) as readonly string[], __type: null as unknown as CreatePropertyListRequest, }), - /** schemas/cache/3.3.0-beta.2/collection/delete-collection-list-request.json */ + /** schemas/cache/3.3.0-beta.3/collection/delete-collection-list-request.json */ DeleteCollectionListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","context","ext","idempotency_key","list_id"]) as readonly string[], __type: null as unknown as DeleteCollectionListRequest, }), - /** schemas/cache/3.3.0-beta.2/property/delete-property-list-request.json */ + /** schemas/cache/3.3.0-beta.3/property/delete-property-list-request.json */ DeletePropertyListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","context","ext","idempotency_key","list_id"]) as readonly string[], __type: null as unknown as DeletePropertyListRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/get-media-buy-delivery-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/get-media-buy-delivery-request.json */ GetMediaBuyDeliveryRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","attribution_window","context","end_date","ext","include_package_daily_breakdown","include_window_breakdown","media_buy_ids","pagination","reporting_dimensions","reporting_revision_id","requested_metrics","start_date","status_filter","time_granularity"]) as readonly string[], __type: null as unknown as GetMediaBuyDeliveryRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/get-reporting-status-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/get-reporting-status-request.json */ GetReportingStatusRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","changes_after","context","delivery_config_ids","ext","feed_purposes","finality","health","media_buy_ids","pagination","period","reporting_revision_id","view"]) as readonly string[], __type: null as unknown as GetReportingStatusRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/log-event-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/log-event-request.json */ LogEventRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","context","event_source_id","events","ext","idempotency_key","test_event_code"]) as readonly string[], __type: null as unknown as LogEventRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/provide-performance-feedback-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/provide-performance-feedback-request.json */ ProvidePerformanceFeedbackRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","as_of","baseline","context","creative_id","evidence","evidence_ref","ext","feedback_source","final","idempotency_key","measurement_period","media_buy_id","methodology","methodology_version","metric","metric_type","package_id","performance_index","producer","study_ref","supersedes_feedback_id","vendor"]) as readonly string[], __type: null as unknown as ProvidePerformanceFeedbackRequest, }), - /** schemas/cache/3.3.0-beta.2/governance/report-plan-outcome-request.json */ + /** schemas/cache/3.3.0-beta.3/governance/report-plan-outcome-request.json */ ReportPlanOutcomeRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","check_id","context","delivery","error","ext","governance_context","idempotency_key","outcome","plan_id","purchase_type","seller_response"]) as readonly string[], __type: null as unknown as ReportPlanOutcomeRequest, }), - /** schemas/cache/3.3.0-beta.2/account/report-usage-request.json */ + /** schemas/cache/3.3.0-beta.3/account/report-usage-request.json */ ReportUsageRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","context","ext","idempotency_key","reporting_period","usage"]) as readonly string[], __type: null as unknown as ReportUsageRequest, }), - /** schemas/cache/3.3.0-beta.2/sponsored-intelligence/si-initiate-session-request.json */ + /** schemas/cache/3.3.0-beta.3/sponsored-intelligence/si-initiate-session-request.json */ SIInitiateSessionRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","context","ext","idempotency_key","identity","intent","media_buy_id","offering_id","offering_token","placement","sponsored_context_receipt","supported_capabilities"]) as readonly string[], __type: null as unknown as SIInitiateSessionRequest, }), - /** schemas/cache/3.3.0-beta.2/sponsored-intelligence/si-send-message-request.json */ + /** schemas/cache/3.3.0-beta.3/sponsored-intelligence/si-send-message-request.json */ SISendMessageRequest: Object.freeze({ fields: Object.freeze(["action_response","adcp_major_version","adcp_version","context","ext","idempotency_key","message","session_id","sponsored_context_receipt"]) as readonly string[], __type: null as unknown as SISendMessageRequest, }), - /** schemas/cache/3.3.0-beta.2/account/sync-accounts-request.json */ + /** schemas/cache/3.3.0-beta.3/account/sync-accounts-request.json */ SyncAccountsRequest: Object.freeze({ fields: Object.freeze(["accounts","adcp_major_version","adcp_version","context","delete_missing","dry_run","ext","idempotency_key","push_notification_config"]) as readonly string[], __type: null as unknown as SyncAccountsRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/sync-audiences-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/sync-audiences-request.json */ SyncAudiencesRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","audiences","context","delete_missing","ext","idempotency_key"]) as readonly string[], __type: null as unknown as SyncAudiencesRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/sync-catalogs-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/sync-catalogs-request.json */ SyncCatalogsRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","catalog_ids","catalogs","context","delete_missing","dry_run","ext","idempotency_key","item_availability_queries","item_availability_updates","push_notification_config","validation_mode"]) as readonly string[], __type: null as unknown as SyncCatalogsRequest, }), - /** schemas/cache/3.3.0-beta.2/creative/sync-creatives-request.json */ + /** schemas/cache/3.3.0-beta.3/creative/sync-creatives-request.json */ SyncCreativesRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","assignment_operations","assignments","context","creative_ids","creatives","delete_missing","dry_run","ext","idempotency_key","push_notification_config","validation_mode"]) as readonly string[], __type: null as unknown as SyncCreativesRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/sync-event-sources-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/sync-event-sources-request.json */ SyncEventSourcesRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","context","delete_missing","event_sources","ext","idempotency_key"]) as readonly string[], __type: null as unknown as SyncEventSourcesRequest, }), - /** schemas/cache/3.3.0-beta.2/account/sync-governance-request.json */ + /** schemas/cache/3.3.0-beta.3/account/sync-governance-request.json */ SyncGovernanceRequest: Object.freeze({ fields: Object.freeze(["accounts","adcp_major_version","adcp_version","context","ext","idempotency_key"]) as readonly string[], __type: null as unknown as SyncGovernanceRequest, }), - /** schemas/cache/3.3.0-beta.2/governance/sync-plans-request.json */ + /** schemas/cache/3.3.0-beta.3/governance/sync-plans-request.json */ SyncPlansRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","context","ext","idempotency_key","plans"]) as readonly string[], __type: null as unknown as SyncPlansRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/sync-reporting-receipts-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/sync-reporting-receipts-request.json */ SyncReportingReceiptsRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","adjustment_receipts","context","ext","idempotency_key","receipts"]) as readonly string[], __type: null as unknown as SyncReportingReceiptsRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/sync-reporting-status-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/sync-reporting-status-request.json */ SyncReportingStatusRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","context","ext","idempotency_key","statuses"]) as readonly string[], __type: null as unknown as SyncReportingStatusRequest, }), - /** schemas/cache/3.3.0-beta.2/collection/update-collection-list-request.json */ + /** schemas/cache/3.3.0-beta.3/collection/update-collection-list-request.json */ UpdateCollectionListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","base_collections","brand","context","description","ext","filters","idempotency_key","list_id","name","webhook_url"]) as readonly string[], __type: null as unknown as UpdateCollectionListRequest, }), - /** schemas/cache/3.3.0-beta.2/content-standards/update-content-standards-request.json */ + /** schemas/cache/3.3.0-beta.3/content-standards/update-content-standards-request.json */ UpdateContentStandardsRequest: Object.freeze({ fields: Object.freeze(["adcp_major_version","adcp_version","calibration_exemplars","context","ext","idempotency_key","policies","registry_policy_ids","scope","standards_id"]) as readonly string[], __type: null as unknown as UpdateContentStandardsRequest, }), - /** schemas/cache/3.3.0-beta.2/media-buy/update-media-buy-request.json */ + /** schemas/cache/3.3.0-beta.3/media-buy/update-media-buy-request.json */ UpdateMediaBuyRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","bidding","budget_allocation","budget_cap_timezone","canceled","cancellation_reason","context","daily_budget_cap","end_time","ext","frequency_cap","governance_context","idempotency_key","invoice_recipient","media_buy_id","name","new_packages","pacing","packages","paused","push_notification_config","reporting_webhook","revision","start_time","total_budget"]) as readonly string[], __type: null as unknown as UpdateMediaBuyRequest, }), - /** schemas/cache/3.3.0-beta.2/property/update-property-list-request.json */ + /** schemas/cache/3.3.0-beta.3/property/update-property-list-request.json */ UpdatePropertyListRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","base_properties","brand","context","description","ext","filters","idempotency_key","list_id","name","webhook_url"]) as readonly string[], __type: null as unknown as UpdatePropertyListRequest, }), - /** schemas/cache/3.3.0-beta.2/brand/update-rights-request.json */ + /** schemas/cache/3.3.0-beta.3/brand/update-rights-request.json */ UpdateRightsRequest: Object.freeze({ fields: Object.freeze(["account","adcp_major_version","adcp_version","context","end_date","ext","governance_context","idempotency_key","impression_cap","paused","pricing_option_id","push_notification_config","rights_id"]) as readonly string[], __type: null as unknown as UpdateRightsRequest, diff --git a/src/lib/testing/types.ts b/src/lib/testing/types.ts index 3279acf66..1cba2a09c 100644 --- a/src/lib/testing/types.ts +++ b/src/lib/testing/types.ts @@ -131,7 +131,7 @@ export interface TestOptions { /** * Schema roots for releases the agent may echo in its * `get_adcp_capabilities` response, keyed by AdCP version (`'3.2'`, - * `'3.2.5'`, `'3.3.0-beta.2'`). Values are schema-data roots in the same + * `'3.2.5'`, `'3.3.0-beta.3'`). Values are schema-data roots in the same * shape as `schemaRoot`. * * A 3.0 pin sends only `adcp_major_version`, so an agent may serve and echo diff --git a/src/lib/types/core.generated.ts b/src/lib/types/core.generated.ts index 0718fb186..6873305ac 100644 --- a/src/lib/types/core.generated.ts +++ b/src/lib/types/core.generated.ts @@ -1,5 +1,5 @@ -// Generated AdCP core types from official schemas v3.3.0-beta.2 -// Generated at: 2026-10-30T14:18:15.187Z +// Generated AdCP core types from official schemas v3.3.0-beta.3 +// Generated at: 2026-10-31T11:38:21.151Z // ACCOUNTCURRENCYMODE CANONICAL ENUM /** @@ -656,6 +656,12 @@ export type CreativeAgentCapability = 'validation' | 'assembly' | 'generation' | */ export type CreativeApprovalStatus = 'pending_review' | 'approved' | 'partially_approved' | 'rejected'; +// CREATIVECHANGEKIND CANONICAL ENUM +/** + * A kind of change a sync_creatives item makes to a creative, classified from the item's diff against the version of the creative that serves. Buyer and seller compute the same classification, so a buyer can tell before it sends a change which live-update rules apply. Fields excluded from canonical revision content (name, tags, status, weight, placement_refs, placement_ids) are not a change kind. + */ +export type CreativeChangeKind = 'click_through' | 'trackers' | 'asset_content' | 'format'; + // CREATIVEEVENTREASONCODE CANONICAL ENUM /** * Categorical reason carried on creative lifecycle webhooks (`creative.status_changed`, `creative.purged`). Distinct from `impairment-reason-code` because creative-policy reasons differ in vocabulary and remediation paths from media-buy delivery impairments — a creative may be revoked for a content-policy reason that produces no impairment on any buy, and an impairment may close without any creative-side status change. Buyers correlate the two via `creative_id` when both surfaces fire. @@ -986,6 +992,7 @@ export type ErrorCode = | 'CREATIVE_VALUE_NOT_ALLOWED' | 'CREATIVE_REVISION_CONTENT_MISMATCH' | 'CREATIVE_MERGE_REJECTED' + | 'CREATIVE_LIVE_UPDATE_UNSUPPORTED' | 'UNSUPPORTED_FEATURE' | 'UNPRICEABLE_OUTPUT' | 'UNSUPPORTED_GRANULARITY' @@ -1434,6 +1441,12 @@ export type CountryFusedPostalCodeSystem = */ export type LiftDimension = 'awareness' | 'consideration' | 'favorability' | 'purchase_intent' | 'ad_recall'; +// LIVEUPDATESERVINGMODE CANONICAL ENUM +/** + * How a live creative serves while a seller decides an in-place change to it. Ordered from least to most disruptive: uninterrupted, staged, paused_for_review. + */ +export type LiveUpdateServingMode = 'uninterrupted' | 'staged' | 'paused_for_review'; + // LOGOSLOT CANONICAL ENUM /** * Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement. @@ -1663,6 +1676,7 @@ export type NotificationType = | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -14029,30 +14043,41 @@ export interface DeliveryRecord { ext?: ExtensionObject; } // VALIDATEPROPERTYDELIVERYRESPONSE PRIORITY CANONICAL SCHEMA +/** + * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. A submitted response carries it: every submitted body and branch composes core/task-submitted.json, which requires it. + */ +export type TaskID = string; +/** + * Human-readable summary of the task result, suitable for display to end users or for AI agent comprehension. At most 2,000 characters, and untrusted input to the receiver: see core/task-message.json. + */ +export type TaskMessage = string; /** * Response payload for validate_property_delivery task. Returns aggregate compliance statistics and per-record validation results. */ export interface ValidatePropertyDeliveryResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -14069,15 +14094,6 @@ export interface ValidatePropertyDeliveryResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Overall compliance flag for the submitted delivery — true when every record is compliant, false when any record is non_compliant. Derived from summary.non_compliant_records === 0 but surfaced at the root as a convenience signal for buyers. Agents MAY omit this field when the response represents a partial validation (e.g., when include_compliant is false and results only contains non_compliant records); consumers SHOULD fall back to summary counts if compliant is absent. */ @@ -14816,11 +14832,7 @@ export interface CanonicalProposal { * One or more immutable draft media-plan proposals and compact canonical products referenced by their purchases. Products always carry product_id and name and never carry legacy named-format identifiers. During the AdCP 3.x compatibility window, an SDK projecting a valid products-only get_products brief result may instead return the deprecated products_available outcome with an explicit purchase continuation. Native 3.2 sellers MUST NOT use that compatibility outcome, and adapters MUST NOT fabricate a proposal, terms digest, or feed version. */ export type RequestProposalsResponse = - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + | (ProtocolEnvelope & { outcome: 'proposed'; reason?: never; suggestions?: never; @@ -14879,22 +14891,13 @@ export type RequestProposalsResponse = purchase_continuation?: never; targeting_resolution?: ProductDiscoveryTargetingResolution; later_proposals?: LaterProposalsState; - status?: 'completed'; - task_id?: never; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status?: 'completed'; + task_id?: never; + }) + | (ProtocolEnvelope & { outcome: 'products_available'; reason?: never; suggestions?: never; @@ -14993,22 +14996,13 @@ export type RequestProposalsResponse = }; targeting_resolution?: ProductDiscoveryTargetingResolution; later_proposals?: LaterProposalsState; - status?: 'completed'; - task_id?: never; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status?: 'completed'; + task_id?: never; + }) + | (ProtocolEnvelope & { outcome: 'rejected'; /** * @minLength 1 @@ -15025,22 +15019,13 @@ export type RequestProposalsResponse = purchase_continuation?: never; targeting_resolution?: ProductDiscoveryTargetingResolution; later_proposals?: LaterProposalsState; - status?: 'completed'; - task_id?: never; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status?: 'completed'; + task_id?: never; + }) + | (ProtocolEnvelope & { outcome?: 'proposed' | 'products_available' | 'rejected'; /** * @minLength 1 @@ -15163,26 +15148,18 @@ export type RequestProposalsResponse = }; targeting_resolution?: ProductDiscoveryTargetingResolution; later_proposals?: LaterProposalsState; - status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - }; + status: 'submitted'; + task_id: TaskID; + }); // DECLINEPROPOSALSRESPONSE PRIORITY EXTRACTED TYPE /** * One ordered terminal result for each requested proposal decline. */ export type DeclineProposalsResponse = - | { + | (ProtocolEnvelope & { /** * One result per requested decline, in request order. Empty only when the request carried an empty declines array with an opportunity update. */ @@ -15207,16 +15184,12 @@ export type DeclineProposalsResponse = reason: string; } )[]; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { + status?: 'completed'; + }) + | (ProtocolEnvelope & { /** * One result per requested decline, in request order. Empty only when the request carried an empty declines array with an opportunity update. */ @@ -15241,21 +15214,12 @@ export type DeclineProposalsResponse = reason: string; } )[]; - status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - }; - + status: 'submitted'; + task_id: TaskID; + }); // SYNCCREATIVESSUCCESS PRIORITY EXTRACTED TYPE /** * Success response - sync operation processed creatives (may include per-item failures) @@ -15277,6 +15241,7 @@ export interface SyncCreativesSuccess { account?: Account; action: CreativeAction; status?: CreativeStatus; + staged_update?: CreativeStagedUpdate; /** * The seller's identifier for this creative in its source of truth. Also returned on list_creatives. */ @@ -15409,7 +15374,6 @@ export interface CommittedMediaBuy { })[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } // MEDIA-BUY SCHEMA /** @@ -15440,6 +15404,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15465,6 +15430,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15531,6 +15497,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15556,6 +15523,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15622,6 +15590,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15647,6 +15616,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15713,6 +15683,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15738,6 +15709,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15804,6 +15776,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15829,6 +15802,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15895,6 +15869,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15920,6 +15895,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15986,6 +15962,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16011,6 +15988,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16077,6 +16055,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16102,6 +16081,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16168,6 +16148,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16193,6 +16174,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16259,6 +16241,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16284,6 +16267,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16350,6 +16334,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16375,6 +16360,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16441,6 +16427,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16466,6 +16453,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16532,6 +16520,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16557,6 +16546,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16623,6 +16613,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16648,6 +16639,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16714,6 +16706,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16739,6 +16732,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16805,6 +16799,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16830,6 +16825,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -18813,11 +18809,37 @@ export interface MediaBuy { */ reason?: string; }; + /** + * Present only when status is canceled: when delivery stops under the cancellation. It equals cancellation.canceled_at when delivery stops at once, and is later when the seller keeps delivering through a notice period (the product's cancellation_policy.notice_period) or to the end of a committed unit. Not later than end_time. Sellers advertising media_buy.reporting_subscriptions MUST populate it, because subscription reporting is owed through the period containing this instant, not the instant the cancellation was recorded. Buyers use cancellation.canceled_at when it is absent. + * @format date-time + */ + cancellation_effective_at?: string; /** * When the seller moved the buy to completed; present when status is completed. Sellers advertising media_buy.reporting_subscriptions MUST populate it for completed buys, because a buy that completes before end_time stops being owed reporting at this instant. * @format date-time */ completed_at?: string; + /** + * Retroactive flight edits, oldest first, so a buyer can recompute which periods a reporting subscription owed (media_buy.reporting_subscriptions). The buy's flight runs from start_time to its stop time, as the reporting-subscription.json coverage rule defines it. An edit is retroactive when the start_time or stop time before or after it is earlier than the instant the seller recorded it. Each entry carries the flight in force before that edit. The flight in force at an instant X is the one in the earliest entry recorded after X, or the current flight when no entry is. Edits whose before and after values all lie after recorded_at change no elapsed period, so they are not listed. Sellers advertising media_buy.reporting_subscriptions MUST list every retroactive edit recorded within the last status_retention_days; an older entry MAY be dropped, because it governs only periods that ended before it was recorded. At most 64 entries are retained: a seller MUST refuse a retroactive edit that would exceed that with INVALID_STATE, and an edit it cannot refuse, such as one observed on a connected platform, it applies from the instant it records it (no start_time or stop time earlier than recorded_at), which needs no entry. + * @maxItems 64 + */ + flight_history?: { + /** + * When the seller recorded the edit, or ingested it when it was observed on a connected platform. Flight values change at this instant for every period resolved after it. + * @format date-time + */ + recorded_at: string; + /** + * start_time in force before the edit. + * @format date-time + */ + start_time: string; + /** + * Stop time in force before the edit. + * @format date-time + */ + stop_time: string; + }[]; /** * Hard aggregate lifetime budget amount * @minimum 0 @@ -21822,204 +21844,239 @@ export type AdCPAsyncResponseData = /** * Response for completed or failed get_products */ -export type GetProductsResponse = AdCPVersionEnvelope & - ProtocolEnvelope & { - } & { - /** - * Array of matching products - */ - products?: Product[]; - /** - * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. - * - * @minItems 1 - */ - collections?: [ResponseCollection, ...ResponseCollection[]]; - targeting_resolution?: ProductDiscoveryTargetingResolution; - /** - * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. - */ - extensions?: { - }; - /** - * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. - */ - proposals?: Proposal[]; - /** - * Task-specific errors and warnings (e.g., product filtering issues) - */ - errors?: Error[]; - /** - * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. - */ - reason?: string; - /** - * Actionable alternatives available only on the GetProductsRejected arm. - * - * @maxItems 20 - */ - suggestions?: - string[]; - /** - * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. - */ - property_list_applied?: boolean; - /** - * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. - */ - catalog_applied?: boolean; - /** - * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. - */ - refinement_applied?: ( - | { - /** - * Echoes scope 'request' from the corresponding refine entry. - */ - scope: 'request'; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - | { - } - | { - /** - * Echoes scope 'proposal' from the corresponding refine entry. - */ - scope: 'proposal'; - /** - * Echoes proposal_id from the corresponding refine entry. - */ - proposal_id: string; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - )[]; - /** - * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. - * - * @minItems 1 - */ - incomplete?: [ - { +export type GetProductsResponse = ProtocolEnvelope & { +} & { + /** + * Array of matching products + */ + products?: Product[]; + /** + * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. + * + * @minItems 1 + */ + collections?: [ResponseCollection, ...ResponseCollection[]]; + targeting_resolution?: ProductDiscoveryTargetingResolution; + /** + * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. + */ + extensions?: { + }; + /** + * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. + */ + proposals?: Proposal[]; + /** + * Task-specific errors and warnings (e.g., product filtering issues) + */ + errors?: Error[]; + /** + * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. + */ + reason?: string; + /** + * Actionable alternatives available only on the GetProductsRejected arm. + * + * @maxItems 20 + */ + suggestions?: + string[]; + /** + * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. + */ + property_list_applied?: boolean; + /** + * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. + */ + catalog_applied?: boolean; + /** + * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. + */ + refinement_applied?: ( + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'request' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'request'; /** - * Human-readable explanation of what is missing and why. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - description: string; + status: 'applied' | 'partial' | 'unable'; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. */ - estimated_wait?: Duration; - }, - ...{ + notes?: string; + } + | { + } + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'proposal' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'proposal'; /** - * Human-readable explanation of what is missing and why. + * Echoes proposal_id from the corresponding refine entry. */ - description: string; + proposal_id: string; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - estimated_wait?: Duration; - }[] - ]; - /** - * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. - */ - filter_diagnostics?: { + status: 'applied' | 'partial' | 'unable'; + /** + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. + */ + notes?: string; + } + )[]; + /** + * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. + * + * @minItems 1 + */ + incomplete?: [ + { /** - * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - semantics?: 'only' | 'any' | 'approximate'; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. + * Human-readable explanation of what is missing and why. */ - total_candidates?: number; + description: string; /** - * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - excluded_by?: { - [k: string]: - | { - /** - * Number of products excluded by this filter, interpreted per the parent `semantics` field. - */ - count: number; - /** - * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. - */ - values?: (string | {})[]; - /** - * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). - */ - notes?: string; - } - | undefined; - }; - }; - pagination?: PaginationResponse; - /** - * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; - /** - * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. - */ - execution_readiness?: { + estimated_wait?: Duration; + }, + ...{ /** - * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - version: string; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. + * Human-readable explanation of what is missing and why. */ - evaluated_at?: string; + description: string; /** - * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - products: { - [k: string]: ProductExecutionReadiness | undefined; - }; - ext?: ExtensionObject; + estimated_wait?: Duration; + }[] + ]; + /** + * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. + */ + filter_diagnostics?: { + /** + * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. + */ + semantics?: 'only' | 'any' | 'approximate'; + /** + * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. + */ + total_candidates?: number; + /** + * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). + */ + excluded_by?: { + [k: string]: + | { + /** + * Number of products excluded by this filter, interpreted per the parent `semantics` field. + */ + count: number; + /** + * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. + */ + values?: (string | {})[]; + /** + * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). + */ + notes?: string; + } + | undefined; }; + }; + pagination?: PaginationResponse; + /** + * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. + */ + execution_readiness?: { /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. */ - cache_scope?: 'public' | 'account'; + version: string; /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. */ - unchanged?: true; + evaluated_at?: string; /** - * When true, this response contains simulated data from sandbox mode. + * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. */ - sandbox?: boolean; - context?: ContextObject; + products: { + [k: string]: ProductExecutionReadiness | undefined; + }; ext?: ExtensionObject; }; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; +/** + * Canonical envelope field-set for AdCP task responses, normalized across transports. Defines the protocol-layer fields (status, context_id, context, task_id, message, timestamp, replayed, adcp_error, push_notification_config, governance_context) and the conceptual `payload` grouping for task-specific response data, and composes `core/version-envelope.json` so the served `adcp_version` and the deprecated `adcp_major_version` are envelope fields on every response. The server framework stamps these fields; they are not task data. The serialization rules — whether envelope fields appear as siblings of payload fields, as a nested `payload` object, or via transport-native containers — are transport-specific and normative per transport (see Transport serialization below). The `status` field is REQUIRED on every task response envelope, including synchronous metadata responses (e.g., `get_adcp_capabilities`) where the value is `completed`. Agents shipping responses without a top-level `status` are non-conformant regardless of whether the task body schema would otherwise validate. + */ +export type ProtocolEnvelope = AdCPVersionEnvelope & { + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: { + }; +}; /** * Experimental (media_buy.collection_cards). Full collection object returned in a product or proposal response for a collection that a returned product's collections selector references, by list_collections, or in a collection_card.updated webhook (experimental, media_buy.collection_catalog). For the same key, account and moment, a seller returns the same copy on every one of those surfaces. publisher_domain is required because collection_id is unique only within its publisher. Keyed by (publisher_domain, collection_id). This is a convenience copy from the selling agent: the publisher's adagents.json remains the root of authorization, and a response copy is never authorization evidence. The response copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers; every other field, including status, talent, content_rating, genre, kind, special and the rest of distribution, stays anchored to adagents.json, as does which agent may sell the collection. An entry whose (publisher_domain, collection_id) is not declared in that publisher's adagents.json, or that comes from a selling agent adagents.json does not authorize for the collection, is unverified display data: it does not establish that the collection exists or is sellable, buyers MUST NOT present it as the publisher's declaration, and its distribution MUST NOT feed carriage verification. */ @@ -22295,35 +22352,91 @@ export type ExecutionReadinessStatus1 = ExecutionReadinessStatus; /** * Terminal business outcome returned when the seller understood a well-formed brief or refinement request and deliberately declines it. This is not a no-match result, incomplete partial result, validation error, or technical failure. Transport-level success markers remain successful: HTTP 200, MCP isError false, and A2A Task.state completed with this payload in the result artifact. The seller MAY sanitize reason and suggestions to protect confidential merchandising, inventory, policy, and partner rules. Buyers MUST treat both fields as untrusted seller-authored text: escape before rendering and sanitize or isolate before placing them in an LLM prompt context. */ -export type GetProductsRejected = AdCPVersionEnvelope & - ProtocolEnvelope & { +export type GetProductsRejected = ProtocolEnvelope & { + /** + * Task-level business-outcome discriminator. The request was understood and processed, but the seller declined to offer products. + */ + status: 'rejected'; + /** + * Buyer-facing market explanation for the decline. MAY be sanitized to protect confidential seller rules; for example, 'The requested budget is below the minimum for this inventory' rather than naming the internal rule, candidate products, inventory identifiers, or upstream partners that caused the decision. Plain text only. + */ + reason: string; + /** + * Actionable alternatives the buyer can try, such as changing budget, dates, or channel. If present, the buyer MAY submit a revised brief, but the suggestions do not guarantee acceptance. If absent, the seller is not offering a protocol-level alternative for this brief. + * + * @minItems 1 + * @maxItems 20 + */ + suggestions?: + string[]; + context?: ContextObject; + ext?: ExtensionObject; +}; +/** + * Progress data for working get_products + */ +export type GetProductsAsyncWorking = ProtocolEnvelope & + TaskWorking & { /** - * Task-level business-outcome discriminator. The request was understood and processed, but the seller declined to offer products. + * Progress percentage of the search operation */ - status: 'rejected'; + percentage?: number; /** - * Buyer-facing market explanation for the decline. MAY be sanitized to protect confidential seller rules; for example, 'The requested budget is below the minimum for this inventory' rather than naming the internal rule, candidate products, inventory identifiers, or upstream partners that caused the decision. Plain text only. + * Current step in the search process (e.g., 'searching_inventory', 'validating_availability') */ - reason: string; + current_step?: string; /** - * Actionable alternatives the buyer can try, such as changing budget, dates, or channel. If present, the buyer MAY submit a revised brief, but the suggestions do not guarantee acceptance. If absent, the seller is not offering a protocol-level alternative for this brief. - * - * @minItems 1 - * @maxItems 20 + * Total number of steps in the search process */ - suggestions?: - string[]; + total_steps?: number; + /** + * Current step number (1-indexed) + */ + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for get_products needing clarification + */ +export type GetProductsAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why input is needed + */ + reason?: 'CLARIFICATION_NEEDED' | 'BUDGET_REQUIRED'; + /** + * Partial product results that may help inform the clarification + */ + partial_results?: Product[]; + /** + * Suggested values or options for the required input + */ + suggestions?: string[]; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted get_products (custom curation) + */ +export type GetProductsAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Estimated completion time for the search + */ + estimated_completion?: string; + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; }; /** * Bounded submitted envelope shared by the compact lifecycle tools. */ -export type CompactTaskSubmitted = AdCPVersionEnvelope & - ProtocolEnvelope & { - status: 'submitted'; - task_id: string; - message?: string; +export type CompactTaskSubmitted = ProtocolEnvelope & + TaskSubmitted & { errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; @@ -22827,49 +22940,22 @@ export type RequestProposalsAsyncSubmitted = CompactTaskSubmitted; /** * Terminal response for refine_proposals */ -export type RefineProposalsResponse = ( - | { - status?: 'completed'; - } - | CompactTaskSubmitted -) & { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. - * - * @minItems 1 - */ - results?: { - } & [ - { - } & ( - | { - outcome: 'revised'; - proposals: { - proposal_status: 'draft'; - }[]; - } - | { - outcome: 'partial'; - proposals: { - proposal_status: 'draft'; - }[]; - } - | { - outcome: 'finalized'; - proposal: { - proposal_status: 'committed'; - expires_at: string; - }; - } - | { - outcome: 'unable'; - } - ) & - ( +export type RefineProposalsResponse = ProtocolEnvelope & + ( + | { + status?: 'completed'; + } + | CompactTaskSubmitted + ) & { + /** + * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. + * + * @minItems 1 + */ + results?: { + } & [ + { + } & ( | { outcome: 'revised'; proposals: { @@ -22892,33 +22978,33 @@ export type RefineProposalsResponse = ( | { outcome: 'unable'; } - ), - ...({ - } & ( - | { - outcome: 'revised'; - proposals: { - proposal_status: 'draft'; - }[]; - } - | { - outcome: 'partial'; - proposals: { - proposal_status: 'draft'; - }[]; - } - | { - outcome: 'finalized'; - proposal: { - proposal_status: 'committed'; - expires_at: string; - }; - } - | { - outcome: 'unable'; - } - ) & - ( + ) & + ( + | { + outcome: 'revised'; + proposals: { + proposal_status: 'draft'; + }[]; + } + | { + outcome: 'partial'; + proposals: { + proposal_status: 'draft'; + }[]; + } + | { + outcome: 'finalized'; + proposal: { + proposal_status: 'committed'; + expires_at: string; + }; + } + | { + outcome: 'unable'; + } + ), + ...({ + } & ( | { outcome: 'revised'; proposals: { @@ -22941,30 +23027,50 @@ export type RefineProposalsResponse = ( | { outcome: 'unable'; } - ))[] - ]; - /** - * Canonical products needed to evaluate the resulting terms. For revised or partial results whose effective criteria contain property or collection lists, each affected product MUST carry fresh list_applications receipts from the revision's product reevaluation. Finalization changes no terms and MAY repeat the receipts already bound to the source proposal rather than reevaluating them. - */ - products?: CanonicalProduct[]; - /** - * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. - * - * @minItems 1 - */ - collections?: [ResponseCollection, ...ResponseCollection[]]; - status?: 'completed' | 'submitted'; - task_id?: string; - message?: string; - /** - * Optional estimate, on a submitted response to a finalize-only or extend_hold-only request, of when the seller expects to resolve the finalize or extension, for example when a creator, host or talent must agree before the hold or its extension. Same semantics as on `create_media_buy`: an estimate, not a commitment or expiry; buyers SHOULD schedule a status check for it and MUST NOT treat a passed timestamp as failure. Sellers SHOULD NOT send it on revise requests. - */ - expected_confirmation_at?: string; - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - replayed?: true; -}; + ) & + ( + | { + outcome: 'revised'; + proposals: { + proposal_status: 'draft'; + }[]; + } + | { + outcome: 'partial'; + proposals: { + proposal_status: 'draft'; + }[]; + } + | { + outcome: 'finalized'; + proposal: { + proposal_status: 'committed'; + expires_at: string; + }; + } + | { + outcome: 'unable'; + } + ))[] + ]; + /** + * Canonical products needed to evaluate the resulting terms. For revised or partial results whose effective criteria contain property or collection lists, each affected product MUST carry fresh list_applications receipts from the revision's product reevaluation. Finalization changes no terms and MAY repeat the receipts already bound to the source proposal rather than reevaluating them. + */ + products?: CanonicalProduct[]; + /** + * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. + * + * @minItems 1 + */ + collections?: [ResponseCollection, ...ResponseCollection[]]; + /** + * Optional estimate, on a submitted response to a finalize-only or extend_hold-only request, of when the seller expects to resolve the finalize or extension, for example when a creator, host or talent must agree before the hold or its extension. Same semantics as on `create_media_buy`: an estimate, not a commitment or expiry; buyers SHOULD schedule a status check for it and MUST NOT treat a passed timestamp as failure. Sellers SHOULD NOT send it on revise requests. + */ + expected_confirmation_at?: string; + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Acknowledgment for submitted refine_proposals (complex revision requiring re-underwriting or upstream pricing queries) */ @@ -22977,7 +23083,7 @@ export type RefineProposalsAsyncSubmitted = CompactTaskSubmitted & { /** * Shared terminal response for buy_products and accept_proposal; originating task identity is carried by the task envelope and manifest resolver. */ -export type MediaBuyCommitmentResponse = CommittedMediaBuy | CommitmentError | CommitmentSubmitted; +export type MediaBuyCommitmentResponse = ProtocolEnvelope & (CommittedMediaBuy | CommitmentError | CommitmentSubmitted); /** * A currently available MediaBuy action with the compact-lifecycle task an SDK calls to exercise it. Deprecated coarse action values are absent. In AdCP 3.3, update_creative_start_policy is an operational package control with an explicit eligible package scope, independent of commercial change terms. */ @@ -23022,90 +23128,113 @@ export type Warning = { }; ext?: ExtensionObject; }; +export type CommitmentSubmitted = TaskSubmitted; /** * Terminal response for control_media_buy */ -export type ControlMediaBuyResponse = ControlApplied | ControlError | ControlSubmitted; +export type ControlMediaBuyResponse = ProtocolEnvelope & (ControlApplied | ControlError | ControlSubmitted); +export type ControlSubmitted = TaskSubmitted; /** - * Response for completed or failed get_signals + * Working progress for any compact lifecycle task. */ -export type GetSignalsResponse = AdCPVersionEnvelope & - ProtocolEnvelope & { - /** - * Array of matching signals - */ - signals?: (SignalListing & - SignalDefinitionEnrichment & { - })[]; - /** - * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. - * - * @minItems 1 - */ - signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; - /** - * Task-specific errors and warnings (e.g., signal discovery or pricing issues) - */ +export type CompactTaskWorking = ProtocolEnvelope & + TaskWorking & { + percentage?: number; + current_step?: string; + total_steps?: number; + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input-required payload for any compact lifecycle task. + */ +export type CompactTaskInputRequired = ProtocolEnvelope & + TaskInputRequired & { + reason?: string; errors?: Error[]; - /** - * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. - * - * @minItems 1 - */ - incomplete?: [ - { - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }, - ...{ - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }[] - ]; - /** - * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; - /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. - */ - cache_scope?: 'public' | 'account'; - /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. - */ - unchanged?: true; - pagination?: PaginationResponse; - /** - * When true, this response contains simulated data from sandbox mode. - */ - sandbox?: boolean; context?: ContextObject; ext?: ExtensionObject; }; +/** + * Response for completed or failed get_signals + */ +export type GetSignalsResponse = ProtocolEnvelope & { + /** + * Array of matching signals + */ + signals?: (SignalListing & + SignalDefinitionEnrichment & { + })[]; + /** + * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. + * + * @minItems 1 + */ + signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; + /** + * Task-specific errors and warnings (e.g., signal discovery or pricing issues) + */ + errors?: Error[]; + /** + * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. + * + * @minItems 1 + */ + incomplete?: [ + { + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }, + ...{ + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }[] + ]; + /** + * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + pagination?: PaginationResponse; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; /** * Optional signal-definition enrichment fields that may be projected inline on signal listings when requested through get_signals.fields. This schema intentionally excludes signal identity and required definition fields so source-native, private, or compact listings can include typed partial disclosure without becoming a full adagents.json signal definition. */ @@ -23395,26 +23524,183 @@ export type SignalModelingDisclosure = { */ notes?: string; }; +/** + * Progress data for working get_signals + */ +export type GetSignalsAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Progress percentage of the signal discovery operation. + */ + percentage?: number; + /** + * Current step in the signal discovery process, such as `querying_providers`, `ranking_signals`, or `checking_deployments`. + */ + current_step?: string; + /** + * Total number of steps in the signal discovery process. + */ + total_steps?: number; + /** + * Current step number (1-indexed). + */ + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted get_signals (semantic discovery) + */ +export type GetSignalsAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Estimated completion time for the signal discovery task. + */ + estimated_completion?: string; + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories or partial provider unavailability). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Response for completed or failed create_media_buy */ -export type CreateMediaBuyResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & (CreateMediaBuySuccess | CreateMediaBuyError | CreateMediaBuySubmitted); +export type CreateMediaBuyResponse = ProtocolEnvelope & {} & ( + | CreateMediaBuySuccess + | CreateMediaBuyError + | CreateMediaBuySubmitted + ); /** * Success response - media buy created successfully */ export type CreateMediaBuySuccess = { }; +/** + * Async task envelope returned when the media buy cannot be confirmed before the response is emitted — for example, when a guaranteed buy requires IO signing, when governance review is outstanding, or when the seller has queued the request for batch processing. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the media_buy_id and packages land in the terminal result, not this envelope. Do not use a 'pending_approval' MediaBuy.status for this case — that value is not in MediaBuyStatus; IO review and similar pre-issuance workflows are modeled at the task layer only. + */ +export type CreateMediaBuySubmitted = TaskSubmitted; +/** + * Progress data for working create_media_buy + */ +export type CreateMediaBuyAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Completion percentage (0-100) + */ + percentage?: number; + /** + * Current step or phase of the operation + */ + current_step?: string; + /** + * Total number of steps in the operation + */ + total_steps?: number; + /** + * Current step number + */ + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for create_media_buy needing user input + */ +export type CreateMediaBuyAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why input is needed + */ + reason?: 'APPROVAL_REQUIRED' | 'BUDGET_EXCEEDS_LIMIT'; + /** + * Optional validation errors or warnings for debugging purposes. Helps explain why input is required. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted create_media_buy + */ +export type CreateMediaBuyAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. + */ + expected_confirmation_at?: string; + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Response for completed or failed update_media_buy */ -export type UpdateMediaBuyResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & (UpdateMediaBuySuccess | UpdateMediaBuyError | UpdateMediaBuySubmitted); +export type UpdateMediaBuyResponse = ProtocolEnvelope & {} & ( + | UpdateMediaBuySuccess + | UpdateMediaBuyError + | UpdateMediaBuySubmitted + ); +/** + * Async task envelope returned when update_media_buy cannot be confirmed before the response — for example, when operator re-approval is required for mid-flight changes. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the updated media buy state lands in the terminal result, not this envelope. + */ +export type UpdateMediaBuySubmitted = TaskSubmitted; +/** + * Progress data for working update_media_buy + */ +export type UpdateMediaBuyAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Completion percentage (0-100) + */ + percentage?: number; + /** + * Current step or phase of the operation + */ + current_step?: string; + /** + * Total number of steps in the operation + */ + total_steps?: number; + /** + * Current step number + */ + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for update_media_buy needing user input + */ +export type UpdateMediaBuyAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why input is needed + */ + reason?: 'APPROVAL_REQUIRED' | 'CHANGE_CONFIRMATION'; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted update_media_buy + */ +export type UpdateMediaBuyAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Response for completed or failed build_creative */ -export type BuildCreativeResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & ( +export type BuildCreativeResponse = ProtocolEnvelope & {} & ( | BuildCreativeSuccess | BuildCreativeMultiSuccess | BuildCreativeVariantSuccess @@ -23606,31 +23892,175 @@ export type PreviewRender = }; renderer?: PreviewRendererMetadata; }; +/** + * Async task envelope returned when build_creative cannot be confirmed before the response — for example, when a slow generative pipeline or multi-minute LLM workflow is queued. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creative_manifest(s) land in the terminal result, not this envelope. + */ +export type BuildCreativeSubmitted = TaskSubmitted; /** * Terminal response for completed preview_creative */ -export type PreviewCreativeResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & ( +export type PreviewCreativeResponse = ProtocolEnvelope & {} & ( | PreviewCreativeSingleResponse | PreviewCreativeBatchResponse | PreviewCreativeVariantResponse | PreviewCreativeSubmitted ); +/** + * Async task envelope returned only when the preview_creative request set allow_async to true and rendering cannot complete inline. The buyer polls get_task_status with task_id; the completed preview response is the task result. + */ +export type PreviewCreativeSubmitted = TaskSubmitted; +/** + * Progress data for working build_creative + */ +export type BuildCreativeAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Completion percentage (0-100) + */ + percentage?: number; + /** + * Current step or phase of the operation (e.g., 'generating_assets', 'resolving_macros', 'rendering_preview') + */ + current_step?: string; + /** + * Total number of steps in the operation + */ + total_steps?: number; + /** + * Current step number + */ + step_number?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for build_creative needing user input + */ +export type BuildCreativeAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why input is needed + */ + reason?: 'APPROVAL_REQUIRED' | 'CREATIVE_DIRECTION_NEEDED' | 'ASSET_SELECTION_NEEDED'; + /** + * Optional validation errors or warnings explaining why input is required. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted build_creative + */ +export type BuildCreativeAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Terminal response for completed or failed get_creative_features */ -export type GetCreativeFeaturesResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & (GetCreativeFeaturesSuccess | GetCreativeFeaturesError | GetCreativeFeaturesSubmitted); +export type GetCreativeFeaturesResponse = ProtocolEnvelope & {} & ( + | GetCreativeFeaturesSuccess + | GetCreativeFeaturesError + | GetCreativeFeaturesSubmitted + ); +/** + * Async acknowledgement returned after the provider accepts an evaluation but cannot complete it within the response window. Exact keyed request replays return this original acknowledgement with replayed: true and the same task_id. In AdCP 3.x providers SHOULD also return evaluation_id; it becomes required in AdCP 4.0. When present, exact replays and terminal results preserve it. The caller polls get_task_status using task_id. + */ +export type GetCreativeFeaturesSubmitted = TaskSubmitted; +/** + * Acknowledgment for an accepted provider creative-feature evaluation + */ +export type GetCreativeFeaturesAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Provider-generated identity allocated when the evaluation is accepted. Optional in AdCP 3.x and required in AdCP 4.0. Providers SHOULD emit it in 3.x; when present, exact replays and the terminal result MUST carry this same value. Distinct from task_id and idempotency_key. + */ + evaluation_id?: string; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Response for completed or failed sync_creatives */ -export type SyncCreativesResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & (SyncCreativesSuccess | SyncCreativesError | SyncCreativesSubmitted); +export type SyncCreativesResponse = ProtocolEnvelope & {} & ( + | SyncCreativesSuccess + | SyncCreativesError + | SyncCreativesSubmitted + ); +/** + * Async task envelope returned when the whole sync operation cannot be confirmed before the response is emitted — for example, when the seller batches ingestion, when async review must settle before per-item results can be issued, or when governance review gates the sync. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creatives array with per-item action/status lands in the terminal result, not this envelope. Per-item async review (an item in pending_review while the rest of the sync resolves synchronously) belongs on the SyncCreativesSuccess branch with status: pending_review, not here. + */ +export type SyncCreativesSubmitted = TaskSubmitted; +/** + * Progress data for working sync_creatives + */ +export type SyncCreativesAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Completion percentage (0-100) + */ + percentage?: number; + /** + * Current step or phase of the operation + */ + current_step?: string; + /** + * Total number of steps in the operation + */ + total_steps?: number; + /** + * Current step number + */ + step_number?: number; + /** + * Number of creatives processed so far + */ + creatives_processed?: number; + /** + * Total number of creatives to process + */ + creatives_total?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for sync_creatives needing user input + */ +export type SyncCreativesAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why buyer input is needed + */ + reason?: 'APPROVAL_REQUIRED' | 'ASSET_CONFIRMATION' | 'FORMAT_CLARIFICATION'; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted sync_creatives + */ +export type SyncCreativesAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Response for completed or failed sync_catalogs */ -export type SyncCatalogsResponse = AdCPVersionEnvelope & - ProtocolEnvelope & {} & (SyncCatalogsSuccess | SyncCatalogsError | SyncCatalogsSubmitted); +export type SyncCatalogsResponse = ProtocolEnvelope & {} & ( + | SyncCatalogsSuccess + | SyncCatalogsError + | SyncCatalogsSubmitted + ); /** * Seller acknowledgement for one buyer-authored catalog item availability update. */ @@ -23820,6 +24250,74 @@ export type CatalogItemAvailabilityState = { */ export type SyncCatalogsError = { }; +/** + * Async task envelope returned when a catalog-only sync cannot be confirmed before the response — for example, when catalog ingestion and deduplication are queued for batch processing. A request containing item_availability_updates or item_availability_queries MUST NOT return this branch because availability operations are synchronous; mixed requests whose catalog work cannot finish synchronously and atomically fail before mutation and are retried as separate calls. For catalog-only requests, the buyer invokes get_task_status with task_id or receives a webhook when the task completes; the per-catalog results land in the terminal result, not this envelope. + */ +export type SyncCatalogsSubmitted = TaskSubmitted; +/** + * Progress data for working sync_catalogs + */ +export type SyncCatalogsAsyncWorking = ProtocolEnvelope & + TaskWorking & { + /** + * Completion percentage (0-100) + */ + percentage?: number; + /** + * Current step or phase of the operation (e.g., 'Fetching product feed', 'Validating items', 'Platform review') + */ + current_step?: string; + /** + * Total number of steps in the operation + */ + total_steps?: number; + /** + * Current step number + */ + step_number?: number; + /** + * Number of catalogs processed so far + */ + catalogs_processed?: number; + /** + * Total number of catalogs to process + */ + catalogs_total?: number; + /** + * Total number of catalog items processed across all catalogs + */ + items_processed?: number; + /** + * Total number of catalog items to process across all catalogs + */ + items_total?: number; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Input requirements for sync_catalogs needing buyer input + */ +export type SyncCatalogsAsyncInputRequired = ProtocolEnvelope & + TaskInputRequired & { + /** + * Reason code indicating why buyer input is needed. APPROVAL_REQUIRED: platform requires explicit approval before activating the catalog. FEED_VALIDATION: feed URL returned unexpected format or schema errors. ITEM_REVIEW: platform flagged items for manual review. FEED_ACCESS: platform cannot access the feed URL (authentication, CORS, etc.). + */ + reason?: 'APPROVAL_REQUIRED' | 'FEED_VALIDATION' | 'ITEM_REVIEW' | 'FEED_ACCESS'; + context?: ContextObject; + ext?: ExtensionObject; + }; +/** + * Acknowledgment for submitted sync_catalogs + */ +export type SyncCatalogsAsyncSubmitted = ProtocolEnvelope & + TaskSubmitted & { + /** + * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. + */ + errors?: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + }; /** * Standard envelope for AdCP application-layer HTTP push notifications. This defines the wire format sent to the URL configured in task input `push_notification_config`, including when that task was invoked through the AdCP A2A profile. It is distinct from A2A transport notifications registered through `configuration.taskPushNotificationConfig`, which use native StreamResponse branches. @@ -23843,10 +24341,7 @@ export interface MCPWebhookPayload { * 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. */ operation_id: string; - /** - * Unique identifier for this task. Use this to correlate webhook notifications with the original task submission. - */ - task_id: string; + task_id: TaskID; task_type: TaskType; protocol?: AdCPProtocol; status: TaskStatus; @@ -23855,10 +24350,7 @@ export interface MCPWebhookPayload { * @format date-time */ timestamp: string; - /** - * Human-readable summary of the current task state. Provides context about what happened and what action may be needed. - */ - message?: string; + message?: TaskMessage; /** * Compatibility metadata copied from the originating response when present. This value alone is not continuation authority and MUST NOT be used to resume input-required or auth-required work or to select session state. */ @@ -23872,7 +24364,7 @@ export interface MCPWebhookPayload { result?: AdCPAsyncResponseData; } /** - * Release-precision AdCP protocol version negotiation fields. Composed via `allOf` into AdCP request schemas and shared response components so the version semantics live in one place. Strict (`additionalProperties: false`) request schemas also redeclare these two fields in their own `properties` via `$ref`, because draft-07 does not evaluate properties across `allOf`. The Trusted Match match requests are the exception: they inline both fields for their strict privacy boundary. Distinct from `core/protocol-envelope.json`, which wraps responses at the transport layer (context_id / task_id / status / payload). This envelope is part of the payload itself. + * Release-precision AdCP protocol version negotiation fields, defined once. Request schemas compose this envelope directly through `allOf`. Strict (`additionalProperties: false`) request schemas also redeclare these two fields in their own `properties` via `$ref`, because draft-07 does not evaluate properties across `allOf`. The Trusted Match match requests are the exception: they inline both fields for their strict privacy boundary. On a request, these fields are part of the request payload: the buyer's version pin. Responses do not compose this envelope directly. `core/protocol-envelope.json` composes it, so on a response `adcp_version` and `adcp_major_version` are envelope fields that the server framework stamps beside `status`, `task_id` and the other protocol-layer fields, not task body data. */ export interface AdCPVersionEnvelope { /** @@ -23885,48 +24377,6 @@ export interface AdCPVersionEnvelope { */ adcp_major_version?: number; } -/** - * Canonical envelope field-set for AdCP task responses, normalized across transports. Defines the protocol-layer fields (status, context_id, context, task_id, timestamp, replayed, adcp_error, push_notification_config, governance_context) and the conceptual `payload` grouping for task-specific response data. The serialization rules — whether envelope fields appear as siblings of payload fields, as a nested `payload` object, or via transport-native containers — are transport-specific and normative per transport (see Transport serialization below). The `status` field is REQUIRED on every task response envelope, including synchronous metadata responses (e.g., `get_adcp_capabilities`) where the value is `completed`. Agents shipping responses without a top-level `status` are non-conformant regardless of whether the task body schema would otherwise validate. - */ -export interface ProtocolEnvelope { - /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). - */ - context_id?: string; - context?: ContextObject; - /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. - */ - task_id?: string; - status: TaskStatus; - /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. - */ - message?: string; - /** - * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. - */ - timestamp?: string; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - adcp_error?: Error; - push_notification_config?: PushNotificationConfig; - /** - * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. - * - * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. - * - * This is the primary correlation key for audit and reporting across the governance lifecycle. - */ - governance_context?: string; - /** - * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. - */ - payload?: { - }; -} /** * A recurring inventory container — a named program, publication, event series, rotation, or programmed channel that produces bookable installments on a defined cadence. The kind field indicates how to interpret this collection: 'series' for TV/podcast programs, 'publication' for print/newsletter titles, 'event_series' for live events, 'rotation' for DOOH scheduling, and 'channel' for continuously programmed audio or video streams regardless of carriage or monetization model. Declared in the publisher's adagents.json and referenced by products via collection selectors. Selling agents may also return copies in product and proposal responses (core/response-collection.json); adagents.json remains the authorization source. */ @@ -24270,73 +24720,23 @@ export interface ProductExecutionReadiness { ext?: ExtensionObject; } /** - * Progress data for working get_products + * The status of a working task payload: status is working. Every working response body composes this schema through allOf, so the status the body describes is pinned in one place. */ -export interface GetProductsAsyncWorking { - /** - * Progress percentage of the search operation - */ - percentage?: number; - /** - * Current step in the search process (e.g., 'searching_inventory', 'validating_availability') - */ - current_step?: string; - /** - * Total number of steps in the search process - */ - total_steps?: number; - /** - * Current step number (1-indexed) - */ - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; +export interface TaskWorking { + status: 'working'; } /** - * Input requirements for get_products needing clarification + * The status of a input-required task payload: status is input-required. Every input-required response body composes this schema through allOf, so the status the body describes is pinned in one place. */ -export interface GetProductsAsyncInputRequired { - /** - * Reason code indicating why input is needed - */ - reason?: 'CLARIFICATION_NEEDED' | 'BUDGET_REQUIRED'; - /** - * Partial product results that may help inform the clarification - */ - partial_results?: Product[]; - /** - * Suggested values or options for the required input - */ - suggestions?: string[]; - context?: ContextObject; - ext?: ExtensionObject; +export interface TaskInputRequired { + status: 'input-required'; } /** - * Acknowledgment for submitted get_products (custom curation) + * The submitted task acknowledgement: status is submitted and task_id identifies the task the caller polls and webhooks reference. Every submitted response body and branch composes this schema through allOf, so the rule lives in one place. */ -export interface GetProductsAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose products array is issued in-line. See task-status.json for the full task-status enum. - */ +export interface TaskSubmitted { status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The products array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Custom curation queued; typical turnaround 10–30 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Estimated completion time for the search - */ - estimated_completion?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; + task_id: TaskID; } /** * The held installment. @@ -24895,20 +25295,6 @@ export interface CommitmentError { errors: [Error, ...Error[]]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; -} -export interface CommitmentSubmitted { - status: 'submitted'; - task_id: string; - message?: string; - /** - * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. - */ - expected_confirmation_at?: string; - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - replayed?: true; } export interface ControlApplied { status: 'completed'; @@ -24933,7 +25319,6 @@ export interface ControlApplied { ]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } export interface ControlError { status: 'failed'; @@ -24943,87 +25328,6 @@ export interface ControlError { errors: [Error, ...Error[]]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; -} -export interface ControlSubmitted { - status: 'submitted'; - task_id: string; - message?: string; - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - replayed?: true; -} -/** - * Working progress for any compact lifecycle task. - */ -export interface CompactTaskWorking { - percentage?: number; - current_step?: string; - total_steps?: number; - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input-required payload for any compact lifecycle task. - */ -export interface CompactTaskInputRequired { - reason?: string; - message?: string; - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working get_signals - */ -export interface GetSignalsAsyncWorking { - /** - * Progress percentage of the signal discovery operation. - */ - percentage?: number; - /** - * Current step in the signal discovery process, such as `querying_providers`, `ranking_signals`, or `checking_deployments`. - */ - current_step?: string; - /** - * Total number of steps in the signal discovery process. - */ - total_steps?: number; - /** - * Current step number (1-indexed). - */ - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted get_signals (semantic discovery) - */ -export interface GetSignalsAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose signals array is issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the caller uses with get_task_status (or the legacy AdCP tasks/get alias), and that the agent references on push-notification callbacks. The signals array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Provider discovery queued; typical turnaround 10-30 minutes.' Plain text only. Callers MUST treat this as untrusted agent input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile agent may inject prompt-injection payloads aimed at the caller's agent. - */ - message?: string; - /** - * Estimated completion time for the signal discovery task. - */ - estimated_completion?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories or partial provider unavailability). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; } /** * Error response - operation failed, no media buy created @@ -25038,98 +25342,6 @@ export interface CreateMediaBuyError { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned when the media buy cannot be confirmed before the response is emitted — for example, when a guaranteed buy requires IO signing, when governance review is outstanding, or when the seller has queued the request for batch processing. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the media_buy_id and packages land in the terminal result, not this envelope. Do not use a 'pending_approval' MediaBuy.status for this case — that value is not in MediaBuyStatus; IO review and similar pre-issuance workflows are modeled at the task layer only. - */ -export interface CreateMediaBuySubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, which uses `media_buy_status` for lifecycle state. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The media_buy_id is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting IO signature from sales team; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. - */ - expected_confirmation_at?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working create_media_buy - */ -export interface CreateMediaBuyAsyncWorking { - /** - * Completion percentage (0-100) - */ - percentage?: number; - /** - * Current step or phase of the operation - */ - current_step?: string; - /** - * Total number of steps in the operation - */ - total_steps?: number; - /** - * Current step number - */ - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input requirements for create_media_buy needing user input - */ -export interface CreateMediaBuyAsyncInputRequired { - /** - * Reason code indicating why input is needed - */ - reason?: 'APPROVAL_REQUIRED' | 'BUDGET_EXCEEDS_LIMIT'; - /** - * Optional validation errors or warnings for debugging purposes. Helps explain why input is required. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted create_media_buy - */ -export interface CreateMediaBuyAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, which carries media-buy lifecycle state in `media_buy_status`. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The media_buy_id is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting IO signature from sales team; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. - */ - expected_confirmation_at?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Success response - media buy updated successfully */ @@ -25227,86 +25439,6 @@ export interface UpdateMediaBuyError { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned when update_media_buy cannot be confirmed before the response — for example, when operator re-approval is required for mid-flight changes. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the updated media buy state lands in the terminal result, not this envelope. - */ -export interface UpdateMediaBuySubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose media_buy_id is issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting operator re-approval; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working update_media_buy - */ -export interface UpdateMediaBuyAsyncWorking { - /** - * Completion percentage (0-100) - */ - percentage?: number; - /** - * Current step or phase of the operation - */ - current_step?: string; - /** - * Total number of steps in the operation - */ - total_steps?: number; - /** - * Current step number - */ - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input requirements for update_media_buy needing user input - */ -export interface UpdateMediaBuyAsyncInputRequired { - /** - * Reason code indicating why input is needed - */ - reason?: 'APPROVAL_REQUIRED' | 'CHANGE_CONFIRMATION'; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted update_media_buy - */ -export interface UpdateMediaBuyAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose media_buy_id is issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting operator re-approval; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Single-capability success response. Returned when the request used target_capability_id (or deprecated target_format_id) without fan-out. The returned creative_manifest uses canonical format_kind on the 3.2 path. */ @@ -25715,29 +25847,6 @@ export interface BuildCreativeError { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned when build_creative cannot be confirmed before the response — for example, when a slow generative pipeline or multi-minute LLM workflow is queued. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creative_manifest(s) land in the terminal result, not this envelope. - */ -export interface BuildCreativeSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shapes, whose creative_manifest or creative_manifests are issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Generative build queued; typical turnaround 3–5 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Single preview response - each preview URL returns an HTML page that can be embedded in an iframe */ @@ -25914,90 +26023,6 @@ export interface PreviewCreativeVariantResponse { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned only when the preview_creative request set allow_async to true and rendering cannot complete inline. The buyer polls get_task_status with task_id; the completed preview response is the task result. - */ -export interface PreviewCreativeSubmitted { - /** - * Preview-response discriminator for the asynchronous arm. - */ - response_type: 'submitted'; - /** - * Discriminates this opt-in async envelope from synchronous preview responses. - */ - status: 'submitted'; - /** - * Task handle used to poll get_task_status for the completed preview response. - */ - task_id: string; - /** - * Optional human-readable explanation of why preview rendering was queued. Plain text only; buyers MUST treat this as untrusted agent input. - */ - message?: string; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working build_creative - */ -export interface BuildCreativeAsyncWorking { - /** - * Completion percentage (0-100) - */ - percentage?: number; - /** - * Current step or phase of the operation (e.g., 'generating_assets', 'resolving_macros', 'rendering_preview') - */ - current_step?: string; - /** - * Total number of steps in the operation - */ - total_steps?: number; - /** - * Current step number - */ - step_number?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input requirements for build_creative needing user input - */ -export interface BuildCreativeAsyncInputRequired { - /** - * Reason code indicating why input is needed - */ - reason?: 'APPROVAL_REQUIRED' | 'CREATIVE_DIRECTION_NEEDED' | 'ASSET_SELECTION_NEEDED'; - /** - * Optional validation errors or warnings explaining why input is required. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted build_creative - */ -export interface BuildCreativeAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shapes, whose creative_manifest or creative_manifests are issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Generative build queued; typical turnaround 3–5 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Terminal success response. In AdCP 3.x evaluation_id is an optional migration field that providers SHOULD emit; it becomes required in AdCP 4.0. When present, it is the provider-side reconciliation identity allocated when the evaluation was accepted and remains stable across exact replays and asynchronous completion. */ @@ -26153,52 +26178,6 @@ export interface GetCreativeFeaturesError { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async acknowledgement returned after the provider accepts an evaluation but cannot complete it within the response window. Exact keyed request replays return this original acknowledgement with replayed: true and the same task_id. In AdCP 3.x providers SHOULD also return evaluation_id; it becomes required in AdCP 4.0. When present, exact replays and terminal results preserve it. The caller polls get_task_status using task_id. - */ -export interface GetCreativeFeaturesSubmitted { - /** - * Task-level status literal that discriminates this acknowledgement from terminal success and error responses. - */ - status: 'submitted'; - /** - * AdCP task handle used to poll get_task_status or correlate terminal webhook delivery. Distinct from evaluation_id. - */ - task_id: string; - /** - * Provider-generated identity allocated when the evaluation is accepted. Optional in AdCP 3.x and required in AdCP 4.0. Providers SHOULD emit it in 3.x; when present, exact replays and the terminal result MUST carry this same value. Distinct from task_id and idempotency_key. - */ - evaluation_id?: string; - /** - * Optional human-readable explanation of why the evaluation is submitted. Plain text only; callers treat it as untrusted provider input. - */ - message?: string; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for an accepted provider creative-feature evaluation - */ -export interface GetCreativeFeaturesAsyncSubmitted { - /** - * Task-level status literal that discriminates this acknowledgement from terminal success and error responses. - */ - status: 'submitted'; - /** - * AdCP task handle used to poll get_task_status or correlate terminal webhook delivery. Distinct from evaluation_id. - */ - task_id: string; - /** - * Provider-generated identity allocated when the evaluation is accepted. Optional in AdCP 3.x and required in AdCP 4.0. Providers SHOULD emit it in 3.x; when present, exact replays and the terminal result MUST carry this same value. Distinct from task_id and idempotency_key. - */ - evaluation_id?: string; - /** - * Optional human-readable explanation of why the evaluation is submitted. Plain text only; callers treat it as untrusted provider input. - */ - message?: string; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Error response - operation failed completely, no creatives were processed */ @@ -26212,94 +26191,6 @@ export interface SyncCreativesError { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned when the whole sync operation cannot be confirmed before the response is emitted — for example, when the seller batches ingestion, when async review must settle before per-item results can be issued, or when governance review gates the sync. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creatives array with per-item action/status lands in the terminal result, not this envelope. Per-item async review (an item in pending_review while the rest of the sync resolves synchronously) belongs on the SyncCreativesSuccess branch with status: pending_review, not here. - */ -export interface SyncCreativesSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose creatives array carries per-item approval state via CreativeStatus. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The creatives array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Batch ingestion queued; typical turnaround 15-30 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working sync_creatives - */ -export interface SyncCreativesAsyncWorking { - /** - * Completion percentage (0-100) - */ - percentage?: number; - /** - * Current step or phase of the operation - */ - current_step?: string; - /** - * Total number of steps in the operation - */ - total_steps?: number; - /** - * Current step number - */ - step_number?: number; - /** - * Number of creatives processed so far - */ - creatives_processed?: number; - /** - * Total number of creatives to process - */ - creatives_total?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input requirements for sync_creatives needing user input - */ -export interface SyncCreativesAsyncInputRequired { - /** - * Reason code indicating why buyer input is needed - */ - reason?: 'APPROVAL_REQUIRED' | 'ASSET_CONFIRMATION' | 'FORMAT_CLARIFICATION'; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted sync_creatives - */ -export interface SyncCreativesAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose creatives array carries per-item approval state via CreativeStatus. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The creatives array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Batch ingestion queued; typical turnaround 15-30 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} /** * Success response - sync operation processed catalogs (may include per-catalog failures) */ @@ -26338,102 +26229,6 @@ export interface SyncCatalogsSuccess { context?: ContextObject; ext?: ExtensionObject; } -/** - * Async task envelope returned when a catalog-only sync cannot be confirmed before the response — for example, when catalog ingestion and deduplication are queued for batch processing. A request containing item_availability_updates or item_availability_queries MUST NOT return this branch because availability operations are synchronous; mixed requests whose catalog work cannot finish synchronously and atomically fail before mutation and are retried as separate calls. For catalog-only requests, the buyer invokes get_task_status with task_id or receives a webhook when the task completes; the per-catalog results land in the terminal result, not this envelope. - */ -export interface SyncCatalogsSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose catalogs array is issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Catalog ingestion queued; typical turnaround 5–15 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Progress data for working sync_catalogs - */ -export interface SyncCatalogsAsyncWorking { - /** - * Completion percentage (0-100) - */ - percentage?: number; - /** - * Current step or phase of the operation (e.g., 'Fetching product feed', 'Validating items', 'Platform review') - */ - current_step?: string; - /** - * Total number of steps in the operation - */ - total_steps?: number; - /** - * Current step number - */ - step_number?: number; - /** - * Number of catalogs processed so far - */ - catalogs_processed?: number; - /** - * Total number of catalogs to process - */ - catalogs_total?: number; - /** - * Total number of catalog items processed across all catalogs - */ - items_processed?: number; - /** - * Total number of catalog items to process across all catalogs - */ - items_total?: number; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Input requirements for sync_catalogs needing buyer input - */ -export interface SyncCatalogsAsyncInputRequired { - /** - * Reason code indicating why buyer input is needed. APPROVAL_REQUIRED: platform requires explicit approval before activating the catalog. FEED_VALIDATION: feed URL returned unexpected format or schema errors. ITEM_REVIEW: platform flagged items for manual review. FEED_ACCESS: platform cannot access the feed URL (authentication, CORS, etc.). - */ - reason?: 'APPROVAL_REQUIRED' | 'FEED_VALIDATION' | 'ITEM_REVIEW' | 'FEED_ACCESS'; - context?: ContextObject; - ext?: ExtensionObject; -} -/** - * Acknowledgment for submitted sync_catalogs - */ -export interface SyncCatalogsAsyncSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose catalogs array is issued in-line. See task-status.json for the full task-status enum. - */ - status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Catalog ingestion queued; typical turnaround 5–15 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - */ - message?: string; - /** - * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. - */ - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; -} // GAP SCHEMAS — types not reachable from root schemas or tool definitions @@ -26750,25 +26545,28 @@ export interface AcquireRightsRequest { */ export type AcquireRightsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -26785,15 +26583,6 @@ export type AcquireRightsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (AcquireRightsAcquired | AcquireRightsPendingApproval | AcquireRightsRejected | AcquireRightsError); export interface AcquireRightsAcquired { /** @@ -26986,25 +26775,28 @@ export interface CreativeApprovalRequest { */ export type CreativeApprovalResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -27021,15 +26813,6 @@ export type CreativeApprovalResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (CreativeApproved | CreativeRejected | CreativePendingReview | CreativeApprovalError); export interface CreativeApproved { /** @@ -27153,25 +26936,28 @@ export interface GetBrandIdentityRequest { */ export type GetBrandIdentityResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -27188,15 +26974,6 @@ export type GetBrandIdentityResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (GetBrandIdentitySuccess | GetBrandIdentityError); export interface GetBrandIdentitySuccess { /** @@ -27640,25 +27417,28 @@ export interface GetRightsRequest { */ export type GetRightsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -27675,15 +27455,6 @@ export type GetRightsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (GetRightsSuccess | GetRightsError); export interface GetRightsSuccess { /** @@ -27892,7 +27663,7 @@ export interface SearchBrandsRequest { /** * Brand stubs matching the search query. Each stub carries the public identity tier — enough to evaluate a brand and follow up with get_brand_identity (for full identity) or get_rights (for pricing). Rich authorized data (voice synthesis, high-res assets, tone guidelines) is not included. */ -export type SearchBrandsResponse = AdCPVersionEnvelope & ProtocolEnvelope & (SearchBrandsSuccess | SearchBrandsError); +export type SearchBrandsResponse = ProtocolEnvelope & (SearchBrandsSuccess | SearchBrandsError); export interface SearchBrandsSuccess { /** * Brand stubs matching the query, ranked by relevance @@ -28059,25 +27830,28 @@ export interface UpdateRightsRequest { */ export type UpdateRightsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28094,15 +27868,6 @@ export type UpdateRightsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (UpdateRightsSuccess | UpdateRightsError); export interface UpdateRightsSuccess { /** @@ -28257,25 +28022,28 @@ export interface VerifyTrademarkClaim { */ export type VerifyBrandClaimResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28292,15 +28060,6 @@ export type VerifyBrandClaimResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (VerifyBrandClaimSuccess | VerifyBrandClaimError); export interface VerifyBrandClaimSuccess { /** @@ -28432,25 +28191,28 @@ export interface VerifyBrandClaimsRequestBulk { */ export type VerifyBrandClaimsResponseBulk = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28467,15 +28229,6 @@ export type VerifyBrandClaimsResponseBulk = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (VerifyBrandClaimsSuccess | VerifyBrandClaimsError); /** * One entry in `results[]`. Either a per-claim success (claim_type + status + optional details/context_note) or a per-claim error (error field only). Mirrors the single-target `verify_brand_claim` response success arm shape. @@ -28782,284 +28535,282 @@ export type ComplianceTaskCompletionData = /** * Canonical response contract for get_products, including completed results, terminal failures, wholesale unchanged responses, and the structured GetProductsRejected business outcome. */ -export type GetProductsCompletion = AdCPVersionEnvelope & - ProtocolEnvelope & { - } & { - /** - * Array of matching products - */ - products?: Product[]; - /** - * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. - * - * @minItems 1 - */ - collections?: [ResponseCollection, ...ResponseCollection[]]; - targeting_resolution?: ProductDiscoveryTargetingResolution; - /** - * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. - */ - extensions?: { - }; - /** - * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. - */ - proposals?: Proposal[]; - /** - * Task-specific errors and warnings (e.g., product filtering issues) - */ - errors?: Error[]; - /** - * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. - */ - reason?: string; - /** - * Actionable alternatives available only on the GetProductsRejected arm. - * - * @maxItems 20 - */ - suggestions?: - string[]; - /** - * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. - */ - property_list_applied?: boolean; - /** - * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. - */ - catalog_applied?: boolean; - /** - * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. - */ - refinement_applied?: ( - | { - /** - * Echoes scope 'request' from the corresponding refine entry. - */ - scope: 'request'; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - | { - } - | { - /** - * Echoes scope 'proposal' from the corresponding refine entry. - */ - scope: 'proposal'; - /** - * Echoes proposal_id from the corresponding refine entry. - */ - proposal_id: string; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - )[]; - /** - * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. - * - * @minItems 1 - */ - incomplete?: [ - { +export type GetProductsCompletion = ProtocolEnvelope & { +} & { + /** + * Array of matching products + */ + products?: Product[]; + /** + * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. + * + * @minItems 1 + */ + collections?: [ResponseCollection, ...ResponseCollection[]]; + targeting_resolution?: ProductDiscoveryTargetingResolution; + /** + * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. + */ + extensions?: { + }; + /** + * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. + */ + proposals?: Proposal[]; + /** + * Task-specific errors and warnings (e.g., product filtering issues) + */ + errors?: Error[]; + /** + * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. + */ + reason?: string; + /** + * Actionable alternatives available only on the GetProductsRejected arm. + * + * @maxItems 20 + */ + suggestions?: + string[]; + /** + * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. + */ + property_list_applied?: boolean; + /** + * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. + */ + catalog_applied?: boolean; + /** + * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. + */ + refinement_applied?: ( + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'request' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'request'; /** - * Human-readable explanation of what is missing and why. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - description: string; + status: 'applied' | 'partial' | 'unable'; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. */ - estimated_wait?: Duration; - }, - ...{ + notes?: string; + } + | { + } + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'proposal' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'proposal'; /** - * Human-readable explanation of what is missing and why. + * Echoes proposal_id from the corresponding refine entry. */ - description: string; + proposal_id: string; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - estimated_wait?: Duration; - }[] - ]; - /** - * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. - */ - filter_diagnostics?: { + status: 'applied' | 'partial' | 'unable'; + /** + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. + */ + notes?: string; + } + )[]; + /** + * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. + * + * @minItems 1 + */ + incomplete?: [ + { /** - * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - semantics?: 'only' | 'any' | 'approximate'; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. + * Human-readable explanation of what is missing and why. */ - total_candidates?: number; + description: string; /** - * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - excluded_by?: { - [k: string]: - | { - /** - * Number of products excluded by this filter, interpreted per the parent `semantics` field. - */ - count: number; - /** - * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. - */ - values?: (string | {})[]; - /** - * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). - */ - notes?: string; - } - | undefined; - }; - }; - pagination?: PaginationResponse; - /** - * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; - /** - * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. - */ - execution_readiness?: { + estimated_wait?: Duration; + }, + ...{ /** - * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - version: string; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. + * Human-readable explanation of what is missing and why. */ - evaluated_at?: string; + description: string; /** - * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - products: { - [k: string]: ProductExecutionReadiness | undefined; - }; - ext?: ExtensionObject; - }; + estimated_wait?: Duration; + }[] + ]; + /** + * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. + */ + filter_diagnostics?: { /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. */ - cache_scope?: 'public' | 'account'; + semantics?: 'only' | 'any' | 'approximate'; /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. */ - unchanged?: true; + total_candidates?: number; /** - * When true, this response contains simulated data from sandbox mode. + * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). */ - sandbox?: boolean; - context?: ContextObject; - ext?: ExtensionObject; + excluded_by?: { + [k: string]: + | { + /** + * Number of products excluded by this filter, interpreted per the parent `semantics` field. + */ + count: number; + /** + * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. + */ + values?: (string | {})[]; + /** + * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). + */ + notes?: string; + } + | undefined; + }; }; -/** - * Response payload for get_signals task - */ -export type GetSignalsCompletion = AdCPVersionEnvelope & - ProtocolEnvelope & { - /** - * Array of matching signals - */ - signals?: (SignalListing & - SignalDefinitionEnrichment & { - })[]; - /** - * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. - * - * @minItems 1 - */ - signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; - /** - * Task-specific errors and warnings (e.g., signal discovery or pricing issues) - */ - errors?: Error[]; - /** - * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. - * - * @minItems 1 - */ - incomplete?: [ - { - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }, - ...{ - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }[] - ]; - /** - * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; + pagination?: PaginationResponse; + /** + * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. + */ + execution_readiness?: { /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. + * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. */ - cache_scope?: 'public' | 'account'; + version: string; /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. */ - unchanged?: true; - pagination?: PaginationResponse; + evaluated_at?: string; /** - * When true, this response contains simulated data from sandbox mode. + * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. */ - sandbox?: boolean; - context?: ContextObject; + products: { + [k: string]: ProductExecutionReadiness | undefined; + }; ext?: ExtensionObject; }; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; +/** + * Response payload for get_signals task + */ +export type GetSignalsCompletion = ProtocolEnvelope & { + /** + * Array of matching signals + */ + signals?: (SignalListing & + SignalDefinitionEnrichment & { + })[]; + /** + * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. + * + * @minItems 1 + */ + signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; + /** + * Task-specific errors and warnings (e.g., signal discovery or pricing issues) + */ + errors?: Error[]; + /** + * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. + * + * @minItems 1 + */ + incomplete?: [ + { + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }, + ...{ + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }[] + ]; + /** + * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + pagination?: PaginationResponse; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; /** * Success response - media buy created successfully */ @@ -29845,6 +29596,11 @@ export interface AccountAuthorization { * @format date-time */ authorized_at?: string; + /** + * The latest re-grant within the caller's current authorization chain for this account: when authority last resumed after a loss that the re-grant continued, because it came before the previous unauthorized_at plus status_retention_days. Absent while the chain has had no re-grant. A re-grant that starts a new chain sets authorized_at to the re-grant time and leaves this absent. Reporting subscriptions owe withheld periods at this instant plus the offering's delivery_sla, and an unbackfilled gap ends at the first period boundary at or after it. Sellers advertising media_buy.reporting_subscriptions MUST populate it whenever the current chain has a re-grant. + * @format date-time + */ + regranted_at?: string; /** * Convenience flag. When true, the caller is permitted only non-mutating tasks. Sellers MUST reject any mutation from a read-only caller with READ_ONLY_SCOPE. For the AdCP 3.2 product split, read-only permits list_products but rejects request_proposals, refine_proposals, and decline_proposals; a legacy get_products call is permitted only when the seller can guarantee the selected arm is a synchronous side-effect-free read. Sellers MAY omit this field; omission is equivalent to `false`. Callers MUST NOT infer read-only from `allowed_tasks` alone — the seller MUST set this explicitly when it applies. */ @@ -30224,6 +29980,25 @@ export interface AccountRequest { account_id?: string; account?: Account; resolution?: AccountRequestResolution; + /** + * Present when and only when the request resolved as updated and changed billing, billing_entity, or payment_terms: when the new money terms take effect. Delivery before it is invoiced under the previous terms, and delivery from it under the new ones. At or after the instant the request resolved; a seller MAY choose a later instant, such as its next invoice-period boundary. Changes to other attributes take effect when the request resolves. + * @format date-time + */ + effective_at?: string; + /** + * Present when and only when a change request resolved as created, a separate new account: the named account's account-level configurations the new account does not have, so the buyer knows what to set up again. notification_configs, reporting_delivery_configs, reporting_bucket, and governance_agents are the account fields of the same names; creatives, audiences, catalogs, and event_sources are account-scoped libraries synced through their own tasks. [] means every one of them carried over. Principal-level configuration is unaffected: an all_authorized_accounts reporting subscription covers the new account from its authorization, while an account_ids subscription covers it only once the buyer adds it. + * @maxItems 8 + */ + not_carried_over?: ( + | 'notification_configs' + | 'reporting_delivery_configs' + | 'reporting_bucket' + | 'governance_agents' + | 'creatives' + | 'audiences' + | 'catalogs' + | 'event_sources' + )[]; /** * Present when state is ambiguous. Accounts that match the request, limited to accounts the caller is already granted. The seller MUST NOT list accounts the caller cannot already reach. When the only matches are outside the caller's grants, every caller-visible state, pending-action kind, and error MUST be one the seller could also return when nothing matches. * @maxItems 50 @@ -32535,6 +32310,32 @@ export interface CreativeRepresentationSet { provenance?: Provenance; } +// core/creative-staged-update.json +/** + * A change to a live creative that the seller accepted in staged mode and has not yet promoted. The creative's approved prior version keeps serving under the same creative_id until the seller promotes this update. A creative has at most one staged update; a later staged sync with different content supersedes it, a sync of the same staged content leaves it and its review unchanged, and a sync whose content equals the serving version withdraws it. Once promoted, the staged content and revision_id become the creative's current state and this object is removed. + */ +export interface CreativeStagedUpdate { + /** + * Review state of the staged update. rejected appears only when the seller's on_rejection is keeps_prior; the prior version keeps serving until the buyer supersedes or withdraws the update. + */ + status: 'processing' | 'pending_review' | 'rejected'; + revision_id?: CreativeRevisionID; + /** + * Kinds of change the staged update makes relative to the serving version. + */ + change_kinds: CreativeChangeKind[]; + /** + * When the seller accepted the staged update. + * @format date-time + */ + staged_at: string; + /** + * Human-readable reason. Present only when status is rejected. + */ + rejection_reason?: string; +} + + // core/creative-variable.json /** * A dynamic content variable (DCO slot) on a creative. Variables represent content that can change at serve time — headlines, images, product data, etc. @@ -34838,6 +34639,26 @@ export interface KeywordTarget { } +// core/live-update-policy.json +/** + * Which kinds of change a seller applies in place to a live creative, and how the creative serves while each is decided. A creative is live when its status is approved and it has at least one assignment on a package that is not canceled, whose flight has not ended, and whose media buy is not in a terminal state; a paused package still counts. The declaration is a floor (see get_adcp_capabilities creative.live_updates): a kind that is not listed may still be accepted for some creatives, and a sync_creatives dry_run returns the exact outcome of one change. + */ +export interface LiveUpdatePolicy { + /** + * Change kinds applied in place, each with its serving mode. At most one entry per change kind (sellers MUST NOT list a kind twice). An empty array means live creatives are immutable apart from name and tags. + * @maxItems 4 + */ + in_place: { + change: CreativeChangeKind; + serving: LiveUpdateServingMode; + /** + * Only with serving staged; defaults to keeps_prior. keeps_prior: if review rejects the staged update, the prior version keeps serving and the creative's status is unchanged. stops: the creative transitions to rejected and stops serving, with impairments on its media buys. + */ + on_rejection?: 'keeps_prior' | 'stops'; + }[]; +} + + // core/macro-resolution-result.json /** * Path-addressable preflight result for one declaration. `resolvable` means the selected execution path advertises the exact operation; it does not claim that serve-time substitution has already occurred. @@ -36258,17 +36079,16 @@ export type ReportingSubscriptionState = { */ accepted_at: string; /** - * Earlier versions, newest first, retained while any obligation of that version is retained, so a buyer can recompute their expected periods after local-state loss. Each entry carries the configuration that version had. + * Earlier versions, newest first, retained while any obligation of that version is retained, so a buyer can recompute their expected periods after local-state loss. Each entry carries the configuration that version had. At most the 16 newest are listed inline; prior_versions_count gives the total, and the rest are read through get_principal reporting_subscription_page. + * + * @maxItems 16 */ - prior_versions?: { - subscription_version: number; - accepted_at: string; - /** - * The next version's accepted_at, the cutover instant: this version owes its periods that start before it, in full. - */ - superseded_at: string; - configuration?: ReportingSubscription; - }[]; + prior_versions?: + ReportingSubscriptionPriorVersion[]; + /** + * Total retained prior versions. Present whenever prior_versions is. When larger than the number listed inline, page the rest through get_principal reporting_subscription_page with list prior_versions. + */ + prior_versions_count?: number; /** * When active false was applied. Present when and only when state is inactive. */ @@ -36301,60 +36121,51 @@ export type ReportingSubscriptionState = { issues?: Error[]; /** - * Accounts where this subscription has an open get_reporting_status exception, so a caller need not poll every account. Changes fire principal.changed with reason reporting_subscription_changed. + * Accounts where this subscription has an open get_reporting_status exception, so a caller need not poll every account, in account_id byte order. At most 1000 are listed inline; accounts_with_exceptions_count gives the total, and the rest are read through get_principal reporting_subscription_page. Changes fire principal.changed with reason reporting_subscription_changed. * * @maxItems 1000 */ - accounts_with_exceptions?: { - account_id: string; - /** - * Reasons of the open exceptions, account- or buy-level. - * - * @minItems 1 - */ - reasons: [ - 'offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required', - ...('offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required')[] - ]; + accounts_with_exceptions?: ReportingSubscriptionAccountExceptions[]; + /** + * Total accounts with an open exception. Present whenever accounts_with_exceptions is. + */ + accounts_with_exceptions_count?: number; + /** + * Total accounts in accounts_unauthorized. Present whenever accounts_unauthorized is. + */ + accounts_unauthorized_count?: number; + /** + * Destination generation bound for each destination_overrides destination_id. Present when and only when the configuration has destination_overrides. + * + * @maxItems 64 + */ + destination_override_refs?: { + destination_id: string; + destination_ref: string; }[]; /** - * Accounts this subscription covered whose authority the caller has since lost, so a revoked grant reads differently from a seller that stopped publishing. Only accounts the subscription previously covered appear. Entries carry no current account data and nothing created after unauthorized_at. An entry is removed on re-grant and is otherwise retained for status_retention_days after unauthorized_at; after that it drops, and a later re-grant is a fresh coverage start from authorized_at with no gap claimed. Every addition or removal fires principal.changed with reason reporting_subscription_changed. + * Accounts this subscription covered whose authority the caller has since lost, in account_id byte order, so a revoked grant reads differently from a seller that stopped publishing. At most 1000 are listed inline; accounts_unauthorized_count gives the total, and the rest are read through get_principal reporting_subscription_page. Only accounts the subscription previously covered appear. Entries carry no current account data and nothing created after unauthorized_at. An entry is removed on re-grant and is otherwise retained for status_retention_days after unauthorized_at; after that it drops, and a later re-grant is a fresh coverage start from authorized_at with no gap claimed. Every addition or removal fires principal.changed with reason reporting_subscription_changed. * * @maxItems 1000 */ - accounts_unauthorized?: { - account_id: string; - /** - * When the caller's authority for the account ended. Nothing is delivered for periods ending after it, including on retries. - */ - unauthorized_at: string; - /** - * Last period boundary at or before unauthorized_at: the end of the last period owed before authority ended. - */ - last_owed_period_end?: string; - /** - * Owed periods that ended at or before unauthorized_at but were not delivered by then. They are withheld, not missing, and never count as seller delay. If authority returns, they are owed again, due at the re-grant time plus the offering's delivery_sla. - */ - withheld_period_count: number; - /** - * Obligations of the withheld periods, when the seller lists them. - * - * @maxItems 1000 - */ - withheld_reporting_obligation_ids?: string[]; - }[]; + accounts_unauthorized?: ReportingSubscriptionUnauthorizedAccount[]; }; /** * The configuration this version had: its scope, selector, destination, and reconciliation_mode. Sellers MUST include it, so a buyer that lost local state can recompute this version's owed periods. */ export type ReportingSubscription = { +} & { +} & { +} & { +} & { +} & { } & { /** * Caller-selected stable key, unique within the authenticated principal and not equal to any delivery_config_id the caller uses on any account with this seller. Never . or .., because it may appear in a destination path. */ subscription_id: string; /** - * Caller-selected immutable semantic generation, with its own accepted_at. Increment when the selector, reconciliation_mode, destination, scope, exclude_account_ids, or operator_domains change. active and replace_account_configs change in place. Sellers reject a reused version with different semantic content. + * Caller-selected immutable semantic generation, with its own accepted_at. Increment when the selector, reconciliation_mode, destination (including destination_overrides), the scope kind (all_authorized_accounts or account_ids), or operator_domains change. Membership edits, adding or removing account_ids and changing exclude_account_ids, apply in place without a new version (see membership), as do active and replace_account_configs. Sellers reject a reused version with different semantic content. */ subscription_version: number; /** @@ -36412,11 +36223,11 @@ export type ReportingSubscription = { dimensions?: ReportingDimension[]; /** - * exact selects the offering whose dimension set equals dimensions; native dimensions that do not map to the vocabulary count as distinct, so package by device does not equal package. finest selects the single offering with the most mapped dimensions among those including every selector dimension. Ties under exact and finest go to the lowest offering_id in byte order. all selects every offering including every selector dimension, each with its own obligations. Defaults to exact when dimensions is present and finest when it is absent. With match exact and no dimensions, every candidate qualifies and the lowest offering_id wins. Matching reads each offering's standard_dimensions and unmapped_dimensions. Billing subscriptions SHOULD use exact. + * exact selects the offering whose dimension set equals dimensions; native dimensions that do not map to the vocabulary count as distinct, so package by device does not equal package. finest selects the single offering with the most mapped dimensions among those including every selector dimension. Ties under exact and finest go to the lowest offering_id in byte order. all selects every offering including every selector dimension, each with its own obligations. Defaults to exact when dimensions is present and finest when it is absent. With match exact and no dimensions, every candidate qualifies and the lowest offering_id wins. Matching reads each offering's standard_dimensions and unmapped_dimensions. Billing subscriptions MUST use exact with dimensions, so a billing feed's breakdown never depends on which offerings happen to exist. */ match?: 'exact' | 'finest' | 'all'; /** - * IANA timezone override for period boundaries. Only valid when scope.account_ids names exactly one account. An account_timezone offering matches and uses this zone in place of the account's. A utc offering matches only when this is a UTC alias (UTC or Etc/UTC). A source_timezone or fixed billing_cycle offering matches only when its published period_timezone equals this one. A billing_cycle offering whose anchor the buyer configures never matches a subscription, which has no way to supply the anchor. + * IANA timezone override for period boundaries. Only valid when scope.account_ids names exactly one account. An account_timezone offering matches and uses this zone in place of the account's. A utc offering matches only when this is exactly UTC or Etc/UTC; other names that tzdata links to UTC, such as Etc/GMT, GMT, Etc/Universal, or Zulu, do not match. A source_timezone or fixed billing_cycle offering matches only when its published period_timezone equals this one. A billing_cycle offering whose anchor the buyer configures never matches a subscription, which has no way to supply the anchor. */ period_timezone?: string; }; @@ -36438,6 +36249,25 @@ export type ReportingSubscription = { */ path_template?: string; }; + /** + * Per-account routing inside one subscription, so an agency keeps advertisers apart without registering a subscription per destination. Each entry sends the accounts it selects, by account_ids or by operator domain, to its own destination; every other account uses destination. An account_ids entry wins over an operator_domains entry. An account may appear in at most one account_ids entry and an operator domain in at most one operator_domains entry; otherwise the whole request fails with INVALID_REQUEST. Every override destination MUST have the same pattern and transport as destination, so routing never changes which offering resolves. Changing overrides is a destination change and needs a new subscription_version. Requires destination. + * + * @minItems 1 + * @maxItems 64 + */ + destination_overrides?: ({ + } & ( + | { + } + | { + } + ) & + ( + | { + } + | { + } + ))[]; }; /** * Complete principal-scoped standing configuration visible after sync or read. Secrets are never returned. The seller keys this state by its own agent identity and the stable authenticated caller principal. Each section is present when and only when the seller advertises it in principal.supported_sections, so an empty supported array is distinguishable from an unsupported section. @@ -36481,6 +36311,49 @@ export interface PrincipalState { revoked_at?: string; }[]; } +export interface ReportingSubscriptionPriorVersion { + subscription_version: number; + accepted_at: string; + /** + * The next version's accepted_at, the cutover instant: this version owes its periods that start before it, in full. + */ + superseded_at: string; + configuration?: ReportingSubscription; +} +export interface ReportingSubscriptionAccountExceptions { + account_id: string; + /** + * Reasons of the open exceptions, account- or buy-level. + * + * @minItems 1 + */ + reasons: [ + 'offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required', + ...('offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required')[] + ]; +} +export interface ReportingSubscriptionUnauthorizedAccount { + account_id: string; + /** + * When the caller's authority for the account ended. Nothing is delivered for periods ending after it, including on retries. + */ + unauthorized_at: string; + /** + * Last period boundary at or before unauthorized_at: the end of the last period owed before authority ended. + */ + last_owed_period_end?: string; + /** + * Owed periods that ended at or before unauthorized_at but were not delivered by then. They are withheld, not missing, and never count as seller delay. If authority returns, they are owed again, due at the re-grant time plus the offering's delivery_sla. + */ + withheld_period_count: number; + /** + * Obligations of the withheld periods, when the seller lists them. + * + * @maxItems 1000 + */ + withheld_reporting_obligation_ids?: string[]; +} + // core/product-audience-evidence-requirements.json /** @@ -38091,7 +37964,7 @@ export interface AdditionalGoldenVector { // core/reporting-consumer-status.json /** - * One immutable, authenticated consumer statement about whether the required reporting for an expected configuration period could actually be consumed. It is operational status, not measurement data, delivery totals, a billing receipt, or authority to overwrite the seller's obligation/revision ledger. New statements supersede the current statement for the same consumer, configuration generation, report definition, and period while preserving append-only history. + * One immutable, authenticated consumer statement about whether the required reporting for an expected configuration period could actually be consumed. It is operational status, not measurement data, delivery totals, a billing receipt, or authority to overwrite the seller's obligation/revision ledger. New statements supersede the current statement for the same consumer, configuration generation, report definition, offering_id when present, and period while preserving append-only history. */ export interface ReportingConsumerStatus { /** @@ -38102,7 +37975,7 @@ export interface ReportingConsumerStatus { */ reporting_status_id: string; /** - * The authenticated consumer's current status leaf replaced by this statement. It must identify the same account, configuration generation, report definition, and period. + * The authenticated consumer's current status leaf replaced by this statement. It must identify the same account, configuration generation, report definition, offering_id when present, and period. * @minLength 16 * @maxLength 255 * @pattern ^[A-Za-z0-9_.:-]{16,255}$ @@ -38126,6 +37999,13 @@ export interface ReportingConsumerStatus { * @pattern ^[A-Za-z0-9_.:-]{1,255}$ */ report_definition_id: string; + /** + * The resolved offering, for a generation derived from a reporting subscription (media_buy.reporting_subscriptions). Part of the chain identity there, because one subscription version can resolve several offerings that share a report definition and period. Required when the period's obligation carries offering_id, or would carry one when the consumer reports obligation_missing; absent otherwise. + * @minLength 1 + * @maxLength 128 + * @pattern ^[A-Za-z0-9_.:-]{1,128}$ + */ + offering_id?: string; /** * Expected half-open reporting period derived from the accepted configuration generation. This identity works even when the seller omitted the corresponding obligation. */ @@ -38242,6 +38122,14 @@ export type ReportingDeliveryOffering = { */ unmapped_dimensions?: string[]; + /** + * Experimental (media_buy.reporting_subscriptions). When this offering became, or becomes, available. Before it the offering is not a candidate for subscription resolution or configuration. Absent: available since before any retained obligation. + */ + available_from?: string; + /** + * Experimental (media_buy.reporting_subscriptions). When the seller withdrew, or will withdraw, this offering. From it the offering is not a candidate, and subscriptions that resolved it move to their next candidate as a resolution change, a cutover at withdrawn_at, so periods that started before it stay owed under it in full. A withdrawn offering stays in offerings, with withdrawn_at, while any obligation that resolved it is retained, so buyers can still read its schedule. Sellers advertising media_buy.reporting_subscriptions MUST NOT remove an offering from offerings any other way while such an obligation is retained. + */ + withdrawn_at?: string; /** * Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin. */ @@ -38403,7 +38291,7 @@ export interface ReportingDeliveryCapabilities { subscriptions?: { supported: true; /** - * Most accounts one subscription serves. Beyond it the seller excludes accounts with reason capacity, deterministically, and reports which. Absent means no declared limit. + * Most accounts one subscription serves. Admission is sticky and ordered by the account's authorization.authorized_at, then account_id in byte order, the same for every subscription of a principal, and accounts without covered buys count (reporting-subscription.json admission). Waiting accounts carry a capacity exception. Absent means no declared limit. * @minimum 1 * @format int */ @@ -38454,7 +38342,7 @@ export interface ReportingDeliveryCapabilities { */ automated_recovery_window_seconds: number; /** - * Minimum period for which obligation, revision, and materialization metadata remain queryable. Revision content is retained for this period only for the revisions named in reporting-revision.json content_retention; other superseded snapshot revisions MAY be compacted to metadata only. + * Minimum period, in exact 24-hour days (86,400 seconds each, not civil days, wherever it bounds a window such as unauthorized_at plus status_retention_days), for which obligation, revision, and materialization metadata remain queryable. Revision content is retained for this period only for the revisions named in reporting-revision.json content_retention; other superseded snapshot revisions MAY be compacted to metadata only. * @minimum 1 * @format int */ @@ -38962,6 +38850,10 @@ export interface ReportingObligation { */ offering_id?: string; feed_purpose: ReportingFeedPurpose; + /** + * Present, and true, only on a billing stub: the stretch [E, first incoming boundary after E) that a cutover hands to a billing feed whose schedule has no boundary at E (reporting-subscription.json cutover), on a billing reporting subscription or an account-level billing configuration (reporting-delivery-config.json billing_continuity). Its period starts off the schedule's grid and is shorter than one schedule period. It is otherwise an ordinary obligation: expected_at is period.end plus schedule.delivery_sla, and revisions, receipts, and consumer status key on its exact period. Absent on every other obligation. + */ + stub?: true; /** * @minLength 1 * @maxLength 128 @@ -39504,7 +39396,7 @@ export interface ReportingStatusChangedWebhook { // core/reporting-subscription-coverage.json /** - * offering_unsupported: no offering matching the selector is available on this account's or buy's products. capacity: refused for a seller limit such as max_accounts. overridden: the caller's own sync_accounts delivery config, or its own account_ids subscription replacing an all-accounts one, takes this account and feed_purpose. excluded_by_buyer: listed in exclude_account_ids. action_required: the account is not served until pending_action completes; account-level only. + * offering_unsupported: no offering matching the selector is available on this account's or buy's products. capacity: refused for a seller limit such as max_accounts. overridden: the caller's own sync_accounts delivery config, or its own account_ids subscription replacing an all-accounts one, takes this account and feed_purpose; or, at buy level with package_ids, another of its pacing or analytics subscriptions with a lower subscription_id resolved the same offering for those packages. excluded_by_buyer: the buyer took the account out, in place, by listing it in exclude_account_ids or removing it from account_ids, or it joined account_ids after the version's accepted_at (reporting-subscription.json membership). action_required: the account is not served until pending_action completes; account-level only. */ export type ReportingSubscriptionExclusionReason = | 'offering_unsupported' @@ -39528,9 +39420,14 @@ export interface ReportingSubscriptionCoverage { */ subscription_version: number; /** - * Current account-level state. active: no account-level exclusion is in effect; individual buys may still be excluded. excluded: an open account-level entry is in effect and none has reason action_required. action_required: an open account-level entry with reason action_required is in effect and pending_action says what must happen. + * Current account-level state. active: no account-level exclusion is in effect; individual buys may still be excluded. excluded: an open account-level entry is in effect and none has reason action_required. action_required: an open account-level entry with reason action_required is in effect and pending_action says what must happen. inactive: the subscription is deactivated (active false or omitted); periods that started before deactivated_at stay owed, and no later periods are. Takes precedence over the other values. An inactive subscription appears only while it still has retained obligations for this account; after that its entry is omitted. */ - status: 'active' | 'excluded' | 'action_required'; + status: 'active' | 'excluded' | 'action_required' | 'inactive'; + /** + * When the subscription was deactivated. Present when and only when status is inactive. + * @format date-time + */ + deactivated_at?: string; pending_action?: PendingAction; /** * Exceptions that remove periods. An entry without media_buy_id applies to the whole account. Opening or closing one fires principal.changed with reason reporting_subscription_changed. Retained for status_retention_days after until. When the account's covered offerings have different period boundaries, the seller lists one entry per offering_id, each with that offering's cutover instants, as for gaps and timezone_cutovers. @@ -39555,7 +39452,7 @@ export interface ReportingSubscriptionCoverage { */ until?: string; /** - * With media_buy_id and reason offering_unsupported: only these packages lack a matching offering. The buy stays covered for its other packages; these are removed from its coverage rather than its periods. + * With media_buy_id and reason offering_unsupported: only these packages lack a matching offering. With reason overridden: only these packages resolved an offering another subscription of the caller owes. The buy stays covered for its other packages; these are removed from its coverage rather than its periods. */ package_ids?: ReportingPackageID[]; /** @@ -39575,7 +39472,7 @@ export interface ReportingSubscriptionCoverage { }; }[]; /** - * Account timezone changes affecting account_timezone-aligned periods, retained for status_retention_days. A cutover: periods under the old timezone are owed when they start before the change, so they end by effective_at; periods under the new timezone are owed when they start at or after effective_at. Any stretch from effective_at to the first new-timezone boundary is owed under neither. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id; an entry without offering_id applies to every offering on the account. + * Account timezone changes affecting account_timezone-aligned periods, retained for status_retention_days. A cutover: periods under the old timezone are owed when they start before the change, so they end by effective_at; periods under the new timezone are owed when they start at or after effective_at. Any stretch from effective_at to the first new-timezone boundary is owed under neither, except on a billing offering, where it is owed as one stub period [effective_at, first new-timezone boundary) whose obligation carries stub true, so no billable hour goes unreported. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id; an entry without offering_id applies to every offering on the account. */ timezone_cutovers?: { /** @@ -39618,7 +39515,7 @@ export interface ReportingSubscriptionCoverage { */ from: string; /** - * First period boundary at or after the re-grant. + * First period boundary at or after the re-grant, authorization.regranted_at. * @format date-time */ until: string; @@ -40253,10 +40150,7 @@ export interface OfferingAssetConstraint { * Protocol-level response wrapper (MCP/A2A) - contains AdCP task data plus protocol fields */ export interface ProtocolResponse { - /** - * Human-readable summary - */ - message: string; + message: TaskMessage; /** * Transport-managed conversation identifier. Maps to native contextId on A2A; compatibility metadata only on MCP and not a continuation or authorization mechanism. */ @@ -40850,10 +40744,7 @@ export interface TasksGetRequest { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; - /** - * Unique identifier of the task to retrieve - */ - task_id: string; + task_id: TaskID; account?: AccountReference; /** * Include full conversation history for this task (may increase response size) @@ -40873,25 +40764,28 @@ export interface TasksGetRequest { */ export interface TasksGetResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for this task + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -40908,15 +40802,6 @@ export interface TasksGetResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; task_type: TaskType; protocol: AdCPProtocol; /** @@ -41075,7 +40960,7 @@ export interface TasksListRequest { * Filter by specific task IDs * @maxItems 100 */ - task_ids?: string[]; + task_ids?: TaskID[]; /** * Filter tasks where context contains this text (searches media_buy_id, signal_id, etc.) */ @@ -41110,25 +40995,28 @@ export interface TasksListRequest { */ export interface TasksListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -41145,15 +41033,6 @@ export interface TasksListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Summary of the query that was executed */ @@ -41219,10 +41098,7 @@ export interface TasksListResponse { * Array of tasks matching the query criteria */ tasks: { - /** - * Unique identifier for this task - */ - task_id: string; + task_id: TaskID; task_type: TaskType; /** * AdCP domain this task belongs to @@ -42296,6 +42172,72 @@ export interface CreativePurgedWebhook { ext?: ExtensionObject; } +// creative/creative-staged-update-changed-webhook.json +/** + * Experimental (creative.live_updates) account-level push notification fired when review decides a staged update to a live creative: the seller promoted it, or rejected it. Fires per registered subscriber against each `notification_configs[]` entry whose `event_types` includes `creative.staged_update_changed`, and only to those entries; a subscriber that did not ask for it never receives it. Distinct from `creative.status_changed` because a staged update does not move the creative through the status lifecycle: the approved prior version keeps serving, so there is no `approved → approved` transition. When a rejection under `on_rejection: stops` also moves the creative to `rejected`, the seller fires that ordinary `approved → rejected` transition on `creative.status_changed` as well. A staged update that the buyer supersedes or withdraws, or that the seller discards because the creative left `approved`, does not fire. Receivers MUST verify signing per the registered scheme and dedupe by `idempotency_key`. The current staged update and serving version are always authoritative on `list_creatives` (request `fields: ["staged_update"]`), which is the repair path for a missed or out-of-order fire. + */ +export interface CreativeStagedUpdateChangedWebhook { + /** + * Sender-generated key stable across retries of the same fire. Receivers MUST dedupe by this key, scoped to the authenticated sender identity. Distinct from `notification_id`. + * @minLength 16 + * @maxLength 255 + * @pattern ^[A-Za-z0-9_.:-]{16,255}$ + */ + idempotency_key: string; + /** + * Stable identifier for this logical outcome, used to correlate fires to current snapshot state. Stable across re-emissions of the same outcome; a later outcome on the same creative receives a new id. + * @minLength 1 + * @maxLength 255 + * @pattern ^[A-Za-z0-9_.:-]{1,255}$ + */ + notification_id: string; + /** + * Fixed notification type discriminator. Matches the value registered on the subscriber's `event_types`. + */ + notification_type: 'creative.staged_update_changed'; + /** + * ISO 8601 timestamp when the seller initiated this fire. Distinct from `observed_at`. + * @format date-time + */ + fired_at: string; + /** + * Identifies which `notification_configs[]` entry on the recipient account is receiving this fire. Echoed verbatim from the entry's `subscriber_id`. + * @minLength 1 + * @maxLength 64 + * @pattern ^[A-Za-z0-9_.:-]{1,64}$ + */ + subscriber_id: string; + /** + * Seller's identifier for the account this creative belongs to. + */ + account_id: string; + /** + * Seller's identifier for the creative whose staged update was decided. References the same id space as `list_creatives` / `sync_creatives` responses. + */ + creative_id: string; + revision_id?: CreativeRevisionID; + /** + * promoted: the staged content now serves on every assignment and `staged_update` is removed from `list_creatives`. rejected: review rejected the staged content; under `on_rejection: keeps_prior` the prior version keeps serving and `staged_update.status` becomes `rejected`, and under `stops` the creative moves to `rejected` and `staged_update` is removed. + */ + outcome: 'promoted' | 'rejected'; + /** + * Human-readable reason. Present only when `outcome` is `rejected`. Sellers MUST NOT include third-party PII in this field. + * @maxLength 500 + */ + rejection_reason?: string; + creative_status: CreativeStatus; + /** + * ISO 8601 timestamp when the seller observed the review decision. Distinct from `fired_at`, which may lag it. + * @format date-time + */ + observed_at: string; + /** + * Who made the decision. `seller`: an explicit review decision. `system`: an automated seller-side review. + */ + initiator: 'seller' | 'system'; + ext?: ExtensionObject; +} + // creative/creative-status-changed-webhook.json /** * Account-level push notification fired when a creative in the library transitions status by seller or system initiative. Fires per registered subscriber against each `notification_configs[]` entry whose `event_types` includes `creative.status_changed`. Buyer-initiated transitions (archive, unarchive, resubmit) do NOT fire — those are acknowledged on the `sync_creatives` response path. Receivers MUST verify signing per the registered scheme (RFC 9421 webhook profile by default; legacy Bearer / HMAC-SHA256 when `authentication` was supplied at registration) and dedupe by `idempotency_key`. See docs/protocol/snapshot-and-log.mdx for the snapshot/log duality rules — the current status is always authoritative on `list_creatives`. @@ -42682,6 +42624,22 @@ export interface ConflictDetails { } +// error-details/creative-live-update-unsupported.json +/** + * Typed details for CREATIVE_LIVE_UPDATE_UNSUPPORTED. Names the kinds of change the seller refused on a live creative and the packages that make it live, so the buyer can sync the change as a new creative_id and replace it on those packages. + */ +export interface CreativeLiveUpdateUnsupportedDetails { + /** + * Change kinds in the item that the seller does not apply in place to this live creative. + */ + refused_changes: CreativeChangeKind[]; + /** + * Packages in the caller's account on which the creative is live. These are the packages on which to replace it. + */ + live_package_ids?: string[]; +} + + // error-details/creative-merge-rejected.json /** * Typed details for CREATIVE_MERGE_REJECTED. Lists every merge assignment operation the seller rejected in the request, with a reason, so the buyer can correct or drop those merges and resubmit the rest in one request. @@ -45751,25 +45709,28 @@ export type TargetingKvs = { */ export interface ContextMatchResponseRouterPublisher { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -45786,15 +45747,6 @@ export interface ContextMatchResponseRouterPublisher { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Message type discriminator for deserialization. */ @@ -46043,24 +45995,27 @@ export interface IdentityMatchRequest { */ export interface IdentityMatchResponseRouterPublisher { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -46077,15 +46032,6 @@ export interface IdentityMatchResponseRouterPublisher { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Message type discriminator for deserialization. */ @@ -46146,25 +46092,28 @@ export interface TMPXChunk { */ export interface ContextMatchResponseProviderRouter { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -46181,15 +46130,6 @@ export interface ContextMatchResponseProviderRouter { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Message type discriminator for deserialization. Same const as the router→publisher variant so decoders can key off type before dispatching on hop shape. */ @@ -46227,24 +46167,27 @@ export interface ContextMatchResponseProviderRouter { */ export interface IdentityMatchResponseProviderRouter { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -46261,15 +46204,6 @@ export interface IdentityMatchResponseProviderRouter { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Message type discriminator for deserialization. Same const as the router→publisher variant so publisher-facing decoders can key off type before dispatching on shape. */ diff --git a/src/lib/types/enums.generated.ts b/src/lib/types/enums.generated.ts index c3341defc..154a5de72 100644 --- a/src/lib/types/enums.generated.ts +++ b/src/lib/types/enums.generated.ts @@ -77,6 +77,7 @@ export const CreativeActionValues = ["created", "updated", "unchanged", "failed" export const CreativeActivationMethodValues = ["qr_code", "deep_link", "push_notification", "email", "tune_in", "text_message"] as const; export const CreativeAgentCapabilityValues = ["validation", "assembly", "generation", "preview", "delivery"] as const; export const CreativeApprovalStatusValues = ["pending_review", "approved", "partially_approved", "rejected"] as const; +export const CreativeChangeKindValues = ["click_through", "trackers", "asset_content", "format"] as const; export const CreativeEventReasonCodeValues = ["review_passed", "review_failure", "processing_failure", "seller_rereview", "policy_revocation", "content_drift", "identity_authorization_revoked", "identity_authorization_expired", "source_private", "source_deleted", "takedown_request", "advertiser_request", "seller_archive", "account_closed", "account_suspended", "retention_expired", "legal_erasure"] as const; export const CreativeIdentifierTypeValues = ["ad_id", "isci", "clearcast_clock", "idcrea"] as const; export const CreativeMergeRejectionReasonValues = ["content_mismatch", "format_mismatch", "not_on_package", "not_supported"] as const; @@ -109,7 +110,7 @@ export const DistanceUnitValues = ["km", "mi", "m"] as const; export const DistributionIdentifierTypeValues = ["apple_podcast_id", "spotify_collection_id", "rss_url", "podcast_guid", "amazon_music_id", "iheart_id", "podcast_index_id", "youtube_channel_id", "youtube_channel_handle", "youtube_channel_url", "youtube_playlist_id", "amazon_title_id", "platform_channel_id", "roku_channel_id", "pluto_channel_id", "tubi_id", "peacock_id", "tiktok_id", "twitch_channel", "imdb_id", "gracenote_id", "eidr_id", "domain", "substack_id"] as const; export const DOOHMotionTypeValues = ["full_motion", "partial_motion", "static"] as const; export const EmbeddedProvenanceMethodValues = ["manifest_wrapper", "provenance_markers"] as const; -export const ErrorCodeValues = ["INVALID_REQUEST", "AUTH_REQUIRED", "AUTH_MISSING", "AUTH_INVALID", "AUTHORIZATION_REQUIRED", "RATE_LIMITED", "SERVICE_UNAVAILABLE", "CONFIGURATION_ERROR", "POLICY_VIOLATION", "PRODUCT_NOT_FOUND", "PRODUCT_UNAVAILABLE", "PROPOSAL_EXPIRED", "BUDGET_TOO_LOW", "CREATIVE_REJECTED", "CREATIVE_SIZE_MISMATCH", "CREATIVE_MISSING_CLICK_URL", "CREATIVE_VALIDATION_FAILED_GENERIC", "CREATIVE_LOCALE_NOT_ACCEPTED", "CREATIVE_VALUE_NOT_ALLOWED", "CREATIVE_REVISION_CONTENT_MISMATCH", "CREATIVE_MERGE_REJECTED", "UNSUPPORTED_FEATURE", "UNPRICEABLE_OUTPUT", "UNSUPPORTED_GRANULARITY", "UNSUPPORTED_PROVISIONING", "AUDIENCE_TOO_SMALL", "ACCOUNT_REQUIRED", "ACCOUNT_NOT_FOUND", "ACCOUNT_MOVED", "ACCOUNT_IDENTITY_CONFLICT", "ACCOUNT_SETUP_REQUIRED", "ACCOUNT_AMBIGUOUS", "ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT", "ACCOUNT_PAYMENT_REQUIRED", "ACCOUNT_SUSPENDED", "COMPLIANCE_UNSATISFIED", "GOVERNANCE_DENIED", "BUDGET_EXHAUSTED", "BUDGET_EXCEEDED", "BUDGET_CAP_REACHED", "CONFLICT", "COMMITTED_RESOURCE_PURGED", "IDEMPOTENCY_CONFLICT", "IDEMPOTENCY_EXPIRED", "IDEMPOTENCY_IN_FLIGHT", "CURSOR_EXPIRED", "CREATIVE_DEADLINE_EXCEEDED", "CREATIVE_INACCESSIBLE", "INVALID_STATE", "MEDIA_BUY_NOT_FOUND", "NOT_CANCELLABLE", "PACKAGE_NOT_FOUND", "PLACE_TARGET_UNAVAILABLE", "CREATIVE_NOT_FOUND", "SIGNAL_NOT_FOUND", "SIGNAL_TARGETING_INCOMPATIBLE", "SESSION_NOT_FOUND", "PLAN_NOT_FOUND", "REFERENCE_NOT_FOUND", "SESSION_TERMINATED", "VALIDATION_ERROR", "PRODUCT_EXPIRED", "PROPOSAL_NOT_COMMITTED", "PROPOSAL_NOT_FOUND", "MULTI_FINALIZE_UNSUPPORTED", "IO_REQUIRED", "TERMS_REJECTED", "BIDDING_PLACEMENT_CONFLICT", "AMBIGUOUS_BIDDING_POLICY", "CONFLICTING_SELECTORS", "REQUOTE_REQUIRED", "VERSION_UNSUPPORTED", "CAMPAIGN_SUSPENDED", "GOVERNANCE_UNAVAILABLE", "GOVERNANCE_AGENT_NOT_ACCEPTED", "PERMISSION_DENIED", "SCOPE_INSUFFICIENT", "READ_ONLY_SCOPE", "FIELD_NOT_PERMITTED", "PROVENANCE_REQUIRED", "PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING", "PROVENANCE_SYNTHETIC_DEPICTION_MISSING", "PROVENANCE_DISCLOSURE_MISSING", "PROVENANCE_EMBEDDED_MISSING", "PROVENANCE_VERIFIER_NOT_ACCEPTED", "PROVENANCE_CLAIM_CONTRADICTED", "EVALUATOR_AGENT_NOT_ACCEPTED", "BILLING_NOT_SUPPORTED", "BILLING_NOT_PERMITTED_FOR_AGENT", "BILLING_OUT_OF_BAND", "PAYMENT_TERMS_NOT_SUPPORTED", "BRAND_REQUIRED", "AGENT_SUSPENDED", "AGENT_BLOCKED", "CREDENTIAL_IN_ARGS", "ACTION_NOT_ALLOWED", "PRIVATE_FIELD_IN_PUBLIC_PLACEMENT", "FORMAT_PROJECTION_FAILED", "FORMAT_DECLARATION_DIVERGENT", "FORMAT_SHAPE_PROMOTED", "FORMAT_DECLARATION_V1_AMBIGUOUS", "FORMAT_OPTION_UNRESOLVED", "FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE", "FORMAT_NOT_SUPPORTED", "PIXEL_TRACKER_LOSSY_DOWNGRADE", "PIXEL_TRACKER_UPGRADE_INFERRED", "STALE_RESPONSE", "FEED_FETCH_FAILED", "SOURCE_ACCESS_FAILED", "INVALID_FEED_FORMAT", "ITEM_VALIDATION_FAILED", "CATALOG_LIMIT_EXCEEDED", "INVALID_PRICING_OPTION", "INVALID_USAGE_DATA", "SIGNED_RESPONSE_ENVELOPE_EXPIRED", "SIGNED_RESPONSE_REQUEST_HASH_MISMATCH", "SIGNED_RESPONSE_TENANT_MISMATCH", "VAST_PARSE_FAILED", "VAST_VERSION_MISMATCH", "VAST_WRAPPER_DEPTH_EXCEEDED", "CREATIVE_REPRESENTATION_UNRESOLVED", "MACRO_RESOLUTION_FAILED", "RIGHTS_CHANNEL_VIOLATION"] as const; +export const ErrorCodeValues = ["INVALID_REQUEST", "AUTH_REQUIRED", "AUTH_MISSING", "AUTH_INVALID", "AUTHORIZATION_REQUIRED", "RATE_LIMITED", "SERVICE_UNAVAILABLE", "CONFIGURATION_ERROR", "POLICY_VIOLATION", "PRODUCT_NOT_FOUND", "PRODUCT_UNAVAILABLE", "PROPOSAL_EXPIRED", "BUDGET_TOO_LOW", "CREATIVE_REJECTED", "CREATIVE_SIZE_MISMATCH", "CREATIVE_MISSING_CLICK_URL", "CREATIVE_VALIDATION_FAILED_GENERIC", "CREATIVE_LOCALE_NOT_ACCEPTED", "CREATIVE_VALUE_NOT_ALLOWED", "CREATIVE_REVISION_CONTENT_MISMATCH", "CREATIVE_MERGE_REJECTED", "CREATIVE_LIVE_UPDATE_UNSUPPORTED", "UNSUPPORTED_FEATURE", "UNPRICEABLE_OUTPUT", "UNSUPPORTED_GRANULARITY", "UNSUPPORTED_PROVISIONING", "AUDIENCE_TOO_SMALL", "ACCOUNT_REQUIRED", "ACCOUNT_NOT_FOUND", "ACCOUNT_MOVED", "ACCOUNT_IDENTITY_CONFLICT", "ACCOUNT_SETUP_REQUIRED", "ACCOUNT_AMBIGUOUS", "ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT", "ACCOUNT_PAYMENT_REQUIRED", "ACCOUNT_SUSPENDED", "COMPLIANCE_UNSATISFIED", "GOVERNANCE_DENIED", "BUDGET_EXHAUSTED", "BUDGET_EXCEEDED", "BUDGET_CAP_REACHED", "CONFLICT", "COMMITTED_RESOURCE_PURGED", "IDEMPOTENCY_CONFLICT", "IDEMPOTENCY_EXPIRED", "IDEMPOTENCY_IN_FLIGHT", "CURSOR_EXPIRED", "CREATIVE_DEADLINE_EXCEEDED", "CREATIVE_INACCESSIBLE", "INVALID_STATE", "MEDIA_BUY_NOT_FOUND", "NOT_CANCELLABLE", "PACKAGE_NOT_FOUND", "PLACE_TARGET_UNAVAILABLE", "CREATIVE_NOT_FOUND", "SIGNAL_NOT_FOUND", "SIGNAL_TARGETING_INCOMPATIBLE", "SESSION_NOT_FOUND", "PLAN_NOT_FOUND", "REFERENCE_NOT_FOUND", "SESSION_TERMINATED", "VALIDATION_ERROR", "PRODUCT_EXPIRED", "PROPOSAL_NOT_COMMITTED", "PROPOSAL_NOT_FOUND", "MULTI_FINALIZE_UNSUPPORTED", "IO_REQUIRED", "TERMS_REJECTED", "BIDDING_PLACEMENT_CONFLICT", "AMBIGUOUS_BIDDING_POLICY", "CONFLICTING_SELECTORS", "REQUOTE_REQUIRED", "VERSION_UNSUPPORTED", "CAMPAIGN_SUSPENDED", "GOVERNANCE_UNAVAILABLE", "GOVERNANCE_AGENT_NOT_ACCEPTED", "PERMISSION_DENIED", "SCOPE_INSUFFICIENT", "READ_ONLY_SCOPE", "FIELD_NOT_PERMITTED", "PROVENANCE_REQUIRED", "PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING", "PROVENANCE_SYNTHETIC_DEPICTION_MISSING", "PROVENANCE_DISCLOSURE_MISSING", "PROVENANCE_EMBEDDED_MISSING", "PROVENANCE_VERIFIER_NOT_ACCEPTED", "PROVENANCE_CLAIM_CONTRADICTED", "EVALUATOR_AGENT_NOT_ACCEPTED", "BILLING_NOT_SUPPORTED", "BILLING_NOT_PERMITTED_FOR_AGENT", "BILLING_OUT_OF_BAND", "PAYMENT_TERMS_NOT_SUPPORTED", "BRAND_REQUIRED", "AGENT_SUSPENDED", "AGENT_BLOCKED", "CREDENTIAL_IN_ARGS", "ACTION_NOT_ALLOWED", "PRIVATE_FIELD_IN_PUBLIC_PLACEMENT", "FORMAT_PROJECTION_FAILED", "FORMAT_DECLARATION_DIVERGENT", "FORMAT_SHAPE_PROMOTED", "FORMAT_DECLARATION_V1_AMBIGUOUS", "FORMAT_OPTION_UNRESOLVED", "FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE", "FORMAT_NOT_SUPPORTED", "PIXEL_TRACKER_LOSSY_DOWNGRADE", "PIXEL_TRACKER_UPGRADE_INFERRED", "STALE_RESPONSE", "FEED_FETCH_FAILED", "SOURCE_ACCESS_FAILED", "INVALID_FEED_FORMAT", "ITEM_VALIDATION_FAILED", "CATALOG_LIMIT_EXCEEDED", "INVALID_PRICING_OPTION", "INVALID_USAGE_DATA", "SIGNED_RESPONSE_ENVELOPE_EXPIRED", "SIGNED_RESPONSE_REQUEST_HASH_MISMATCH", "SIGNED_RESPONSE_TENANT_MISMATCH", "VAST_PARSE_FAILED", "VAST_VERSION_MISMATCH", "VAST_WRAPPER_DEPTH_EXCEEDED", "CREATIVE_REPRESENTATION_UNRESOLVED", "MACRO_RESOLUTION_FAILED", "RIGHTS_CHANNEL_VIOLATION"] as const; export const ErrorScopeValues = ["capability", "account", "agent"] as const; export const EscalationSeverityValues = ["info", "warning", "critical"] as const; export const EventTypeValues = ["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"] as const; @@ -148,6 +149,7 @@ export const LandingPageRequirementValues = ["any", "retailer_site_only", "must_ export const LaterProposalReasonValues = ["delayed_response", "revised_terms", "new_inventory", "event_package", "other"] as const; export const LayerValues = ["behind_creative", "in_front_of_creative"] as const; export const LiftDimensionValues = ["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"] as const; +export const LiveUpdateServingModeValues = ["uninterrupted", "staged", "paused_for_review"] as const; export const LogoSlotValues = ["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"] as const; export const MacroDialectFamilyValues = ["adcp", "iab_vast", "iab_daast", "vendor", "unknown"] as const; export const MacroMappingStatusValues = ["verified_universal", "dialect_defined", "unresolved"] as const; @@ -170,7 +172,7 @@ export const MetricScopeValues = ["standard", "vendor"] as const; export const MetricTypeValues = ["overall_performance", "conversion_rate", "brand_lift", "click_through_rate", "completion_rate", "viewability", "brand_safety", "cost_efficiency"] as const; export const MetroAreaSystemValues = ["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"] as const; export const MoovAtomPositionValues = ["start", "end"] as const; -export const NotificationTypeValues = ["scheduled", "final", "delayed", "adjusted", "window_update", "impairment", "creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "capabilities.changed", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "principal.changed", "proposal.created", "account_request.changed", "proposal.offered"] as const; +export const NotificationTypeValues = ["scheduled", "final", "delayed", "adjusted", "window_update", "impairment", "creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "creative.staged_update_changed", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "capabilities.changed", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "principal.changed", "proposal.created", "account_request.changed", "proposal.offered"] as const; export const OfferingAvailabilityStatusValues = ["available", "limited", "sold_out", "expired", "region_restricted", "inactive"] as const; export const OfferReasonValues = ["installment_postponed", "installment_cancelled", "preemption", "under_delivery", "seller_request"] as const; export const OutcomeTargetCostStrengthValues = ["cap", "target"] as const; diff --git a/src/lib/types/inline-enums.generated.ts b/src/lib/types/inline-enums.generated.ts index 2904730c4..9afbd8e78 100644 --- a/src/lib/types/inline-enums.generated.ts +++ b/src/lib/types/inline-enums.generated.ts @@ -75,6 +75,11 @@ export const AccountNotificationsSupported_EventTypesValues = ["account.status_c /** single | AccountNotificationsSupported.read_task */ export const AccountNotificationsSupported_ReadTaskValues = ["list_accounts"] as const; +// ====== AccountRequest ====== + +/** array of | AccountRequest.not_carried_over */ +export const AccountRequest_NotCarriedOverValues = ["notification_configs", "reporting_delivery_configs", "reporting_bucket", "governance_agents", "creatives", "audiences", "catalogs", "event_sources"] as const; + // ====== AccountRequestChangedWebhook ====== /** single | AccountRequestChangedWebhook.notification_type */ @@ -159,7 +164,7 @@ export const AgenticAdvertisingOrgVerificationTokenClaims_RoleValues = ["media-b // ====== AgentNotificationConfig ====== /** array of | AgentNotificationConfig.event_types */ -export const AgentNotificationConfig_EventTypesValues = ["creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "capabilities.changed", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "principal.changed", "proposal.created", "account_request.changed", "proposal.offered"] as const; +export const AgentNotificationConfig_EventTypesValues = ["creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "creative.staged_update_changed", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "capabilities.changed", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "principal.changed", "proposal.created", "account_request.changed", "proposal.offered"] as const; // ====== AgentPermissionDeniedDetails ====== @@ -328,12 +333,19 @@ export const BudgetChangeConstraints_KindValues = ["budget"] as const; /** single | BuildCreativeAsyncInputRequired.reason */ export const BuildCreativeAsyncInputRequired_ReasonValues = ["APPROVAL_REQUIRED", "CREATIVE_DIRECTION_NEEDED", "ASSET_SELECTION_NEEDED"] as const; +/** single | BuildCreativeAsyncInputRequired.status */ +export const BuildCreativeAsyncInputRequired_StatusValues = ["input-required"] as const; // ====== BuildCreativeAsyncSubmitted ====== /** single | BuildCreativeAsyncSubmitted.status */ export const BuildCreativeAsyncSubmitted_StatusValues = ["submitted"] as const; +// ====== BuildCreativeAsyncWorking ====== + +/** single | BuildCreativeAsyncWorking.status */ +export const BuildCreativeAsyncWorking_StatusValues = ["working"] as const; + // ====== BuildCreativeEstimate ====== /** single | BuildCreativeEstimate.mode */ @@ -700,6 +712,18 @@ export const CreativePurgedWebhook_PurgeKindValues = ["soft", "hard"] as const; /** single | CreativeReviewSLA.clock */ export const CreativeReviewSLA_ClockValues = ["elapsed", "business"] as const; +// ====== CreativeStagedUpdate ====== + +/** single | CreativeStagedUpdate.status */ +export const CreativeStagedUpdate_StatusValues = ["processing", "pending_review", "rejected"] as const; + +// ====== CreativeStagedUpdateChangedWebhook ====== + +/** single | CreativeStagedUpdateChangedWebhook.notification_type */ +export const CreativeStagedUpdateChangedWebhook_NotificationTypeValues = ["creative.staged_update_changed"] as const; +/** single | CreativeStagedUpdateChangedWebhook.outcome */ +export const CreativeStagedUpdateChangedWebhook_OutcomeValues = ["promoted", "rejected"] as const; + // ====== CreativeStatusChangedWebhook ====== /** single | CreativeStatusChangedWebhook.notification_type */ @@ -1138,7 +1162,7 @@ export const ListCreativeFormatsResponse_SourceValues = ["publisher", "aao_mirro /** single | ListCreativesRequest.assignment_projection */ export const ListCreativesRequest_AssignmentProjectionValues = ["all", "matching"] as const; /** array of | ListCreativesRequest.fields */ -export const ListCreativesRequest_FieldsValues = ["creative_id", "name", "format_id", "format_kind", "format_option_ref", "assets", "status", "created_date", "updated_date", "tags", "provenance", "rights", "rights_attestation_evaluations", "localization", "localization_unavailable", "assignments", "snapshot", "items", "variables", "concept", "pricing_options"] as const; +export const ListCreativesRequest_FieldsValues = ["creative_id", "name", "format_id", "format_kind", "format_option_ref", "assets", "status", "created_date", "updated_date", "tags", "provenance", "rights", "rights_attestation_evaluations", "localization", "localization_unavailable", "assignments", "snapshot", "items", "variables", "concept", "pricing_options", "staged_update"] as const; // ====== ListProductsRequest ====== @@ -1218,7 +1242,7 @@ export const NativeInFeedFormatDeclaration_FormatKindValues = ["native_in_feed"] // ====== NotificationConfig ====== /** array of | NotificationConfig.event_types */ -export const NotificationConfig_EventTypesValues = ["creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "proposal.created", "proposal.offered"] as const; +export const NotificationConfig_EventTypesValues = ["creative.status_changed", "creative.assignment_changed", "indicators.changed", "creative.purged", "creative.staged_update_changed", "account.status_changed", "account.change_recorded", "product.created", "product.updated", "product.priced", "product.removed", "signal.created", "signal.updated", "signal.priced", "signal.removed", "wholesale_feed.bulk_change", "collection_card.updated", "collection_card.removed", "collection_catalog.bulk_change", "reporting.delivery_ready", "reporting.status_changed", "reporting.ledger_changed", "proposal.created", "proposal.offered"] as const; /** single | NotificationConfig.product_payload_view */ export const NotificationConfig_ProductPayloadViewValues = ["canonical", "legacy"] as const; @@ -1692,7 +1716,7 @@ export const ReportingStatusIssue_ResponsiblePartyValues = ["buyer", "seller", " // ====== ReportingSubscriptionCoverage ====== /** single | ReportingSubscriptionCoverage.status */ -export const ReportingSubscriptionCoverage_StatusValues = ["active", "excluded", "action_required"] as const; +export const ReportingSubscriptionCoverage_StatusValues = ["active", "excluded", "action_required", "inactive"] as const; // ====== ReportingSubscriptionState ====== @@ -2255,9 +2279,15 @@ export const CleanRoom1_PatternValues = CleanRoom_PatternValues; // --- CommitmentSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, CommitmentSubmitted.status duplicates the canonical export. */ export const CommitmentSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- CompactTaskInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, CompactTaskInputRequired.status duplicates the canonical export. */ +export const CompactTaskInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- CompactTaskSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, CompactTaskSubmitted.status duplicates the canonical export. */ export const CompactTaskSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- CompactTaskWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, CompactTaskWorking.status duplicates the canonical export. */ +export const CompactTaskWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- ContextMatchResponseProviderRouter --- /** @deprecated use `ContextMatchResponse_TypeValues` — same literal set, ContextMatchResponseProviderRouter.type duplicates the canonical export. */ export const ContextMatchResponseProviderRouter_TypeValues = ContextMatchResponse_TypeValues; @@ -2276,9 +2306,15 @@ export const ControlSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusV // --- CPMPricingOption --- /** @deprecated use `CpmPricing_ModelValues` — same literal set, CPMPricingOption.pricing_model duplicates the canonical export. */ export const CPMPricingOption_PricingModelValues = CpmPricing_ModelValues; +// --- CreateMediaBuyAsyncInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, CreateMediaBuyAsyncInputRequired.status duplicates the canonical export. */ +export const CreateMediaBuyAsyncInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- CreateMediaBuyAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, CreateMediaBuyAsyncSubmitted.status duplicates the canonical export. */ export const CreateMediaBuyAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- CreateMediaBuyAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, CreateMediaBuyAsyncWorking.status duplicates the canonical export. */ +export const CreateMediaBuyAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- CreateMediaBuySubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, CreateMediaBuySubmitted.status duplicates the canonical export. */ export const CreateMediaBuySubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; @@ -2294,6 +2330,9 @@ export const CreativeOperationFormatDeclaration_SellerPreferenceValues = Canonic // --- CreativeRejected --- /** @deprecated use `AccountIdentityChangeRejected_StatusValues` — same literal set, CreativeRejected.approval_status duplicates the canonical export. */ export const CreativeRejected_ApprovalStatusValues = AccountIdentityChangeRejected_StatusValues; +// --- CreativeStagedUpdateChangedWebhook --- +/** @deprecated use `CreativePurgedWebhook_InitiatorValues` — same literal set, CreativeStagedUpdateChangedWebhook.initiator duplicates the canonical export. */ +export const CreativeStagedUpdateChangedWebhook_InitiatorValues = CreativePurgedWebhook_InitiatorValues; // --- CreativeStatusChangedWebhook --- /** @deprecated use `CreativePurgedWebhook_InitiatorValues` — same literal set, CreativeStatusChangedWebhook.initiator duplicates the canonical export. */ export const CreativeStatusChangedWebhook_InitiatorValues = CreativePurgedWebhook_InitiatorValues; @@ -2355,9 +2394,15 @@ export const GetCreativeFeaturesComplianceCompletion_StatusValues = CommittedMed // --- GetCreativeFeaturesSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, GetCreativeFeaturesSubmitted.status duplicates the canonical export. */ export const GetCreativeFeaturesSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- GetProductsAsyncInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, GetProductsAsyncInputRequired.status duplicates the canonical export. */ +export const GetProductsAsyncInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- GetProductsAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, GetProductsAsyncSubmitted.status duplicates the canonical export. */ export const GetProductsAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- GetProductsAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, GetProductsAsyncWorking.status duplicates the canonical export. */ +export const GetProductsAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- GetProductsRejected --- /** @deprecated use `AccountIdentityChangeRejected_StatusValues` — same literal set, GetProductsRejected.status duplicates the canonical export. */ export const GetProductsRejected_StatusValues = AccountIdentityChangeRejected_StatusValues; @@ -2370,6 +2415,9 @@ export const GetProductsSubmitted_StatusValues = BuildCreativeAsyncSubmitted_Sta // --- GetSignalsAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, GetSignalsAsyncSubmitted.status duplicates the canonical export. */ export const GetSignalsAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- GetSignalsAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, GetSignalsAsyncWorking.status duplicates the canonical export. */ +export const GetSignalsAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- GetSignalsCompletion --- /** @deprecated use `GetProductsCompletion_CacheScopeValues` — same literal set, GetSignalsCompletion.cache_scope duplicates the canonical export. */ export const GetSignalsCompletion_CacheScopeValues = GetProductsCompletion_CacheScopeValues; @@ -2674,18 +2722,30 @@ export const SLAWindow_ClockValues = CreativeReviewSLA_ClockValues; // --- SyncAudiencesSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, SyncAudiencesSubmitted.status duplicates the canonical export. */ export const SyncAudiencesSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- SyncCatalogsAsyncInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, SyncCatalogsAsyncInputRequired.status duplicates the canonical export. */ +export const SyncCatalogsAsyncInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- SyncCatalogsAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, SyncCatalogsAsyncSubmitted.status duplicates the canonical export. */ export const SyncCatalogsAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- SyncCatalogsAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, SyncCatalogsAsyncWorking.status duplicates the canonical export. */ +export const SyncCatalogsAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- SyncCatalogsSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, SyncCatalogsSubmitted.status duplicates the canonical export. */ export const SyncCatalogsSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; // --- SyncCatalogsSuccess --- /** @deprecated use `CommittedMediaBuy_StatusValues` — same literal set, SyncCatalogsSuccess.status duplicates the canonical export. */ export const SyncCatalogsSuccess_StatusValues = CommittedMediaBuy_StatusValues; +// --- SyncCreativesAsyncInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, SyncCreativesAsyncInputRequired.status duplicates the canonical export. */ +export const SyncCreativesAsyncInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- SyncCreativesAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, SyncCreativesAsyncSubmitted.status duplicates the canonical export. */ export const SyncCreativesAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- SyncCreativesAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, SyncCreativesAsyncWorking.status duplicates the canonical export. */ +export const SyncCreativesAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- SyncCreativesSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, SyncCreativesSubmitted.status duplicates the canonical export. */ export const SyncCreativesSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; @@ -2695,6 +2755,15 @@ export const TagURL_AssetTypeValues = DisplayTagFormatDeclaration_FormatKindValu // --- TargetingSignalGroups --- /** @deprecated use `PackageSignalTargetingGroups_OperatorValues` — same literal set, TargetingSignalGroups.operator duplicates the canonical export. */ export const TargetingSignalGroups_OperatorValues = PackageSignalTargetingGroups_OperatorValues; +// --- TaskInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, TaskInputRequired.status duplicates the canonical export. */ +export const TaskInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; +// --- TaskSubmitted --- +/** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, TaskSubmitted.status duplicates the canonical export. */ +export const TaskSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- TaskWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, TaskWorking.status duplicates the canonical export. */ +export const TaskWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- TextAsset --- /** @deprecated use `GroupTextAsset_AssetTypeValues` — same literal set, TextAsset.asset_type duplicates the canonical export. */ export const TextAsset_AssetTypeValues = GroupTextAsset_AssetTypeValues; @@ -2713,9 +2782,15 @@ export const UnchangedReportingConsumerStatus_ResultValues = UnchangedReportingA // --- UnchangedReportingReceipt --- /** @deprecated use `UnchangedReportingAdjustmentReceipt_ResultValues` — same literal set, UnchangedReportingReceipt.result duplicates the canonical export. */ export const UnchangedReportingReceipt_ResultValues = UnchangedReportingAdjustmentReceipt_ResultValues; +// --- UpdateMediaBuyAsyncInputRequired --- +/** @deprecated use `BuildCreativeAsyncInputRequired_StatusValues` — same literal set, UpdateMediaBuyAsyncInputRequired.status duplicates the canonical export. */ +export const UpdateMediaBuyAsyncInputRequired_StatusValues = BuildCreativeAsyncInputRequired_StatusValues; // --- UpdateMediaBuyAsyncSubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, UpdateMediaBuyAsyncSubmitted.status duplicates the canonical export. */ export const UpdateMediaBuyAsyncSubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; +// --- UpdateMediaBuyAsyncWorking --- +/** @deprecated use `BuildCreativeAsyncWorking_StatusValues` — same literal set, UpdateMediaBuyAsyncWorking.status duplicates the canonical export. */ +export const UpdateMediaBuyAsyncWorking_StatusValues = BuildCreativeAsyncWorking_StatusValues; // --- UpdateMediaBuySubmitted --- /** @deprecated use `BuildCreativeAsyncSubmitted_StatusValues` — same literal set, UpdateMediaBuySubmitted.status duplicates the canonical export. */ export const UpdateMediaBuySubmitted_StatusValues = BuildCreativeAsyncSubmitted_StatusValues; diff --git a/src/lib/types/manifest.generated.ts b/src/lib/types/manifest.generated.ts index f84c91dc2..46ddd62df 100644 --- a/src/lib/types/manifest.generated.ts +++ b/src/lib/types/manifest.generated.ts @@ -1,8 +1,8 @@ -// AUTO-GENERATED FROM schemas/cache/3.3.0-beta.2/manifest.json — DO NOT EDIT. +// AUTO-GENERATED FROM schemas/cache/3.3.0-beta.3/manifest.json — DO NOT EDIT. // Run `npm run generate-manifest-derived` to regenerate. /** - * Manifest-derived constants for AdCP 3.3.0-beta.2. + * Manifest-derived constants for AdCP 3.3.0-beta.3. * * Single source of truth for tool↔protocol grouping, error-code metadata * (description + recovery + suggestion), and specialism→required-tools @@ -12,8 +12,8 @@ * previously lived in `src/lib/utils/capabilities.ts` and * `src/lib/types/error-codes.ts`. * - * Source: `schemas/cache/3.3.0-beta.2/manifest.json` (adcp_version: 3.3.0-beta.2, generated_at: - * 2026-10-30T03:19:48.498Z). Re-run `npm run sync-schemas` then + * Source: `schemas/cache/3.3.0-beta.3/manifest.json` (adcp_version: 3.3.0-beta.3, generated_at: + * 2026-10-31T05:48:46.071Z). Re-run `npm run sync-schemas` then * `npm run generate-manifest-derived` to refresh after a spec bump. */ @@ -223,6 +223,11 @@ export const STANDARD_ERROR_CODES_FROM_MANIFEST = { recovery: "correctable", suggestion: "verify the asset URLs in creative_manifest are reachable without agent-side credentials, then re-submit" }, + "CREATIVE_LIVE_UPDATE_UNSUPPORTED": { + description: "A sync_creatives item changed a live creative in a way the seller does not apply in place under the same creative_id. A creative is live when its status is approved and it has at least one assignment on a package that is not canceled, whose flight has not ended, and whose media buy is not in a terminal state; a paused package still counts. Returned only by sellers that declare creative.live_updates (others keep returning INVALID_STATE). The seller MUST fail only that item, MUST leave the creative, its review state, and its serving unchanged, SHOULD set error.field to the item, and SHOULD return details conforming to error-details/creative-live-update-unsupported.json naming the refused change kinds and the live packages. A dry_run returns the same refusal.", + recovery: "correctable", + suggestion: "sync the change as a new creative_id and swap it in on each live package with an assignment_operations replace; send the change with dry_run to see the exact outcome without applying it" + }, "CREATIVE_LOCALE_NOT_ACCEPTED": { description: "A creative bound to a locale-constrained product format has no materialized variant matching locale_policy.accepted_language_ranges, lacks protocol-declared locale topology, or uses serve_default with a seller-ineligible default variant. Seller ranges use RFC 4647 Basic Filtering and are applied independently for every placement where the assignment may serve, before buyer Lookup, locale_fallbacks, or default selection. Distinct from CREATIVE_REJECTED because this is a mechanically discoverable assignment-eligibility mismatch, not subjective content review. error.field SHOULD point to the offending creative or assignment; error.details SHOULD include format_option_id when present, accepted_language_ranges, available_variant_locales, and placement identity when applicable.", recovery: "correctable", diff --git a/src/lib/types/schemas.generated.ts b/src/lib/types/schemas.generated.ts index 309f41869..c1accca90 100644 --- a/src/lib/types/schemas.generated.ts +++ b/src/lib/types/schemas.generated.ts @@ -1,5 +1,5 @@ // Generated Zod v4 schemas from TypeScript types -// Generated at: 2026-10-30T18:40:13.992Z +// Generated at: 2026-10-31T11:39:54.297Z // Sources: // - core.generated.ts (core types) // - tools.generated.ts (tool types) @@ -157,6 +157,8 @@ export const CreativeAgentCapabilitySchema = /* @__PURE__ */ (() => (z.union([z. export const CreativeApprovalStatusSchema = /* @__PURE__ */ (() => (z.union([z.literal("pending_review"), z.literal("approved"), z.literal("partially_approved"), z.literal("rejected")])))(); +export const CreativeChangeKindSchema = /* @__PURE__ */ (() => (z.union([z.literal("click_through"), z.literal("trackers"), z.literal("asset_content"), z.literal("format")])))(); + export const CreativeEventReasonCodeSchema = /* @__PURE__ */ (() => (z.union([z.literal("review_passed"), z.literal("review_failure"), z.literal("processing_failure"), z.literal("seller_rereview"), z.literal("policy_revocation"), z.literal("content_drift"), z.literal("identity_authorization_revoked"), z.literal("identity_authorization_expired"), z.literal("source_private"), z.literal("source_deleted"), z.literal("takedown_request"), z.literal("advertiser_request"), z.literal("seller_archive"), z.literal("account_closed"), z.literal("account_suspended"), z.literal("retention_expired"), z.literal("legal_erasure")])))(); export const CreativeIdentifierTypeSchema = /* @__PURE__ */ (() => (z.union([z.literal("ad_id"), z.literal("isci"), z.literal("clearcast_clock"), z.literal("idcrea")])))(); @@ -219,7 +221,7 @@ export const DOOHMotionTypeSchema = /* @__PURE__ */ (() => (z.union([z.literal(" export const EmbeddedProvenanceMethodSchema = /* @__PURE__ */ (() => (z.union([z.literal("manifest_wrapper"), z.literal("provenance_markers")])))(); -export const ErrorCodeSchema = /* @__PURE__ */ (() => (z.union([z.literal("INVALID_REQUEST"), z.literal("AUTH_REQUIRED"), z.literal("AUTH_MISSING"), z.literal("AUTH_INVALID"), z.literal("AUTHORIZATION_REQUIRED"), z.literal("RATE_LIMITED"), z.literal("SERVICE_UNAVAILABLE"), z.literal("CONFIGURATION_ERROR"), z.literal("POLICY_VIOLATION"), z.literal("PRODUCT_NOT_FOUND"), z.literal("PRODUCT_UNAVAILABLE"), z.literal("PROPOSAL_EXPIRED"), z.literal("BUDGET_TOO_LOW"), z.literal("CREATIVE_REJECTED"), z.literal("CREATIVE_SIZE_MISMATCH"), z.literal("CREATIVE_MISSING_CLICK_URL"), z.literal("CREATIVE_VALIDATION_FAILED_GENERIC"), z.literal("CREATIVE_LOCALE_NOT_ACCEPTED"), z.literal("CREATIVE_VALUE_NOT_ALLOWED"), z.literal("CREATIVE_REVISION_CONTENT_MISMATCH"), z.literal("CREATIVE_MERGE_REJECTED"), z.literal("UNSUPPORTED_FEATURE"), z.literal("UNPRICEABLE_OUTPUT"), z.literal("UNSUPPORTED_GRANULARITY"), z.literal("UNSUPPORTED_PROVISIONING"), z.literal("AUDIENCE_TOO_SMALL"), z.literal("ACCOUNT_REQUIRED"), z.literal("ACCOUNT_NOT_FOUND"), z.literal("ACCOUNT_MOVED"), z.literal("ACCOUNT_IDENTITY_CONFLICT"), z.literal("ACCOUNT_SETUP_REQUIRED"), z.literal("ACCOUNT_AMBIGUOUS"), z.literal("ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT"), z.literal("ACCOUNT_PAYMENT_REQUIRED"), z.literal("ACCOUNT_SUSPENDED"), z.literal("COMPLIANCE_UNSATISFIED"), z.literal("GOVERNANCE_DENIED"), z.literal("BUDGET_EXHAUSTED"), z.literal("BUDGET_EXCEEDED"), z.literal("BUDGET_CAP_REACHED"), z.literal("CONFLICT"), z.literal("COMMITTED_RESOURCE_PURGED"), z.literal("IDEMPOTENCY_CONFLICT"), z.literal("IDEMPOTENCY_EXPIRED"), z.literal("IDEMPOTENCY_IN_FLIGHT"), z.literal("CURSOR_EXPIRED"), z.literal("CREATIVE_DEADLINE_EXCEEDED"), z.literal("CREATIVE_INACCESSIBLE"), z.literal("INVALID_STATE"), z.literal("MEDIA_BUY_NOT_FOUND"), z.literal("NOT_CANCELLABLE"), z.literal("PACKAGE_NOT_FOUND"), z.literal("PLACE_TARGET_UNAVAILABLE"), z.literal("CREATIVE_NOT_FOUND"), z.literal("SIGNAL_NOT_FOUND"), z.literal("SIGNAL_TARGETING_INCOMPATIBLE"), z.literal("SESSION_NOT_FOUND"), z.literal("PLAN_NOT_FOUND"), z.literal("REFERENCE_NOT_FOUND"), z.literal("SESSION_TERMINATED"), z.literal("VALIDATION_ERROR"), z.literal("PRODUCT_EXPIRED"), z.literal("PROPOSAL_NOT_COMMITTED"), z.literal("PROPOSAL_NOT_FOUND"), z.literal("MULTI_FINALIZE_UNSUPPORTED"), z.literal("IO_REQUIRED"), z.literal("TERMS_REJECTED"), z.literal("BIDDING_PLACEMENT_CONFLICT"), z.literal("AMBIGUOUS_BIDDING_POLICY"), z.literal("CONFLICTING_SELECTORS"), z.literal("REQUOTE_REQUIRED"), z.literal("VERSION_UNSUPPORTED"), z.literal("CAMPAIGN_SUSPENDED"), z.literal("GOVERNANCE_UNAVAILABLE"), z.literal("GOVERNANCE_AGENT_NOT_ACCEPTED"), z.literal("PERMISSION_DENIED"), z.literal("SCOPE_INSUFFICIENT"), z.literal("READ_ONLY_SCOPE"), z.literal("FIELD_NOT_PERMITTED"), z.literal("PROVENANCE_REQUIRED"), z.literal("PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING"), z.literal("PROVENANCE_SYNTHETIC_DEPICTION_MISSING"), z.literal("PROVENANCE_DISCLOSURE_MISSING"), z.literal("PROVENANCE_EMBEDDED_MISSING"), z.literal("PROVENANCE_VERIFIER_NOT_ACCEPTED"), z.literal("PROVENANCE_CLAIM_CONTRADICTED"), z.literal("EVALUATOR_AGENT_NOT_ACCEPTED"), z.literal("BILLING_NOT_SUPPORTED"), z.literal("BILLING_NOT_PERMITTED_FOR_AGENT"), z.literal("BILLING_OUT_OF_BAND"), z.literal("PAYMENT_TERMS_NOT_SUPPORTED"), z.literal("BRAND_REQUIRED"), z.literal("AGENT_SUSPENDED"), z.literal("AGENT_BLOCKED"), z.literal("CREDENTIAL_IN_ARGS"), z.literal("ACTION_NOT_ALLOWED"), z.literal("PRIVATE_FIELD_IN_PUBLIC_PLACEMENT"), z.literal("FORMAT_PROJECTION_FAILED"), z.literal("FORMAT_DECLARATION_DIVERGENT"), z.literal("FORMAT_SHAPE_PROMOTED"), z.literal("FORMAT_DECLARATION_V1_AMBIGUOUS"), z.literal("FORMAT_OPTION_UNRESOLVED"), z.literal("FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE"), z.literal("FORMAT_NOT_SUPPORTED"), z.literal("PIXEL_TRACKER_LOSSY_DOWNGRADE"), z.literal("PIXEL_TRACKER_UPGRADE_INFERRED"), z.literal("STALE_RESPONSE"), z.literal("FEED_FETCH_FAILED"), z.literal("SOURCE_ACCESS_FAILED"), z.literal("INVALID_FEED_FORMAT"), z.literal("ITEM_VALIDATION_FAILED"), z.literal("CATALOG_LIMIT_EXCEEDED"), z.literal("INVALID_PRICING_OPTION"), z.literal("INVALID_USAGE_DATA"), z.literal("SIGNED_RESPONSE_ENVELOPE_EXPIRED"), z.literal("SIGNED_RESPONSE_REQUEST_HASH_MISMATCH"), z.literal("SIGNED_RESPONSE_TENANT_MISMATCH"), z.literal("VAST_PARSE_FAILED"), z.literal("VAST_VERSION_MISMATCH"), z.literal("VAST_WRAPPER_DEPTH_EXCEEDED"), z.literal("CREATIVE_REPRESENTATION_UNRESOLVED"), z.literal("MACRO_RESOLUTION_FAILED"), z.literal("RIGHTS_CHANNEL_VIOLATION")])))(); +export const ErrorCodeSchema = /* @__PURE__ */ (() => (z.union([z.literal("INVALID_REQUEST"), z.literal("AUTH_REQUIRED"), z.literal("AUTH_MISSING"), z.literal("AUTH_INVALID"), z.literal("AUTHORIZATION_REQUIRED"), z.literal("RATE_LIMITED"), z.literal("SERVICE_UNAVAILABLE"), z.literal("CONFIGURATION_ERROR"), z.literal("POLICY_VIOLATION"), z.literal("PRODUCT_NOT_FOUND"), z.literal("PRODUCT_UNAVAILABLE"), z.literal("PROPOSAL_EXPIRED"), z.literal("BUDGET_TOO_LOW"), z.literal("CREATIVE_REJECTED"), z.literal("CREATIVE_SIZE_MISMATCH"), z.literal("CREATIVE_MISSING_CLICK_URL"), z.literal("CREATIVE_VALIDATION_FAILED_GENERIC"), z.literal("CREATIVE_LOCALE_NOT_ACCEPTED"), z.literal("CREATIVE_VALUE_NOT_ALLOWED"), z.literal("CREATIVE_REVISION_CONTENT_MISMATCH"), z.literal("CREATIVE_MERGE_REJECTED"), z.literal("CREATIVE_LIVE_UPDATE_UNSUPPORTED"), z.literal("UNSUPPORTED_FEATURE"), z.literal("UNPRICEABLE_OUTPUT"), z.literal("UNSUPPORTED_GRANULARITY"), z.literal("UNSUPPORTED_PROVISIONING"), z.literal("AUDIENCE_TOO_SMALL"), z.literal("ACCOUNT_REQUIRED"), z.literal("ACCOUNT_NOT_FOUND"), z.literal("ACCOUNT_MOVED"), z.literal("ACCOUNT_IDENTITY_CONFLICT"), z.literal("ACCOUNT_SETUP_REQUIRED"), z.literal("ACCOUNT_AMBIGUOUS"), z.literal("ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT"), z.literal("ACCOUNT_PAYMENT_REQUIRED"), z.literal("ACCOUNT_SUSPENDED"), z.literal("COMPLIANCE_UNSATISFIED"), z.literal("GOVERNANCE_DENIED"), z.literal("BUDGET_EXHAUSTED"), z.literal("BUDGET_EXCEEDED"), z.literal("BUDGET_CAP_REACHED"), z.literal("CONFLICT"), z.literal("COMMITTED_RESOURCE_PURGED"), z.literal("IDEMPOTENCY_CONFLICT"), z.literal("IDEMPOTENCY_EXPIRED"), z.literal("IDEMPOTENCY_IN_FLIGHT"), z.literal("CURSOR_EXPIRED"), z.literal("CREATIVE_DEADLINE_EXCEEDED"), z.literal("CREATIVE_INACCESSIBLE"), z.literal("INVALID_STATE"), z.literal("MEDIA_BUY_NOT_FOUND"), z.literal("NOT_CANCELLABLE"), z.literal("PACKAGE_NOT_FOUND"), z.literal("PLACE_TARGET_UNAVAILABLE"), z.literal("CREATIVE_NOT_FOUND"), z.literal("SIGNAL_NOT_FOUND"), z.literal("SIGNAL_TARGETING_INCOMPATIBLE"), z.literal("SESSION_NOT_FOUND"), z.literal("PLAN_NOT_FOUND"), z.literal("REFERENCE_NOT_FOUND"), z.literal("SESSION_TERMINATED"), z.literal("VALIDATION_ERROR"), z.literal("PRODUCT_EXPIRED"), z.literal("PROPOSAL_NOT_COMMITTED"), z.literal("PROPOSAL_NOT_FOUND"), z.literal("MULTI_FINALIZE_UNSUPPORTED"), z.literal("IO_REQUIRED"), z.literal("TERMS_REJECTED"), z.literal("BIDDING_PLACEMENT_CONFLICT"), z.literal("AMBIGUOUS_BIDDING_POLICY"), z.literal("CONFLICTING_SELECTORS"), z.literal("REQUOTE_REQUIRED"), z.literal("VERSION_UNSUPPORTED"), z.literal("CAMPAIGN_SUSPENDED"), z.literal("GOVERNANCE_UNAVAILABLE"), z.literal("GOVERNANCE_AGENT_NOT_ACCEPTED"), z.literal("PERMISSION_DENIED"), z.literal("SCOPE_INSUFFICIENT"), z.literal("READ_ONLY_SCOPE"), z.literal("FIELD_NOT_PERMITTED"), z.literal("PROVENANCE_REQUIRED"), z.literal("PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING"), z.literal("PROVENANCE_SYNTHETIC_DEPICTION_MISSING"), z.literal("PROVENANCE_DISCLOSURE_MISSING"), z.literal("PROVENANCE_EMBEDDED_MISSING"), z.literal("PROVENANCE_VERIFIER_NOT_ACCEPTED"), z.literal("PROVENANCE_CLAIM_CONTRADICTED"), z.literal("EVALUATOR_AGENT_NOT_ACCEPTED"), z.literal("BILLING_NOT_SUPPORTED"), z.literal("BILLING_NOT_PERMITTED_FOR_AGENT"), z.literal("BILLING_OUT_OF_BAND"), z.literal("PAYMENT_TERMS_NOT_SUPPORTED"), z.literal("BRAND_REQUIRED"), z.literal("AGENT_SUSPENDED"), z.literal("AGENT_BLOCKED"), z.literal("CREDENTIAL_IN_ARGS"), z.literal("ACTION_NOT_ALLOWED"), z.literal("PRIVATE_FIELD_IN_PUBLIC_PLACEMENT"), z.literal("FORMAT_PROJECTION_FAILED"), z.literal("FORMAT_DECLARATION_DIVERGENT"), z.literal("FORMAT_SHAPE_PROMOTED"), z.literal("FORMAT_DECLARATION_V1_AMBIGUOUS"), z.literal("FORMAT_OPTION_UNRESOLVED"), z.literal("FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE"), z.literal("FORMAT_NOT_SUPPORTED"), z.literal("PIXEL_TRACKER_LOSSY_DOWNGRADE"), z.literal("PIXEL_TRACKER_UPGRADE_INFERRED"), z.literal("STALE_RESPONSE"), z.literal("FEED_FETCH_FAILED"), z.literal("SOURCE_ACCESS_FAILED"), z.literal("INVALID_FEED_FORMAT"), z.literal("ITEM_VALIDATION_FAILED"), z.literal("CATALOG_LIMIT_EXCEEDED"), z.literal("INVALID_PRICING_OPTION"), z.literal("INVALID_USAGE_DATA"), z.literal("SIGNED_RESPONSE_ENVELOPE_EXPIRED"), z.literal("SIGNED_RESPONSE_REQUEST_HASH_MISMATCH"), z.literal("SIGNED_RESPONSE_TENANT_MISMATCH"), z.literal("VAST_PARSE_FAILED"), z.literal("VAST_VERSION_MISMATCH"), z.literal("VAST_WRAPPER_DEPTH_EXCEEDED"), z.literal("CREATIVE_REPRESENTATION_UNRESOLVED"), z.literal("MACRO_RESOLUTION_FAILED"), z.literal("RIGHTS_CHANNEL_VIOLATION")])))(); export const ErrorScopeSchema = /* @__PURE__ */ (() => (z.union([z.literal("capability"), z.literal("account"), z.literal("agent")])))(); @@ -293,6 +295,8 @@ export const CountryFusedPostalCodeSystemSchema = /* @__PURE__ */ (() => (z.unio export const LiftDimensionSchema = /* @__PURE__ */ (() => (z.union([z.literal("awareness"), z.literal("consideration"), z.literal("favorability"), z.literal("purchase_intent"), z.literal("ad_recall")])))(); +export const LiveUpdateServingModeSchema = /* @__PURE__ */ (() => (z.union([z.literal("uninterrupted"), z.literal("staged"), z.literal("paused_for_review")])))(); + export const LogoSlotSchema = /* @__PURE__ */ (() => (z.union([z.literal("logo_card_light"), z.literal("logo_card_dark"), z.literal("profile_mark"), z.literal("favicon"), z.literal("app_icon"), z.literal("social_profile_mark"), z.literal("nav_header"), z.literal("footer"), z.literal("email_header"), z.literal("watermark"), z.literal("ad_end_card"), z.literal("co_brand_lockup"), z.literal("marketplace_listing")])))(); export const MacroDialectFamilySchema = /* @__PURE__ */ (() => (z.union([z.literal("adcp"), z.literal("iab_vast"), z.literal("iab_daast"), z.literal("vendor"), z.literal("unknown")])))(); @@ -337,7 +341,7 @@ export const MoovAtomPositionSchema = /* @__PURE__ */ (() => (z.union([z.literal export const CreativeMotionLevelSchema = /* @__PURE__ */ (() => (z.union([z.literal("static"), z.literal("limited_motion"), z.literal("full_motion")])))(); -export const NotificationTypeSchema = /* @__PURE__ */ (() => (z.union([z.literal("scheduled"), z.literal("final"), z.literal("delayed"), z.literal("adjusted"), z.literal("window_update"), z.literal("impairment"), z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("capabilities.changed"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("principal.changed"), z.literal("proposal.created"), z.literal("account_request.changed"), z.literal("proposal.offered")])))(); +export const NotificationTypeSchema = /* @__PURE__ */ (() => (z.union([z.literal("scheduled"), z.literal("final"), z.literal("delayed"), z.literal("adjusted"), z.literal("window_update"), z.literal("impairment"), z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("capabilities.changed"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("principal.changed"), z.literal("proposal.created"), z.literal("account_request.changed"), z.literal("proposal.offered")])))(); export const OfferReasonSchema = /* @__PURE__ */ (() => (z.union([z.literal("installment_postponed"), z.literal("installment_cancelled"), z.literal("preemption"), z.literal("under_delivery"), z.literal("seller_request")])))(); @@ -3149,6 +3153,10 @@ export const DeliveryRecordSchema = /* @__PURE__ */ (() => (z.object({ ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const TaskIDSchema = /* @__PURE__ */ (() => (z.string().min(1)))(); + +export const TaskMessageSchema = /* @__PURE__ */ (() => (z.string().max(2000)))(); + export const ErrorSchema = /* @__PURE__ */ (() => (z.object({ code: z.string().min(1).max(64), message: z.string(), @@ -3257,37 +3265,13 @@ export const LaterProposalsStateSchema = /* @__PURE__ */ (() => (z.object({ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough()))(); -export const DeclineProposalsResponseSchema = /* @__PURE__ */ (() => (z.union([z.object({ - results: z.array(z.union([z.object({ - proposal_id: z.string().min(1), - outcome: z.literal("declined") - }).passthrough(), z.object({ - proposal_id: z.string().min(1), - outcome: z.literal("unable"), - reason: z.string().min(1) - }).passthrough()])), - message: z.string().max(2000).optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() - }).passthrough(), z.object({ - results: z.array(z.union([z.object({ - proposal_id: z.string().min(1), - outcome: z.literal("declined") - }).passthrough(), z.object({ - proposal_id: z.string().min(1), - outcome: z.literal("unable"), - reason: z.string().min(1) - }).passthrough()])).optional(), - status: z.literal("submitted"), - task_id: z.string().min(1), - message: z.string().max(2000).optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() - }).passthrough()])))(); +export const CreativeStagedUpdateSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ + status: z.union([z.literal("processing"), z.literal("pending_review"), z.literal("rejected")]), + revision_id: CreativeRevisionIDSchema.optional(), + change_kinds: nonemptyArray(CreativeChangeKindSchema), + staged_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + rejection_reason: z.string().optional() +}).passthrough())))(); export const MacroResolutionResultSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ declaration_id: z.string().min(1), @@ -3321,7 +3305,7 @@ export const WarningSchema = /* @__PURE__ */ (() => (z.object({}).passthrough(). export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3333,7 +3317,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3345,7 +3329,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3357,7 +3341,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3369,7 +3353,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3381,7 +3365,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3393,7 +3377,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3405,7 +3389,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3417,7 +3401,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3429,7 +3413,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3441,7 +3425,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3453,7 +3437,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3465,7 +3449,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3477,7 +3461,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3489,7 +3473,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -3501,7 +3485,7 @@ export const NotificationConfigSchema = /* @__PURE__ */ (() => (z.object({}).pas }).passthrough()).merge(z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), + event_types: nonemptyArray(z.union([z.literal("creative.status_changed"), z.literal("creative.assignment_changed"), z.literal("indicators.changed"), z.literal("creative.purged"), z.literal("creative.staged_update_changed"), z.literal("account.status_changed"), z.literal("account.change_recorded"), z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change"), z.literal("collection_card.updated"), z.literal("collection_card.removed"), z.literal("collection_catalog.bulk_change"), z.literal("reporting.delivery_ready"), z.literal("reporting.status_changed"), z.literal("reporting.ledger_changed"), z.literal("proposal.created"), z.literal("proposal.offered")])), product_payload_view: z.union([z.literal("canonical"), z.literal("legacy")]).optional(), authentication: z.object({ schemes: z.tuple([AuthenticationSchemeSchema]), @@ -4469,201 +4453,56 @@ export const PropertySchema = /* @__PURE__ */ (() => (z.object({ publisher_domain: z.string().optional() }).passthrough()))(); -export const GetProductsAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const GetProductsAsyncSubmittedSchema = /* @__PURE__ */ (() => (z.object({ - status: z.literal("submitted"), - task_id: z.string(), - message: z.string().optional(), - estimated_completion: z.string().optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const CompactTaskWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().gte(0).lte(100).optional(), - current_step: z.string().max(500).optional(), - total_steps: z.number().int().gte(1).optional(), - step_number: z.number().int().gte(1).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const CompactTaskInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.string().min(1).max(200).optional(), - message: z.string().max(2000).optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const GetSignalsAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const GetSignalsAsyncSubmittedSchema = /* @__PURE__ */ (() => (z.object({ - status: z.literal("submitted"), - task_id: z.string(), - message: z.string().optional(), - estimated_completion: z.string().optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const CreateMediaBuyAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const CreateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("BUDGET_EXCEEDS_LIMIT")]).optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const UpdateMediaBuyAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const UpdateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("CHANGE_CONFIRMATION")]).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const BuildCreativeAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const BuildCreativeAsyncInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("CREATIVE_DIRECTION_NEEDED"), z.literal("ASSET_SELECTION_NEEDED")]).optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const GetCreativeFeaturesAsyncSubmittedSchema = /* @__PURE__ */ (() => (z.object({ - status: z.literal("submitted"), - task_id: z.string(), - evaluation_id: z.string().optional(), - message: z.string().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); - -export const SyncCreativesAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - creatives_processed: z.number().optional(), - creatives_total: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() +export const PaginationResponseSchema = /* @__PURE__ */ (() => (z.object({ + has_more: z.boolean(), + cursor: z.string().optional(), + total_count: z.number().int().gte(0).optional() }).passthrough()))(); -export const SyncCreativesAsyncInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("ASSET_CONFIRMATION"), z.literal("FORMAT_CLARIFICATION")]).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() +export const AdCPVersionEnvelopeSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional() }).passthrough()))(); -export const SyncCatalogsAsyncWorkingSchema = /* @__PURE__ */ (() => (z.object({ - percentage: z.number().optional(), - current_step: z.string().optional(), - total_steps: z.number().optional(), - step_number: z.number().optional(), - catalogs_processed: z.number().optional(), - catalogs_total: z.number().optional(), - items_processed: z.number().optional(), - items_total: z.number().optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() +export const AudienceSizeSchema = /* @__PURE__ */ (() => (z.object({ + lower_bound: z.number().int().gte(0), + upper_bound: z.number().int().gte(0), + precision: AudienceSizePrecisionSchema, + as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough()))(); -export const SyncCatalogsAsyncInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ - reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("FEED_VALIDATION"), z.literal("ITEM_REVIEW"), z.literal("FEED_ACCESS")]).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough()))(); +export const ProductExecutionRequirementSchema = /* @__PURE__ */ (() => (z.union([EventSourceExecutionRequirementSchema, CatalogExecutionRequirementSchema, DownstreamConnectionExecutionRequirementSchema])))(); -export const AdCPVersionEnvelopeSchema = /* @__PURE__ */ (() => (z.object({ - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() -}).passthrough()))(); +export const ExecutionReadinessStatus1Schema = /* @__PURE__ */ (() => (ExecutionReadinessStatusSchema))(); -export const ProtocolEnvelopeSchema = /* @__PURE__ */ (() => (z.object({ +export const ProtocolEnvelopeSchema = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(z.object({ context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional() -}).passthrough()))(); +}).passthrough())))(); -export const PaginationResponseSchema = /* @__PURE__ */ (() => (z.object({ - has_more: z.boolean(), - cursor: z.string().optional(), - total_count: z.number().int().gte(0).optional() +export const TaskWorkingSchema = /* @__PURE__ */ (() => (z.object({ + status: z.literal("working") }).passthrough()))(); -export const AudienceSizeSchema = /* @__PURE__ */ (() => (z.object({ - lower_bound: z.number().int().gte(0), - upper_bound: z.number().int().gte(0), - precision: AudienceSizePrecisionSchema, - as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() +export const TaskInputRequiredSchema = /* @__PURE__ */ (() => (z.object({ + status: z.literal("input-required") }).passthrough()))(); -export const ProductExecutionRequirementSchema = /* @__PURE__ */ (() => (z.union([EventSourceExecutionRequirementSchema, CatalogExecutionRequirementSchema, DownstreamConnectionExecutionRequirementSchema])))(); - -export const ExecutionReadinessStatus1Schema = /* @__PURE__ */ (() => (ExecutionReadinessStatusSchema))(); - -export const GetProductsRejectedSchema = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({ - status: z.literal("rejected"), - reason: z.string().min(1).max(2000), - suggestions: nonemptyArray(z.string()).max(20).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional() -}).passthrough())))(); - -export const CompactTaskSubmittedSchema = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({ +export const TaskSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string().min(1), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema +}).passthrough()))(); + +export const CompactTaskSubmittedSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskSubmittedSchema).merge(z.object({ errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -4946,20 +4785,10 @@ export const CommitmentErrorSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("failed"), errors: nonemptyArray(ErrorSchema), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() + ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const CommitmentSubmittedSchema = /* @__PURE__ */ (() => (z.object({ - status: z.literal("submitted"), - task_id: z.string().min(1), - message: z.string().max(2000).optional(), - expected_confirmation_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - errors: z.array(ErrorSchema).optional(), - context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() -}).passthrough()))(); +export const CommitmentSubmittedSchema = /* @__PURE__ */ (() => (TaskSubmittedSchema))(); export const CanonicalMediaBuyActionFieldsSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ task: z.union([z.literal("control_media_buy"), z.literal("refine_proposals"), z.literal("sync_creatives"), z.literal("report_media_buy_issue")]), @@ -4976,20 +4805,33 @@ export const ControlErrorSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("failed"), errors: nonemptyArray(ErrorSchema), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() + ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const ControlSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string().min(1), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() + ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const CompactTaskWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().gte(0).lte(100).optional(), + current_step: z.string().max(500).optional(), + total_steps: z.number().int().gte(1).optional(), + step_number: z.number().int().gte(1).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const CompactTaskInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.string().min(1).max(200).optional(), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + export const SignalModelingDisclosureSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ required: z.boolean(), jurisdictions: nonemptyArray(z.object({ @@ -5003,47 +4845,95 @@ export const SignalModelingDisclosureSchema = /* @__PURE__ */ (() => (z.object({ notes: z.string().max(2000).optional() }).passthrough())))(); -export const CreateMediaBuyErrorSchema = /* @__PURE__ */ (() => (z.object({ - errors: nonemptyArray(ErrorSchema), +export const GetSignalsAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() -}).passthrough()))(); +}).passthrough())))(); -export const CreateMediaBuySubmittedSchema = /* @__PURE__ */ (() => (z.object({ - status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), - expected_confirmation_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), +export const GetSignalsAsyncSubmittedSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskSubmittedSchema).merge(z.object({ + estimated_completion: z.string().optional(), errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() -}).passthrough()))(); +}).passthrough())))(); -export const UpdateMediaBuyErrorSchema = /* @__PURE__ */ (() => (z.object({ +export const CreateMediaBuyErrorSchema = /* @__PURE__ */ (() => (z.object({ errors: nonemptyArray(ErrorSchema), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const UpdateMediaBuySubmittedSchema = /* @__PURE__ */ (() => (z.object({ +export const CreateMediaBuySubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, + expected_confirmation_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const BuildCreativeErrorSchema = /* @__PURE__ */ (() => (z.object({ - errors: nonemptyArray(ErrorSchema), +export const CreateMediaBuyAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() -}).passthrough()))(); +}).passthrough())))(); -export const BuildCreativeSubmittedSchema = /* @__PURE__ */ (() => (z.object({ +export const CreateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("BUDGET_EXCEEDS_LIMIT")]).optional(), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const CreateMediaBuyAsyncSubmittedSchema = /* @__PURE__ */ (() => (CreateMediaBuySubmittedSchema))(); + +export const UpdateMediaBuyErrorSchema = /* @__PURE__ */ (() => (z.object({ + errors: nonemptyArray(ErrorSchema), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough()))(); + +export const UpdateMediaBuySubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough()))(); + +export const UpdateMediaBuyAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const UpdateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("CHANGE_CONFIRMATION")]).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const UpdateMediaBuyAsyncSubmittedSchema = /* @__PURE__ */ (() => (UpdateMediaBuySubmittedSchema))(); + +export const BuildCreativeErrorSchema = /* @__PURE__ */ (() => (z.object({ + errors: nonemptyArray(ErrorSchema), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough()))(); + +export const BuildCreativeSubmittedSchema = /* @__PURE__ */ (() => (z.object({ + status: z.literal("submitted"), + task_id: TaskIDSchema, errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -5062,14 +4952,31 @@ export const PreviewRendererMetadataSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const PreviewCreativeSubmittedSchema = /* @__PURE__ */ (() => (z.object({ - response_type: z.literal("submitted"), status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, + response_type: z.literal("submitted"), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const BuildCreativeAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const BuildCreativeAsyncInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("CREATIVE_DIRECTION_NEEDED"), z.literal("ASSET_SELECTION_NEEDED")]).optional(), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const BuildCreativeAsyncSubmittedSchema = /* @__PURE__ */ (() => (BuildCreativeSubmittedSchema))(); + export const GetCreativeFeaturesErrorSchema = /* @__PURE__ */ (() => (z.object({ evaluation_id: z.string().min(1).optional(), errors: z.array(ErrorSchema), @@ -5079,13 +4986,18 @@ export const GetCreativeFeaturesErrorSchema = /* @__PURE__ */ (() => (z.object({ export const GetCreativeFeaturesSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string().min(1), + task_id: TaskIDSchema, evaluation_id: z.string().min(1).optional(), - message: z.string().max(2000).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const GetCreativeFeaturesAsyncSubmittedSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskSubmittedSchema).merge(z.object({ + evaluation_id: z.string().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + export const SyncCreativesErrorSchema = /* @__PURE__ */ (() => (z.object({ errors: nonemptyArray(ErrorSchema), context: ContextObjectSchema.optional(), @@ -5094,13 +5006,31 @@ export const SyncCreativesErrorSchema = /* @__PURE__ */ (() => (z.object({ export const SyncCreativesSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const SyncCreativesAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), + creatives_processed: z.number().optional(), + creatives_total: z.number().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const SyncCreativesAsyncInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("ASSET_CONFIRMATION"), z.literal("FORMAT_CLARIFICATION")]).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const SyncCreativesAsyncSubmittedSchema = /* @__PURE__ */ (() => (SyncCreativesSubmittedSchema))(); + export const SyncCatalogsErrorSchema = /* @__PURE__ */ (() => (z.object({ errors: z.array(ErrorSchema), context: ContextObjectSchema.optional(), @@ -5109,8 +5039,7 @@ export const SyncCatalogsErrorSchema = /* @__PURE__ */ (() => (z.object({ export const SyncCatalogsSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -5132,6 +5061,27 @@ export const CatalogItemAvailabilityStateSchema = /* @__PURE__ */ (() => (z.obje ext: ExtensionObjectSchema.optional() }).passthrough())))(); +export const SyncCatalogsAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), + catalogs_processed: z.number().optional(), + catalogs_total: z.number().optional(), + items_processed: z.number().optional(), + items_total: z.number().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const SyncCatalogsAsyncInputRequiredSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ + reason: z.union([z.literal("APPROVAL_REQUIRED"), z.literal("FEED_VALIDATION"), z.literal("ITEM_REVIEW"), z.literal("FEED_ACCESS")]).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const SyncCatalogsAsyncSubmittedSchema = /* @__PURE__ */ (() => (SyncCatalogsSubmittedSchema))(); + export const LimitedSeriesSchema = /* @__PURE__ */ (() => (z.object({ total_installments: z.number().int().gte(1), starts: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), @@ -5271,12 +5221,8 @@ export const CanonicalCollectionReferenceSchema = /* @__PURE__ */ (() => (z.obje export const CanonicalMediaBuyActionSchema = /* @__PURE__ */ (() => (z.union([CanonicalMediaBuyActionFieldsSchema, CanonicalMediaBuyActionFieldsSchema.merge(z.object({}).passthrough())])))(); -export const CreateMediaBuyAsyncSubmittedSchema = /* @__PURE__ */ (() => (CreateMediaBuySubmittedSchema))(); - export const MeasurementTerms1Schema = /* @__PURE__ */ (() => (MeasurementTermsSchema))(); -export const UpdateMediaBuyAsyncSubmittedSchema = /* @__PURE__ */ (() => (UpdateMediaBuySubmittedSchema))(); - export const PreviewRenderSchema = /* @__PURE__ */ (() => (z.union([z.object({ render_id: z.string(), output_format: z.literal("url"), @@ -5388,8 +5334,6 @@ export const PreviewBatchResultErrorSchema = /* @__PURE__ */ (() => (z.object({ success: z.literal(false).optional() }).passthrough()))(); -export const BuildCreativeAsyncSubmittedSchema = /* @__PURE__ */ (() => (BuildCreativeSubmittedSchema))(); - export const CreativeFeatureResultSchema = /* @__PURE__ */ (() => (z.object({ feature_id: z.string(), value: z.union([z.boolean(), z.number(), z.string()]), @@ -5423,8 +5367,6 @@ export const CreativeAuditObservationSchema = /* @__PURE__ */ (() => (z.object({ ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const SyncCreativesAsyncSubmittedSchema = /* @__PURE__ */ (() => (SyncCreativesSubmittedSchema))(); - export const CatalogItemAvailabilityUpdateResultSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ request_index: z.number().int().gte(0), catalog_id: z.string(), @@ -5440,8 +5382,6 @@ export const CatalogItemAvailabilityUpdateResultSchema = /* @__PURE__ */ (() => ext: ExtensionObjectSchema.optional() }).passthrough())))(); -export const SyncCatalogsAsyncSubmittedSchema = /* @__PURE__ */ (() => (SyncCatalogsSubmittedSchema))(); - export const A2UIBoundValueSchema = /* @__PURE__ */ (() => (z.union([z.object({ literalString: z.string() }).passthrough(), z.object({ @@ -6259,6 +6199,7 @@ export const AccountAuthorizationSchema = /* @__PURE__ */ (() => (z.object({ field_scopes: z.record(z.string(), z.array(z.string())).optional(), scope_name: z.union([StandardScopeSchema, CustomScopeSchema]).optional(), authorized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + regranted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), read_only: z.boolean().optional() }).passthrough()))(); @@ -6419,7 +6360,7 @@ export const AgentEncryptionKeySchema = /* @__PURE__ */ (() => (z.object({ export const AgentNotificationConfigStateSchema = /* @__PURE__ */ (() => (z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.enum(["creative.status_changed","creative.assignment_changed","indicators.changed","creative.purged","account.status_changed","account.change_recorded","product.created","product.updated","product.priced","product.removed","signal.created","signal.updated","signal.priced","signal.removed","wholesale_feed.bulk_change","collection_card.updated","collection_card.removed","collection_catalog.bulk_change","capabilities.changed","reporting.delivery_ready","reporting.status_changed","reporting.ledger_changed","principal.changed","proposal.created","account_request.changed","proposal.offered"])), + event_types: nonemptyArray(z.enum(["creative.status_changed","creative.assignment_changed","indicators.changed","creative.purged","creative.staged_update_changed","account.status_changed","account.change_recorded","product.created","product.updated","product.priced","product.removed","signal.created","signal.updated","signal.priced","signal.removed","wholesale_feed.bulk_change","collection_card.updated","collection_card.removed","collection_catalog.bulk_change","capabilities.changed","reporting.delivery_ready","reporting.status_changed","reporting.ledger_changed","principal.changed","proposal.created","account_request.changed","proposal.offered"])), all_authorized_accounts: z.boolean().optional(), include_future_event_types: z.boolean().optional(), authentication: z.object({ @@ -6432,7 +6373,7 @@ export const AgentNotificationConfigStateSchema = /* @__PURE__ */ (() => (z.obje export const AgentNotificationConfigSchema = /* @__PURE__ */ (() => (z.object({ subscriber_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"), - event_types: nonemptyArray(z.enum(["creative.status_changed","creative.assignment_changed","indicators.changed","creative.purged","account.status_changed","account.change_recorded","product.created","product.updated","product.priced","product.removed","signal.created","signal.updated","signal.priced","signal.removed","wholesale_feed.bulk_change","collection_card.updated","collection_card.removed","collection_catalog.bulk_change","capabilities.changed","reporting.delivery_ready","reporting.status_changed","reporting.ledger_changed","principal.changed","proposal.created","account_request.changed","proposal.offered"])), + event_types: nonemptyArray(z.enum(["creative.status_changed","creative.assignment_changed","indicators.changed","creative.purged","creative.staged_update_changed","account.status_changed","account.change_recorded","product.created","product.updated","product.priced","product.removed","signal.created","signal.updated","signal.priced","signal.removed","wholesale_feed.bulk_change","collection_card.updated","collection_card.removed","collection_catalog.bulk_change","capabilities.changed","reporting.delivery_ready","reporting.status_changed","reporting.ledger_changed","principal.changed","proposal.created","account_request.changed","proposal.offered"])), all_authorized_accounts: z.boolean().optional(), include_future_event_types: z.boolean().optional(), authentication: z.object({ @@ -7644,6 +7585,14 @@ export const KeywordTargetSchema = /* @__PURE__ */ (() => (z.object({ bid_price: z.number().gte(0).optional() }).passthrough()))(); +export const LiveUpdatePolicySchema = /* @__PURE__ */ (() => (z.object({ + in_place: z.array(z.object({ + change: CreativeChangeKindSchema, + serving: LiveUpdateServingModeSchema, + on_rejection: z.union([z.literal("keeps_prior"), z.literal("stops")]).optional() + }).passthrough()).max(4) +}).passthrough()))(); + export const MediaBuyFrequencyCapRequirementSchema = /* @__PURE__ */ (() => (FrequencyCapRequirementsSchema.and(z.object({ supported_control_modes: nonemptyArray(MediaBuyFrequencyCapControlModeSchema).optional() }).passthrough())))(); @@ -7959,9 +7908,23 @@ export const ReportingSubscriptionSchema = /* @__PURE__ */ (() => (z.object({}). destination: z.object({ destination_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), path_template: z.string().optional() - }).passthrough().optional() + }).passthrough().optional(), + destination_overrides: nonemptyArray(z.object({}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives."))).max(64).optional() }).passthrough())))(); +export const ReportingSubscriptionAccountExceptionsSchema = /* @__PURE__ */ (() => (z.object({ + account_id: z.string().min(1), + reasons: nonemptyArray(z.union([z.literal("offering_unsupported"), z.literal("capacity"), z.literal("overridden"), z.literal("excluded_by_buyer"), z.literal("action_required")])) +}).passthrough()))(); + +export const ReportingSubscriptionUnauthorizedAccountSchema = /* @__PURE__ */ (() => (z.object({ + account_id: z.string().min(1), + unauthorized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + last_owed_period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + withheld_period_count: z.number().int().gte(0), + withheld_reporting_obligation_ids: z.array(z.string()).max(1000).optional() +}).passthrough()))(); + export const PrincipalDeclarationsStateSchema = /* @__PURE__ */ (() => (z.object({ declared: AgentDeclarationsSchema, accepted: AgentDeclarationsSchema, @@ -7973,37 +7936,12 @@ export const PrincipalDeclarationsStateSchema = /* @__PURE__ */ (() => (z.object }).passthrough()).max(64).optional() }).passthrough()))(); -export const ReportingSubscriptionStateSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ - subscription_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), +export const ReportingSubscriptionPriorVersionSchema = /* @__PURE__ */ (() => (z.object({ subscription_version: z.number().int().gte(1), - state: z.union([z.literal("active"), z.literal("inactive"), z.literal("action_required")]), accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - prior_versions: z.array(z.object({ - subscription_version: z.number().int().gte(1), - accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - superseded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - configuration: ReportingSubscriptionSchema.optional() - }).passthrough()).optional(), - deactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - inactive_intervals: z.array(z.object({ - deactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() - }).passthrough()).max(64).optional(), - destination_ref: z.string().min(1).max(255).optional(), - configuration: ReportingSubscriptionSchema, - issues: z.array(ErrorSchema).max(16).optional(), - accounts_with_exceptions: z.array(z.object({ - account_id: z.string().min(1), - reasons: nonemptyArray(z.union([z.literal("offering_unsupported"), z.literal("capacity"), z.literal("overridden"), z.literal("excluded_by_buyer"), z.literal("action_required")])) - }).passthrough()).max(1000).optional(), - accounts_unauthorized: z.array(z.object({ - account_id: z.string().min(1), - unauthorized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - last_owed_period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - withheld_period_count: z.number().int().gte(0), - withheld_reporting_obligation_ids: z.array(z.string()).max(1000).optional() - }).passthrough()).max(1000).optional() -}).passthrough())))(); + superseded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + configuration: ReportingSubscriptionSchema.optional() +}).passthrough()))(); export const ProductAudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ requirement_mode: z.union([z.literal("required"), z.literal("preferred")]), @@ -8303,6 +8241,7 @@ export const ReportingConsumerStatusSchema = /* @__PURE__ */ (() => ((() => { delivery_config_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), delivery_config_version: z.number().int().gte(1), report_definition_id: z.string().min(1).max(255).regex(new RegExp("^[A-Za-z0-9_.:-]{1,255}$")), + offering_id: z.string().min(1).max(128).regex(new RegExp("^[A-Za-z0-9_.:-]{1,128}$")).optional(), period: z.object({ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), @@ -8332,7 +8271,7 @@ export const ReportingConsumerStatusSchema = /* @__PURE__ */ (() => ((() => { ctx.addIssue({ code: "custom", path: [field], message: field + " is forbidden" }); } }; - const allowed = new Set(["reporting_status_id","supersedes_reporting_status_id","delivery_config_id","delivery_config_version","report_definition_id","period","reporting_obligation_id","reporting_revision_id","observed_revision_content_sha256","consumer_status","status_as_of","mismatch_code","failure_code","consumer_commit_ref","seller_ledger_snapshot_id","seller_ledger_as_of","recorded_at"]); + const allowed = new Set(["reporting_status_id","supersedes_reporting_status_id","delivery_config_id","delivery_config_version","report_definition_id","offering_id","period","reporting_obligation_id","reporting_revision_id","observed_revision_content_sha256","consumer_status","status_as_of","mismatch_code","failure_code","consumer_commit_ref","seller_ledger_snapshot_id","seller_ledger_as_of","recorded_at"]); for (const field of Object.keys(value as Record)) { if (!allowed.has(field)) ctx.addIssue({ code: "custom", path: [field], message: "Unrecognized key" }); } @@ -8368,7 +8307,7 @@ export const ReportingConsumerStatusSchema = /* @__PURE__ */ (() => ((() => { })()))(); export const ReportingScheduleOfferingSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ - period_duration: z.string().max(64).regex(new RegExp("^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$")), + period_duration: z.string(), alignment: ReportingScheduleAlignmentSchema, period_anchor_policy: z.union([z.literal("fixed"), z.literal("configurable")]).optional(), period_timezone_policy: z.union([z.literal("fixed"), z.literal("account_resolved")]).optional(), @@ -8393,6 +8332,8 @@ export const ReportingDeliveryOfferingSchema = /* @__PURE__ */ (() => (z.object( report_definition_id: z.string().min(1).max(255).regex(new RegExp("^[A-Za-z0-9_.:-]{1,255}$")), standard_dimensions: z.array(ReportingDimensionSchema).max(16).optional(), unmapped_dimensions: z.array(z.string()).max(16).optional(), + available_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + withdrawn_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), report_definition_uri: z.string().regex(new RegExp("^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)")).refine(adcpJsonSchemaUri, "Invalid URI"), report_definition_sha256: z.string().regex(new RegExp("^[A-Fa-f0-9]{64}$")), reporting_profile: z.object({ @@ -8420,6 +8361,8 @@ export const ReportingDeliveryOfferingSchema = /* @__PURE__ */ (() => (z.object( report_definition_id: z.string().min(1).max(255).regex(new RegExp("^[A-Za-z0-9_.:-]{1,255}$")), standard_dimensions: z.array(ReportingDimensionSchema).max(16).optional(), unmapped_dimensions: z.array(z.string()).max(16).optional(), + available_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + withdrawn_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), report_definition_uri: z.string().regex(new RegExp("^https://(?![^/]*@)(?!localhost(?:[:/]|$))(?!\\[)(?!\\d+(?:\\.\\d+){3}(?::|/|$))(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/|$)")).refine(adcpJsonSchemaUri, "Invalid URI"), report_definition_sha256: z.string().regex(new RegExp("^[A-Fa-f0-9]{64}$")), reporting_profile: z.object({ @@ -8573,7 +8516,7 @@ export const ReportingVerificationSchema = /* @__PURE__ */ (() => (z.object({}). }).strict())))(); export const ReportingScheduleSchema = /* @__PURE__ */ (() => (z.object({}).strict().merge(z.object({ - period_duration: z.string().regex(new RegExp("^P(?=.*[1-9])(?=\\d|T)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?$")), + period_duration: z.string(), alignment: ReportingScheduleAlignmentSchema, period_anchor: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), period_timezone: z.string().min(1).max(255).optional(), @@ -8773,7 +8716,8 @@ export const ReportingSubscriptionExclusionReasonSchema = /* @__PURE__ */ (() => export const ReportingSubscriptionCoverageSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ subscription_id: z.string(), subscription_version: z.number().int().gte(1), - status: z.union([z.literal("active"), z.literal("excluded"), z.literal("action_required")]), + status: z.union([z.literal("active"), z.literal("excluded"), z.literal("action_required"), z.literal("inactive")]), + deactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), pending_action: PendingActionSchema.optional(), excluded: z.array(z.object({}).passthrough()), timezone_cutovers: z.array(z.object({ @@ -8845,7 +8789,7 @@ export const CatalogFieldBindingSchema = /* @__PURE__ */ (() => (z.union([Scalar }).passthrough()])))(); export const ProtocolResponseSchema = /* @__PURE__ */ (() => (z.object({ - message: z.string(), + message: TaskMessageSchema, context_id: z.string().optional(), data: z.unknown().optional() }).passthrough()))(); @@ -9019,7 +8963,7 @@ export const StoreItemSchema = /* @__PURE__ */ (() => (z.object({ export const TasksGetRequestSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), - task_id: z.string(), + task_id: TaskIDSchema, account: AccountReferenceSchema.optional(), include_history: z.boolean().optional(), include_result: z.boolean().optional(), @@ -9028,19 +8972,19 @@ export const TasksGetRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const TasksGetResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string(), + task_id: TaskIDSchema, status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), task_type: TaskTypeSchema, protocol: AdCPProtocolSchema, created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), @@ -9086,7 +9030,7 @@ export const TasksListRequestSchema = /* @__PURE__ */ (() => (z.object({ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - task_ids: z.array(z.string()).max(100).optional(), + task_ids: z.array(TaskIDSchema).max(100).optional(), context_contains: z.string().optional(), has_webhook: z.boolean().optional() }).passthrough().optional(), @@ -9101,19 +9045,19 @@ export const TasksListRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const TasksListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), query_summary: z.object({ total_matching: z.int().min(0).optional(), returned: z.int().min(0).optional(), @@ -9130,7 +9074,7 @@ export const TasksListResponseSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough().optional() }).passthrough(), tasks: z.array(z.object({ - task_id: z.string(), + task_id: TaskIDSchema, task_type: TaskTypeSchema, domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]), status: TaskStatusSchema, @@ -9295,6 +9239,23 @@ export const CreativePurgedWebhookSchema = /* @__PURE__ */ (() => (z.object({ ext: ExtensionObjectSchema.optional() }).passthrough()))(); +export const CreativeStagedUpdateChangedWebhookSchema = /* @__PURE__ */ (() => (z.object({ + idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/), + notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/), + notification_type: z.literal("creative.staged_update_changed"), + fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/), + account_id: z.string(), + creative_id: z.string(), + revision_id: CreativeRevisionIDSchema.optional(), + outcome: z.union([z.literal("promoted"), z.literal("rejected")]), + rejection_reason: z.string().max(500).optional(), + creative_status: CreativeStatusSchema, + observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + initiator: z.union([z.literal("seller"), z.literal("system")]), + ext: ExtensionObjectSchema.optional() +}).passthrough()))(); + export const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => (z.object({ idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/), notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/), @@ -9406,6 +9367,11 @@ export const ConflictDetailsSchema = /* @__PURE__ */ (() => (z.object({ current_version: z.union([z.number(), z.string()]).optional() }).passthrough()))(); +export const CreativeLiveUpdateUnsupportedDetailsSchema = /* @__PURE__ */ (() => (z.object({ + refused_changes: z.array(CreativeChangeKindSchema), + live_package_ids: z.array(z.string()).optional() +}).passthrough()))(); + export const CreativeMergeRejectedDetailsSchema = /* @__PURE__ */ (() => (z.object({ rejections: z.array(z.object({ operation_index: z.int().min(0), @@ -10151,9 +10117,9 @@ export const TMPXChunkSchema = /* @__PURE__ */ (() => (z.object({ export const IdentityMatchResponseProviderRouterSchema = /* @__PURE__ */ (() => (z.object({ context_id: z.string().optional(), - task_id: z.string().optional(), + task_id: z.string().min(1).optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: z.string().max(2000).optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), @@ -10243,9 +10209,9 @@ export const SignalCatalogTypeSchema = /* @__PURE__ */ (() => (SignalAvailabilit export const IdentityMatchResponseRouterPublisherSchema = /* @__PURE__ */ (() => (z.object({ context_id: z.string().optional(), - task_id: z.string().optional(), + task_id: z.string().min(1).optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: z.string().max(2000).optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), @@ -10272,7 +10238,12 @@ export const IdentityMatchResponseRouterPublisherSchema = /* @__PURE__ */ (() => export const OutcomeMeasurementDeprecatedSchema = /* @__PURE__ */ (() => (OutcomeMeasurementSchema))(); -export const GetProductsSubmittedSchema = /* @__PURE__ */ (() => (GetProductsAsyncSubmittedSchema))(); +export const GetProductsAsyncSubmittedSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskSubmittedSchema).merge(z.object({ + estimated_completion: z.string().optional(), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); export const GetSignalsSubmittedSchema = /* @__PURE__ */ (() => (GetSignalsAsyncSubmittedSchema))(); @@ -10904,13 +10875,24 @@ export const ListCollectionsRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ListCollectionsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), outcome: z.union([z.literal("listed"), z.literal("unchanged")]).optional(), collections: z.array(ResponseCollectionSchema).optional(), pagination: PaginationResponseSchema.optional(), collections_version: z.string().min(1).optional(), cache_scope: z.union([z.literal("public"), z.literal("account")]).optional(), - replayed: z.literal(true).optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough().and(z.union([z.object({ outcome: z.literal("listed"), @@ -10918,14 +10900,12 @@ export const ListCollectionsResponseSchema = /* @__PURE__ */ (() => (z.object({ pagination: PaginationResponseSchema.optional(), collections_version: z.string().min(1), cache_scope: z.union([z.literal("public"), z.literal("account")]), - replayed: z.literal(true).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough(), z.object({ outcome: z.literal("unchanged"), collections_version: z.string().min(1), cache_scope: z.union([z.literal("public"), z.literal("account")]), - replayed: z.literal(true).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))))(); @@ -10942,6 +10922,35 @@ export const DeclineProposalsRequestSchema = /* @__PURE__ */ (() => (z.object({ opportunity: OpportunityContextSchema.optional() }).passthrough()))(); +export const DeclineProposalsResponseSchema = /* @__PURE__ */ (() => (z.union([ProtocolEnvelopeSchema.and(z.object({ + results: z.array(z.union([z.object({ + proposal_id: z.string().min(1), + outcome: z.literal("declined") + }).passthrough(), z.object({ + proposal_id: z.string().min(1), + outcome: z.literal("unable"), + reason: z.string().min(1) + }).passthrough()])), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional(), + status: z.literal("completed").optional() + }).passthrough()), ProtocolEnvelopeSchema.merge(z.object({ + results: z.array(z.union([z.object({ + proposal_id: z.string().min(1), + outcome: z.literal("declined") + }).passthrough(), z.object({ + proposal_id: z.string().min(1), + outcome: z.literal("unable"), + reason: z.string().min(1) + }).passthrough()])).optional(), + errors: z.array(ErrorSchema).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional(), + status: z.literal("submitted"), + task_id: TaskIDSchema + }).passthrough())])))(); + export const AcceptProposalRequestSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), @@ -10985,8 +10994,7 @@ export const ControlAppliedSchema = /* @__PURE__ */ (() => (z.object({ code: z.literal("inventory_shortfall_forecast").optional() }).passthrough())).optional(), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() + ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const ListCreativeFormatsRequestSchema = /* @__PURE__ */ (() => (z.object({ @@ -11385,6 +11393,7 @@ export const ReportingObligationSchema = /* @__PURE__ */ (() => (z.object({}).st report_definition_id: z.string().min(1).max(255).regex(new RegExp("^[A-Za-z0-9_.:-]{1,255}$")), offering_id: z.string().min(1).max(128).regex(new RegExp("^[A-Za-z0-9_.:-]{1,128}$")).optional(), feed_purpose: ReportingFeedPurposeSchema, + stub: z.literal(true).optional(), reporting_profile: z.string().min(1).max(128), account_id: z.string().min(1), media_buy_ids: z.array(ReportingMediaBuyIDSchema), @@ -11474,16 +11483,11 @@ export const RevisionViewSchema = /* @__PURE__ */ (() => (z.object({ })))(); export const UnavailableLookupSchema = /* @__PURE__ */ (() => (z.object({ - adcp_version: z.string().optional(), - adcp_major_version: z.int().optional(), status: z.literal("failed"), view: z.union([z.literal("summary"), z.literal("periods"), z.literal("revision")]), failure_kind: z.literal("lookup_unavailable"), - context_id: z.string().optional(), context: ContextObjectSchema.optional(), message: z.literal("Reporting status resource is unavailable.").optional(), - timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - replayed: z.boolean().optional(), adcp_error: z.object({ code: z.literal("NOT_FOUND"), message: z.literal("Reporting status resource is unavailable.") @@ -11495,17 +11499,10 @@ export const UnavailableLookupSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const OperationalFailureSchema = /* @__PURE__ */ (() => (z.object({ - adcp_version: z.string().optional(), - adcp_major_version: z.int().optional(), status: z.literal("failed"), view: z.union([z.literal("summary"), z.literal("periods"), z.literal("revision")]), failure_kind: z.literal("operational"), - context_id: z.string().optional(), context: ContextObjectSchema.optional(), - message: z.string().optional(), - timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - replayed: z.boolean().optional(), - adcp_error: ErrorSchema.optional(), errors: z.array(ErrorSchema) }).passthrough()))(); @@ -11613,19 +11610,17 @@ export const ReportMediaBuyIssueRequestSchema = /* @__PURE__ */ (() => (z.object push_notification_config: PushNotificationConfigSchema.optional() }).passthrough()))(); -export const ReportMediaBuyIssueResponseSchema = /* @__PURE__ */ (() => (z.union([z.object({ +export const ReportMediaBuyIssueResponseSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.and(z.union([z.object({ outcome: z.literal("recorded"), issue: MediaBuyIssueSchema, context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.boolean().optional() + ext: ExtensionObjectSchema.optional() }).passthrough(), z.object({ outcome: z.literal("failed"), errors: z.array(ErrorSchema), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.boolean().optional() - }).passthrough()])))(); + ext: ExtensionObjectSchema.optional() + }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetMediaBuyIssueRequestSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), @@ -11640,19 +11635,17 @@ export const GetMediaBuyIssueRequestSchema = /* @__PURE__ */ (() => (z.object({ idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/).optional() }).passthrough()))(); -export const GetMediaBuyIssueResponseSchema = /* @__PURE__ */ (() => (z.union([z.object({ +export const GetMediaBuyIssueResponseSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.and(z.union([z.object({ outcome: z.literal("found"), issue: MediaBuyIssueSchema, context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.boolean().optional() + ext: ExtensionObjectSchema.optional() }).passthrough(), z.object({ outcome: z.literal("failed"), errors: z.array(ErrorSchema), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.boolean().optional() - }).passthrough()])))(); + ext: ExtensionObjectSchema.optional() + }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))))(); export const ProvidePerformanceFeedbackRequestSchema = /* @__PURE__ */ (() => (z.object({ media_buy_id: z.string(), @@ -11859,8 +11852,7 @@ export const SyncAudiencesErrorSchema = /* @__PURE__ */ (() => (z.object({ export const SyncAudiencesSubmittedSchema = /* @__PURE__ */ (() => (z.object({ status: z.literal("submitted"), - task_id: z.string(), - message: z.string().max(2000).optional(), + task_id: TaskIDSchema, errors: z.array(ErrorSchema).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -12502,7 +12494,7 @@ export const ListCreativesRequestSchema = /* @__PURE__ */ (() => (z.object({ include_webhook_activity: z.boolean().optional(), webhook_activity_limit: z.int().min(1).max(200).optional(), account: AccountReferenceSchema.optional(), - fields: z.array(z.union([z.literal("creative_id"), z.literal("name"), z.literal("format_id"), z.literal("format_kind"), z.literal("format_option_ref"), z.literal("assets"), z.literal("status"), z.literal("created_date"), z.literal("updated_date"), z.literal("tags"), z.literal("provenance"), z.literal("rights"), z.literal("rights_attestation_evaluations"), z.literal("localization"), z.literal("localization_unavailable"), z.literal("assignments"), z.literal("snapshot"), z.literal("items"), z.literal("variables"), z.literal("concept"), z.literal("pricing_options")])).optional(), + fields: z.array(z.union([z.literal("creative_id"), z.literal("name"), z.literal("format_id"), z.literal("format_kind"), z.literal("format_option_ref"), z.literal("assets"), z.literal("status"), z.literal("created_date"), z.literal("updated_date"), z.literal("tags"), z.literal("provenance"), z.literal("rights"), z.literal("rights_attestation_evaluations"), z.literal("localization"), z.literal("localization_unavailable"), z.literal("assignments"), z.literal("snapshot"), z.literal("items"), z.literal("variables"), z.literal("concept"), z.literal("pricing_options"), z.literal("staged_update")])).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -12654,19 +12646,19 @@ export const CreativeCapabilityTargetSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ValidateInputResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), results: z.array(ValidateInputResultSchema) }).passthrough()))(); @@ -12831,19 +12823,19 @@ export const UpdatePropertyListRequestSchema = /* @__PURE__ */ (() => (z.object( }).passthrough()))(); export const UpdatePropertyListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: PropertyListSchema, ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -12863,19 +12855,19 @@ export const GetPropertyListRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const GetPropertyListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: PropertyListSchema, identifiers: z.array(IdentifierSchema).optional(), pagination: PaginationResponseSchema.optional(), @@ -12896,19 +12888,19 @@ export const ListPropertyListsRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ListPropertyListsResponseSchema = /* @__PURE__ */ (() => (z.object({ - context_id: z.string().optional(), + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), lists: z.array(PropertyListSchema), pagination: PaginationResponseSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -12925,19 +12917,19 @@ export const DeletePropertyListRequestSchema = /* @__PURE__ */ (() => (z.object( }).passthrough()))(); export const DeletePropertyListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), deleted: z.boolean(), list_id: z.string(), ext: ExtensionObjectSchema.optional() @@ -12989,19 +12981,19 @@ export const UpdateCollectionListRequestSchema = /* @__PURE__ */ (() => (z.objec }).passthrough()))(); export const UpdateCollectionListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: CollectionListSchema, ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -13021,19 +13013,19 @@ export const GetCollectionListRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const GetCollectionListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: CollectionListSchema, collections: z.array(z.object({ collection_rid: z.string().optional(), @@ -13070,19 +13062,19 @@ export const ListCollectionListsRequestSchema = /* @__PURE__ */ (() => (z.object }).passthrough()))(); export const ListCollectionListsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), lists: z.array(CollectionListSchema), pagination: PaginationResponseSchema.optional(), ext: ExtensionObjectSchema.optional() @@ -13099,19 +13091,19 @@ export const DeleteCollectionListRequestSchema = /* @__PURE__ */ (() => (z.objec }).passthrough()))(); export const DeleteCollectionListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), deleted: z.boolean(), list_id: z.string(), ext: ExtensionObjectSchema.optional() @@ -13282,19 +13274,19 @@ export const Artifact1Schema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ standards_id: z.string(), context: ContextObjectSchema.optional(), @@ -13361,19 +13353,19 @@ export const CalibrateContentRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const CalibrateContentResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ verdict: BinaryVerdictSchema, confidence: z.number().min(0).max(1).optional(), @@ -13416,19 +13408,19 @@ export const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => (z.ob }).passthrough()))(); export const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ summary: z.object({ total_records: z.int(), @@ -13474,19 +13466,19 @@ export const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => (z.objec }).passthrough()))(); export const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ media_buy_id: z.string(), artifacts: z.array(z.object({ @@ -13632,19 +13624,19 @@ export const SyncPlansRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SyncPlansResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), plans: z.array(z.object({ plan_id: z.string(), status: z.union([z.literal("active"), z.literal("error")]), @@ -13677,6 +13669,17 @@ export const ReportedOutcomeErrorSchema = /* @__PURE__ */ (() => (z.object({ export const ReportPlanOutcomeResponseSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), outcome_id: z.string(), outcome_state: z.union([z.literal("accepted"), z.literal("findings")]), committed_budget: z.number().optional(), @@ -13692,8 +13695,6 @@ export const ReportPlanOutcomeResponseSchema = /* @__PURE__ */ (() => (z.object( total_committed: z.number().optional(), budget_remaining: z.number().optional() }).passthrough().optional(), - replayed: z.boolean().optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -13728,6 +13729,17 @@ export const ReportPlanAdjustmentRequestSchema = /* @__PURE__ */ (() => (z.objec export const ReportPlanAdjustmentResponseSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), adjustment_id: z.string(), adjustment_state: z.union([z.literal("reported"), z.literal("verified"), z.literal("disputed")]), adjustment_type: z.union([z.literal("decommitment"), z.literal("refund"), z.literal("credit"), z.literal("makegood")]), @@ -13747,8 +13759,6 @@ export const ReportPlanAdjustmentResponseSchema = /* @__PURE__ */ (() => (z.obje net_committed: z.number().min(0), budget_remaining: z.number() }).passthrough(), - replayed: z.boolean().optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -13765,19 +13775,19 @@ export const GetPlanAuditLogsRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), plans: z.array(z.object({ plan_id: z.string(), plan_version: z.int(), @@ -13955,6 +13965,17 @@ export const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => (z.object({ export const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), check_id: z.string(), verdict: GovernanceDecisionSchema, check_type: z.union([z.literal("intent"), z.literal("execution")]).optional(), @@ -14006,8 +14027,6 @@ export const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough() }).passthrough())).max(10).optional(), runtime_attestation_binding_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(), - governance_context: z.string().min(1).max(4096).regex(/^[\x20-\x7E]+$/).optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -14023,19 +14042,19 @@ export const SIGetOfferingRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SIGetOfferingResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), available: z.boolean(), offering_token: z.string().optional(), ttl_seconds: z.int().min(0).optional(), @@ -14092,19 +14111,19 @@ export const SIInitiateSessionRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SIInitiateSessionResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), session_id: z.string(), response: z.object({ message: z.string().optional(), @@ -14134,19 +14153,19 @@ export const SISendMessageRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SISendMessageResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), session_id: z.string(), response: z.object({ message: z.string().optional(), @@ -14193,19 +14212,19 @@ export const SITerminateSessionRequestSchema = /* @__PURE__ */ (() => (z.object( }).passthrough()))(); export const SITerminateSessionResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), session_id: z.string(), terminated: z.boolean(), session_status: SISessionStatusSchema.optional(), @@ -14416,7 +14435,7 @@ export const SignalDeliveryMethodSchema = /* @__PURE__ */ (() => (z.union([AdCPA export const GetTaskStatusRequestSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), - task_id: z.string(), + task_id: TaskIDSchema, account: AccountReferenceSchema.optional(), include_history: z.boolean().optional(), include_result: z.boolean().optional(), @@ -14425,19 +14444,19 @@ export const GetTaskStatusRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string(), + task_id: TaskIDSchema, status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), task_type: TaskTypeSchema, protocol: AdCPProtocolSchema, created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), @@ -14483,7 +14502,7 @@ export const ListTasksRequestSchema = /* @__PURE__ */ (() => (z.object({ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), - task_ids: z.array(z.string()).max(100).optional(), + task_ids: z.array(TaskIDSchema).max(100).optional(), context_contains: z.string().optional(), has_webhook: z.boolean().optional() }).passthrough().optional(), @@ -14498,19 +14517,19 @@ export const ListTasksRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ListTasksResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), query_summary: z.object({ total_matching: z.int().min(0).optional(), returned: z.int().min(0).optional(), @@ -14527,7 +14546,7 @@ export const ListTasksResponseSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough().optional() }).passthrough(), tasks: z.array(z.object({ - task_id: z.string(), + task_id: TaskIDSchema, task_type: TaskTypeSchema, domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]), status: TaskStatusSchema, @@ -14551,19 +14570,19 @@ export const SyncAgentNotificationConfigsRequestSchema = /* @__PURE__ */ (() => }).passthrough()))(); export const SyncAgentNotificationConfigsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), dry_run: z.boolean().optional(), action: z.union([z.literal("updated"), z.literal("unchanged"), z.literal("cleared"), z.literal("failed")]), notification_configs: z.array(AgentNotificationConfigSchema).max(16).optional(), @@ -14611,6 +14630,31 @@ export const AgentReportingDestinationStateSchema = /* @__PURE__ */ (() => (z.ob issues: z.array(ErrorSchema).max(16).optional() }).passthrough())))(); +export const ReportingSubscriptionStateSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ + subscription_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), + subscription_version: z.number().int().gte(1), + state: z.union([z.literal("active"), z.literal("inactive"), z.literal("action_required")]), + accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + prior_versions: z.array(ReportingSubscriptionPriorVersionSchema).max(16).optional(), + prior_versions_count: z.number().int().gte(0).optional(), + deactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + inactive_intervals: z.array(z.object({ + deactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() + }).passthrough()).max(64).optional(), + destination_ref: z.string().min(1).max(255).optional(), + configuration: ReportingSubscriptionSchema, + issues: z.array(ErrorSchema).max(16).optional(), + accounts_with_exceptions: z.array(ReportingSubscriptionAccountExceptionsSchema).max(1000).optional(), + accounts_with_exceptions_count: z.number().int().gte(0).optional(), + accounts_unauthorized_count: z.number().int().gte(0).optional(), + destination_override_refs: z.array(z.object({ + destination_id: z.string().min(1).max(64).regex(new RegExp("^[A-Za-z0-9_.:-]{1,64}$")), + destination_ref: z.string().min(1).max(255) + }).passthrough()).max(64).optional(), + accounts_unauthorized: z.array(ReportingSubscriptionUnauthorizedAccountSchema).max(1000).optional() +}).passthrough())))(); + export const ValidatedPrincipalDryRunSchema = /* @__PURE__ */ (() => (z.object({ kind: z.literal("validated"), action: z.union([z.literal("would_update"), z.literal("would_be_unchanged"), z.literal("would_clear")]), @@ -14638,6 +14682,11 @@ export const PrincipalStateSchema = /* @__PURE__ */ (() => (z.object({ export const GetPrincipalRequestSchema = /* @__PURE__ */ (() => (z.object({ adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), adcp_major_version: z.number().int().gte(1).lte(99).optional(), + reporting_subscription_page: z.object({ + subscription_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/), + list: z.union([z.literal("accounts_with_exceptions"), z.literal("accounts_unauthorized"), z.literal("prior_versions")]), + pagination: PaginationRequestSchema.optional() + }).passthrough().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -14648,7 +14697,15 @@ export const CurrentPrincipalConfigurationSchema = /* @__PURE__ */ (() => (z.obj principal_id: z.string().min(1).max(255), principal_kind: PrincipalKindSchema, configuration_version: z.string().min(1).max(255), - configuration: PrincipalStateSchema + configuration: PrincipalStateSchema, + reporting_subscription_page: z.object({ + subscription_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/), + list: z.union([z.literal("accounts_with_exceptions"), z.literal("accounts_unauthorized"), z.literal("prior_versions")]), + accounts_with_exceptions: z.array(ReportingSubscriptionAccountExceptionsSchema).max(100).optional(), + accounts_unauthorized: z.array(ReportingSubscriptionUnauthorizedAccountSchema).max(100).optional(), + prior_versions: z.array(ReportingSubscriptionPriorVersionSchema).max(100).optional(), + pagination: PaginationResponseSchema + }).passthrough().optional() }).passthrough()))(); export const RecognizedPrincipalWithoutStandingConfigurationSchema = /* @__PURE__ */ (() => (z.object({ @@ -14681,19 +14738,19 @@ export const ListAccountChangesRequestSchema = /* @__PURE__ */ (() => (z.object( }).passthrough()))(); export const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), changes: z.array(AccountChangeSchema).max(100).optional(), cursor: z.string().min(1).max(4096).optional(), has_more: z.boolean().optional(), @@ -14872,19 +14929,19 @@ export const ReportUsageRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ReportUsageResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), accepted: z.int().min(0), errors: z.array(ErrorSchema).optional(), sandbox: z.boolean().optional(), @@ -14936,7 +14993,7 @@ export const ViewabilitySchema = /* @__PURE__ */ (() => (z.object({}).passthroug standard: ViewabilityStandardSchema.optional() }).passthrough())))(); -export const GetSignalsCompletionSchema = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({ +export const GetSignalsCompletionSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(z.object({ signals: z.array(SignalListingSchema.and(SignalDefinitionEnrichmentSchema).and(z.object({}).passthrough())).optional(), signal_pricing_group_rules: nonemptyArray(SignalPricingGroupRuleSchema).optional(), errors: z.array(ErrorSchema).optional(), @@ -14995,7 +15052,6 @@ export const StateTransitionSuccessSchema = /* @__PURE__ */ (() => (z.object({ success: z.literal(true), previous_state: z.string(), current_state: z.string(), - message: z.string().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -15004,7 +15060,6 @@ export const SimulationSuccessSchema = /* @__PURE__ */ (() => (z.object({ success: z.literal(true), simulated: z.object({}).passthrough(), cumulative: z.object({}).passthrough().optional(), - message: z.string().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -15013,20 +15068,18 @@ export const ForcedDirectiveSuccessSchema = /* @__PURE__ */ (() => (z.object({ success: z.literal(true), forced: z.object({ arm: z.union([z.literal("submitted"), z.literal("completed"), z.literal("input-required"), z.literal("rejected"), z.literal("unable")]), - task_id: z.string().max(128).optional(), + task_id: TaskIDSchema.optional(), evaluation_id: z.string().min(1).max(255).optional(), reason: z.string().min(1).max(2000).optional(), suggestions: z.array(z.string()).max(20).optional(), proposal_id: z.string().min(1).optional() }).passthrough(), - message: z.string().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const SeedSuccessSchema = /* @__PURE__ */ (() => (z.object({ success: z.literal(true), - message: z.string().optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -15229,22 +15282,39 @@ export const ProductDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => (z.ob location: ProductDOOHLocationSchema.optional() }).passthrough()))(); -export const ControlMediaBuyResponseSchema = /* @__PURE__ */ (() => (z.union([ControlAppliedSchema, ControlErrorSchema, ControlSubmittedSchema])))(); +export const GetProductsRejectedSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(z.object({ + status: z.literal("rejected"), + reason: z.string().min(1).max(2000), + suggestions: nonemptyArray(z.string()).max(20).optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const GetProductsAsyncWorkingSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskWorkingSchema).merge(z.object({ + percentage: z.number().optional(), + current_step: z.string().optional(), + total_steps: z.number().optional(), + step_number: z.number().optional(), + context: ContextObjectSchema.optional(), + ext: ExtensionObjectSchema.optional() +}).passthrough())))(); + +export const ControlMediaBuyResponseSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.and(z.union([ControlAppliedSchema, ControlErrorSchema, ControlSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetSignalsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), signals: z.array(z.object({ restricted_attributes: z.array(RestrictedAttributeSchema).optional(), demographic_predicate: DemographicPredicateSchema.optional(), @@ -15349,67 +15419,67 @@ export const GetSignalsResponseSchema = /* @__PURE__ */ (() => (z.object({ // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const BuildCreativeResponseSchema: z.ZodType, BuildCreativeResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().min(1).optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const ProductAllocationSchema = /* @__PURE__ */ (() => (z.object({ @@ -16115,35 +16185,35 @@ export const AcquireRightsAcquiredSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetRightsSuccessSchema = /* @__PURE__ */ (() => (z.object({ @@ -17727,19 +17797,19 @@ export const OfferSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ContextMatchResponseProviderRouterSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), type: z.literal("context_match_response"), request_id: z.string(), offers: z.array(OfferSchema), @@ -17754,19 +17824,19 @@ export const ContextMatchResponseProviderRouterSchema = /* @__PURE__ */ (() => ( export const IdentityMatchResponseSchema = /* @__PURE__ */ (() => (IdentityMatchResponseRouterPublisherSchema))(); export const ContextMatchResponseRouterPublisherSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), type: z.literal("context_match_response"), request_id: z.string(), offers: z.array(OfferSchema), @@ -17778,6 +17848,8 @@ export const ContextMatchResponseRouterPublisherSchema = /* @__PURE__ */ (() => }).passthrough()).optional() }).passthrough()))(); +export const GetProductsSubmittedSchema = /* @__PURE__ */ (() => (GetProductsAsyncSubmittedSchema))(); + export const FormatAssetSlotSchema = /* @__PURE__ */ (() => (z.union([IndividualAssetSlotSchema, RepeatableGroupAssetSchema])))(); // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. @@ -19229,11 +19301,10 @@ export const CommittedMediaBuySchema = /* @__PURE__ */ (() => (z.object({ code: z.union([z.literal("inventory_shortfall_forecast"), z.literal("flight_change_creates_pacing_risk")]).optional() }).passthrough())).optional(), context: ContextObjectSchema.optional(), - ext: ExtensionObjectSchema.optional(), - replayed: z.literal(true).optional() + ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const MediaBuyCommitmentResponseSchema = /* @__PURE__ */ (() => (z.union([CommittedMediaBuySchema, CommitmentErrorSchema, CommitmentSubmittedSchema])))(); +export const MediaBuyCommitmentResponseSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.and(z.union([CommittedMediaBuySchema, CommitmentErrorSchema, CommitmentSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const PackageControlSchema = /* @__PURE__ */ (() => (z.object({}).passthrough().merge(z.object({ package_id: z.string().min(1), @@ -19287,19 +19358,19 @@ export const ControlMediaBuyRequestSchema = /* @__PURE__ */ (() => (z.object({ // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const ListCreativeFormatsResponseSchema: z.ZodObject<{ [K in keyof ListCreativeFormatsResponse]-?: undefined extends ListCreativeFormatsResponse[K] ? z.ZodOptional, Exclude>> : z.ZodType }, z.core.$loose> & z.ZodType, ListCreativeFormatsResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), formats: z.array(FormatSchema), source: z.union([z.literal("publisher"), z.literal("aao_mirror"), z.literal("agent_derived")]).optional(), creative_agents: z.array(z.object({ @@ -19856,6 +19927,7 @@ export const PackageStatusSchema: z.ZodObject<{ [K in keyof PackageStatus]-?: un targeting_resolution: PackageTargetingResolutionSchema.optional(), start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + reporting_delivery_offering_ids: z.array(ReportingDeliveryOfferingIDSchema).max(64).optional(), start_requires_all_creatives_approved: z.boolean().optional(), paused: z.boolean().optional(), canceled: z.boolean().optional(), @@ -19945,19 +20017,19 @@ export const GetMediaBuyDeliveryPlacementMetricsSchema = /* @__PURE__ */ (() => }).passthrough())))(); export const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), notification_type: z.union([z.literal("scheduled"), z.literal("final"), z.literal("delayed"), z.literal("adjusted"), z.literal("window_update")]).optional(), partial_data: z.boolean().optional(), unavailable_count: z.int().min(0).optional(), @@ -20166,19 +20238,19 @@ export const SuccessfulLookupSchema = /* @__PURE__ */ (() => (z.union([SummaryVi export const FailedLookupSchema = /* @__PURE__ */ (() => (z.union([UnavailableLookupSchema, OperationalFailureSchema])))(); export const SyncReportingStatusResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), results: z.array(z.union([RecordedReportingConsumerStatusSchema, UnchangedReportingConsumerStatusSchema, FailedReportingConsumerStatusSchema])).max(100), ext: ExtensionObjectSchema.optional() }).passthrough().superRefine((value, ctx) => { @@ -20200,86 +20272,86 @@ export const SyncReportingStatusResponseSchema = /* @__PURE__ */ (() => (z.objec })))(); export const SyncReportingReceiptsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), results: z.array(z.union([RecordedReportingReceiptSchema, UnchangedReportingReceiptSchema, RecordedReportingAdjustmentReceiptSchema, UnchangedReportingAdjustmentReceiptSchema, FailedReportingReceiptSchema])).max(100), ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const SyncEventSourcesResponseSchema: z.ZodType, SyncEventSourcesResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const LogEventResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const BuildCreativeRequestSchema = /* @__PURE__ */ (() => (z.object({ @@ -20342,19 +20414,19 @@ export const BuildCreativeRequestSchema = /* @__PURE__ */ (() => (z.object({ // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const ListTransformersResponseCreativeAgentSchema: z.ZodObject<{ [K in keyof ListTransformersResponseCreativeAgent]-?: undefined extends ListTransformersResponseCreativeAgent[K] ? z.ZodOptional, Exclude>> : z.ZodType }, z.core.$loose> & z.ZodType, ListTransformersResponseCreativeAgent & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), transformers: z.array(TransformerSchema), errors: z.array(ErrorSchema).optional(), pagination: PaginationResponseSchema.optional(), @@ -20362,19 +20434,19 @@ export const ListTransformersResponseCreativeAgentSchema: z.ZodObject<{ [K in ke }).passthrough()))(); export const GetCreativeDeliveryResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), account_id: z.string().optional(), media_buy_id: z.string().optional(), currency: z.string().regex(/^[A-Z]{3}$/), @@ -20419,6 +20491,7 @@ export const ListedCreativeCanonicalFormatKindSchema: z.ZodType = /* @__PURE__ * creative_id: z.string(), platform_id: z.string().optional(), revision_id: CreativeRevisionIDSchema.optional(), + staged_update: CreativeStagedUpdateSchema.optional(), seller_revision: z.union([z.number(), z.string()]).optional(), representation_selection: RepresentationSelectionSchema.optional(), account: AccountSchema.optional(), @@ -20519,6 +20592,7 @@ export const SyncCreativesSuccessSchema: z.ZodType = /* @__PURE__ */ (() => (z.o account: AccountSchema.optional(), action: CreativeActionSchema, status: CreativeStatusSchema.optional(), + staged_update: CreativeStagedUpdateSchema.optional(), platform_id: z.string().optional(), localization: CreativeLocalizationReadbackSchema.optional(), changes: z.array(z.string()).optional(), @@ -20549,73 +20623,73 @@ export const ValidateInputRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const ActivateSignalResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: PropertyListSchema, auth_token: z.string(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const CreateCollectionListResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), list: CollectionListSchema, auth_token: z.string(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); export const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ standards: z.array(ContentStandardsSchema), pagination: PaginationResponseSchema.optional(), @@ -20628,19 +20702,19 @@ export const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => (z.obje }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([z.object({ standards_id: z.string(), name: z.string().optional(), @@ -20690,19 +20764,19 @@ export const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => (z.obj }).passthrough()))(); export const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => (z.object({ @@ -20818,19 +20892,19 @@ export const CheckGovernanceRequestSchema = /* @__PURE__ */ (() => (z.object({}) // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const GetAdCPCapabilitiesResponseSchema: z.ZodObject<{ [K in keyof GetAdCPCapabilitiesResponse]-?: undefined extends GetAdCPCapabilitiesResponse[K] ? z.ZodOptional, Exclude>> : z.ZodType }, z.core.$loose> & z.ZodType, GetAdCPCapabilitiesResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:3\\.(?:[2-9]|[1-9][0-9]+)|(?:[4-9]|[1-9][0-9]+)\\.\\d+)(?:-[a-zA-Z0-9.-]+)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:3\\.(?:[2-9]|[1-9][0-9]+)|(?:[4-9]|[1-9][0-9]+)\\.\\d+)(?:-[a-zA-Z0-9.-]+)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), business_calendars: z.array(BusinessCalendarSchema).max(32).optional(), adcp: z.object({ major_versions: z.array(z.number()), @@ -21156,6 +21230,14 @@ export const GetAdCPCapabilitiesResponseSchema: z.ZodObject<{ [K in keyof GetAdC stable_creative_ids: z.boolean().optional(), supports_revisions: z.boolean().optional(), supports_assignment_merge: z.boolean().optional(), + live_updates: z.object({ + in_place: z.array(z.object({ + change: CreativeChangeKindSchema, + serving: LiveUpdateServingModeSchema, + on_rejection: z.union([z.literal("keeps_prior"), z.literal("stops")]).optional() + }).passthrough()), + max_propagation_seconds: z.int().min(0).optional() + }).passthrough().optional(), supports_assignment_trackers: z.boolean().optional(), supports_assignment_landing_page: z.boolean().optional(), supports_generation: z.boolean().optional(), @@ -21307,19 +21389,19 @@ export const AppliedPrincipalConfigurationSchema = /* @__PURE__ */ (() => (z.obj }).passthrough()))(); export const GetPrincipalResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), result: z.union([CurrentPrincipalConfigurationSchema, RecognizedPrincipalWithoutStandingConfigurationSchema, UnconfiguredPrincipalSchema, FailedPrincipalReadSchema]), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -21336,6 +21418,8 @@ export const AccountRequestSchema = /* @__PURE__ */ (() => (z.object({}).passthr account_id: z.string().optional(), account: AccountSchema.optional(), resolution: AccountRequestResolutionSchema.optional(), + effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + not_carried_over: z.array(z.union([z.literal("notification_configs"), z.literal("reporting_delivery_configs"), z.literal("reporting_bucket"), z.literal("governance_agents"), z.literal("creatives"), z.literal("audiences"), z.literal("catalogs"), z.literal("event_sources")])).max(8).optional(), candidates: z.array(AccountCandidateSchema).min(2).max(50).optional(), errors: nonemptyArray(ErrorSchema).optional(), created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), @@ -21344,19 +21428,19 @@ export const AccountRequestSchema = /* @__PURE__ */ (() => (z.object({}).passthr }).passthrough())))(); export const ListAccountsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), accounts: z.array(AccountWithAuthorizationSchema), errors: z.array(ErrorSchema).optional(), account_requests: z.array(AccountRequestSchema).max(100).optional(), @@ -21366,19 +21450,19 @@ export const ListAccountsResponseSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const RequestAccountResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), request: AccountRequestSchema.optional(), errors: z.array(ErrorSchema).optional(), ext: ExtensionObjectSchema.optional() @@ -21476,19 +21560,19 @@ export const SyncAccountsSuccessSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetAccountFinancialsSuccessSchema = /* @__PURE__ */ (() => (z.object({ @@ -21529,7 +21613,7 @@ export const GetAccountFinancialsSuccessSchema = /* @__PURE__ */ (() => (z.objec ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const GetProductsCompletionSchema: z.ZodType = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({ +export const GetProductsCompletionSchema: z.ZodType = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(z.object({}).passthrough()).merge(z.object({ products: z.array(ProductSchema).optional(), collections: nonemptyArray(ResponseCollectionSchema).optional(), targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(), @@ -21598,19 +21682,19 @@ export const Product1Schema = /* @__PURE__ */ (() => (ProductSchema))(); export const ListTransformersResponseSchema: z.ZodObject<{ [K in keyof ListTransformersResponse]-?: undefined extends ListTransformersResponse[K] ? z.ZodOptional, Exclude>> : z.ZodType }, z.core.$loose> & z.ZodType, ListTransformersResponse & Record> = /* @__PURE__ */ (() => (ListTransformersResponseCreativeAgentSchema))(); export const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), compliant: z.boolean().optional(), list_id: z.string(), summary: z.object({ @@ -21648,8 +21732,7 @@ export const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => (z. }).passthrough()))(); // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. -export const RequestProposalsResponseSchema: z.ZodType, RequestProposalsResponse & Record> = /* @__PURE__ */ (() => (z.union([z.object({ - adcp_version: z.string().optional(), +export const RequestProposalsResponseSchema: z.ZodType, RequestProposalsResponse & Record> = /* @__PURE__ */ (() => (z.union([ProtocolEnvelopeSchema.and(z.object({ outcome: z.literal("proposed"), reason: z.never().optional(), suggestions: z.never().optional(), @@ -21667,15 +21750,12 @@ export const RequestProposalsResponseSchema: z.ZodType { + status: z.literal("submitted"), + task_id: TaskIDSchema + }).passthrough())]).superRefine((value: any, ctx) => { const present = (field: string): boolean => Object.prototype.hasOwnProperty.call(value, field); const requireNonEmptyArray = (field: "products" | "proposals"): void => { if (!Array.isArray(value[field]) || value[field].length === 0) { @@ -21903,7 +21975,13 @@ export const MediaBuySchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ canceled_by: CanceledBySchema, reason: z.string().max(500).optional() }).passthrough().optional(), + cancellation_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + flight_history: z.array(z.object({ + recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + stop_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") + }).passthrough()).max(64).optional(), total_budget: z.number().min(0), daily_budget_cap: z.number().min(0).optional(), frequency_cap: MediaBuyFrequencyCapSchema.optional(), @@ -21926,19 +22004,19 @@ export const MediaBuySchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. export const GetProductsResponseSchema: z.ZodObject<{ [K in keyof GetProductsResponse]-?: undefined extends GetProductsResponse[K] ? z.ZodOptional, Exclude>> : z.ZodType }, z.core.$loose> & z.ZodType, GetProductsResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), products: z.array(ProductSchema).optional(), collections: nonemptyArray(ResponseCollectionSchema).optional(), targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(), @@ -22001,17 +22079,16 @@ export const GetProductsResponseSchema: z.ZodObject<{ [K in keyof GetProductsRes ext: ExtensionObjectSchema.optional() }).passthrough()))(); -export const GetProductsAsyncInputRequiredSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ +export const GetProductsAsyncInputRequiredSchema: z.ZodType = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.merge(TaskInputRequiredSchema).merge(z.object({ reason: z.union([z.literal("CLARIFICATION_NEEDED"), z.literal("BUDGET_REQUIRED")]).optional(), partial_results: z.array(ProductSchema).optional(), suggestions: z.array(z.string()).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() -}).passthrough()))(); +}).passthrough())))(); // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. -export const RefineProposalsResponseSchema: z.ZodType, RefineProposalsResponse & Record> = /* @__PURE__ */ (() => (z.union([z.object({ - adcp_version: z.string().optional(), +export const RefineProposalsResponseSchema: z.ZodType, RefineProposalsResponse & Record> = /* @__PURE__ */ (() => (z.union([ProtocolEnvelopeSchema.and(z.object({ results: nonemptyArray(z.union([z.object({ source_proposal_id: z.string().min(1), outcome: z.literal("revised"), @@ -22046,14 +22123,11 @@ export const RefineProposalsResponseSchema: z.ZodType { + status: z.literal("submitted"), + task_id: TaskIDSchema + }).passthrough())]).superRefine((value, ctx) => { const payload = value as Record; const forbid = (target: Record, field: string, path: Array) => { if (target[field] !== undefined) { @@ -22209,35 +22275,35 @@ export const RefineProposalsResponseSchema: z.ZodType, UpdateMediaBuyResponse & Record> = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const SyncCreativesResponseSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const CreateMediaBuySuccessSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ @@ -22269,85 +22335,85 @@ export const CreateMediaBuySuccessSchema: z.ZodType = /* @__PURE__ */ (() => (z. }).passthrough()))(); export const AcquireRightsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetRightsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); -export const SearchBrandsResponseSchema = /* @__PURE__ */ (() => (AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); +export const SearchBrandsResponseSchema = /* @__PURE__ */ (() => (ProtocolEnvelopeSchema.and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const UpdateRightsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => (z.object({ @@ -22564,7 +22630,19 @@ export const AvailablePackageSchema: z.ZodObject<{ [K in keyof AvailablePackage] export const ContextMatchResponseSchema = /* @__PURE__ */ (() => (ContextMatchResponseRouterPublisherSchema))(); export const ListProductsResponseSchema = /* @__PURE__ */ (() => (z.object({ - adcp_version: z.string().optional(), + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), outcome: z.union([z.literal("listed"), z.literal("unchanged")]).optional(), products: z.array(CanonicalProductSchema).optional(), collections: z.array(ResponseCollectionSchema).optional(), @@ -22577,11 +22655,8 @@ export const ListProductsResponseSchema = /* @__PURE__ */ (() => (z.object({ description: z.string().min(1), estimated_wait: DurationSchema.optional() }).passthrough()).optional(), - replayed: z.literal(true).optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough().and(z.union([z.object({ - adcp_version: z.string().optional(), outcome: z.literal("listed"), products: z.array(CanonicalProductSchema), collections: z.array(ResponseCollectionSchema).optional(), @@ -22594,11 +22669,9 @@ export const ListProductsResponseSchema = /* @__PURE__ */ (() => (z.object({ description: z.string().min(1), estimated_wait: DurationSchema.optional() }).passthrough()).optional(), - replayed: z.literal(true).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough(), z.object({ - adcp_version: z.string().optional(), outcome: z.literal("unchanged"), collections: z.array(ResponseCollectionSchema).optional(), next_cursor: z.string().min(1).optional(), @@ -22610,12 +22683,24 @@ export const ListProductsResponseSchema = /* @__PURE__ */ (() => (z.object({ description: z.string().min(1), estimated_wait: DurationSchema.optional() }).passthrough()).optional(), - replayed: z.literal(true).optional(), context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))))(); export const ListProposalsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), + context_id: z.string().optional(), + context: ContextObjectSchema.optional(), + task_id: TaskIDSchema.optional(), + status: TaskStatusSchema, + message: TaskMessageSchema.optional(), + timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + replayed: z.boolean().optional(), + adcp_error: ErrorSchema.optional(), + push_notification_config: PushNotificationConfigSchema.optional(), + governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), + payload: z.object({}).passthrough().optional(), outcome: z.literal("listed"), proposals: z.array(z.object({ proposal: CanonicalProposalSchema, @@ -22632,8 +22717,6 @@ export const ListProposalsResponseSchema = /* @__PURE__ */ (() => (z.object({ later_proposals: LaterProposalsStateSchema.optional() }).passthrough()), next_cursor: z.string().min(1).optional(), - replayed: z.literal(true).optional(), - context: ContextObjectSchema.optional(), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -22707,19 +22790,19 @@ export const CreateMediaBuyRequestSchema: z.ZodObject<{ [K in keyof CreateMediaB })))(); export const CreateMediaBuyResponseSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().max(2000).optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives."))))(); // @ts-ignore -- preserve the public schema type across lossy TS-to-Zod projection details. @@ -22792,7 +22875,13 @@ export const GetMediaBuysResponseMediaBuySchema: z.ZodType = /* @__PURE__ */ (() canceled_by: CanceledBySchema, reason: z.string().max(500).optional() }).passthrough().optional(), + cancellation_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), + flight_history: z.array(z.object({ + recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), + stop_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") + }).passthrough()).max(64).optional(), revision: z.int().min(1).optional(), created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), @@ -22819,19 +22908,19 @@ export const GetMediaBuysResponseMediaBuySchema: z.ZodType = /* @__PURE__ */ (() }).passthrough()))(); export const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().gte(1).lte(99).int().optional(), view: ReportingStatusViewSchema.optional(), ledger_snapshot_id: z.string().min(1).max(255).optional(), ledger_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), @@ -22846,7 +22935,8 @@ export const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => (z.object delivery_config_generations: z.array(z.object({ delivery_config_id: z.string().min(1).max(64), delivery_config_version: z.int().min(1), - feed_purpose: ReportingFeedPurposeSchema + feed_purpose: ReportingFeedPurposeSchema, + offering_id: z.string().min(1).max(128).regex(/^[A-Za-z0-9_.:-]{1,128}$/).optional() }).passthrough()), feed_purposes: z.array(ReportingFeedPurposeSchema), finality: z.array(ReportingFinalitySchema), @@ -22881,7 +22971,7 @@ export const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => (z.object ext: ExtensionObjectSchema.optional() }).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => { // reporting evidence strictness - const closedStructures = {"scope":{"allowedFields":["period_start","period_end","scope_closed","media_buy_ids","all_accessible_media_buys","delivery_config_generations","feed_purposes","finality","ledger_retained_from","coverage_complete"],"requiredFields":["period_start","period_end","scope_closed","all_accessible_media_buys","delivery_config_generations","feed_purposes","finality","ledger_retained_from","coverage_complete"]},"deliveryConfigGeneration":{"allowedFields":["delivery_config_id","delivery_config_version","feed_purpose"],"requiredFields":["delivery_config_id","delivery_config_version","feed_purpose"]},"obligationCounts":{"allowedFields":["total","waiting","healthy","delayed","action_required","complete","consumer_status_pending"],"requiredFields":["total","waiting","healthy","delayed","action_required","complete"]},"pagination":{"allowedFields":["has_more","cursor","total_count"],"requiredFields":["has_more"]},"paginationRequiredByView":{"periods":["has_more","total_count"],"revision":["has_more","total_count"]}} as const; + const closedStructures = {"scope":{"allowedFields":["period_start","period_end","scope_closed","media_buy_ids","all_accessible_media_buys","delivery_config_generations","feed_purposes","finality","ledger_retained_from","coverage_complete"],"requiredFields":["period_start","period_end","scope_closed","all_accessible_media_buys","delivery_config_generations","feed_purposes","finality","ledger_retained_from","coverage_complete"]},"deliveryConfigGeneration":{"allowedFields":["delivery_config_id","delivery_config_version","feed_purpose","offering_id"],"requiredFields":["delivery_config_id","delivery_config_version","feed_purpose"]},"obligationCounts":{"allowedFields":["total","waiting","healthy","delayed","action_required","complete","consumer_status_pending"],"requiredFields":["total","waiting","healthy","delayed","action_required","complete"]},"pagination":{"allowedFields":["has_more","cursor","total_count"],"requiredFields":["has_more"]},"paginationRequiredByView":{"periods":["has_more","total_count"],"revision":["has_more","total_count"]}} as const; const addIssues = (schema: z.ZodType, candidate: unknown, path: Array) => { const parsed = schema.safeParse(candidate); if (parsed.success) return; @@ -22972,6 +23062,7 @@ export const ListedCreativeNamedFormatReferenceSchema: z.ZodType = /* @__PURE__ creative_id: z.string(), platform_id: z.string().optional(), revision_id: CreativeRevisionIDSchema.optional(), + staged_update: CreativeStagedUpdateSchema.optional(), seller_revision: z.union([z.number(), z.string()]).optional(), representation_selection: RepresentationSelectionSchema.optional(), account: AccountSchema.optional(), @@ -23037,19 +23128,19 @@ export const ListedCreativeNamedFormatReferenceSchema: z.ZodType = /* @__PURE__ }).passthrough()))(); export const SyncPrincipalResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), result: z.union([AppliedPrincipalConfigurationSchema, ValidatedPrincipalDryRunSchema, FailedPrincipalSyncSchema]), ext: ExtensionObjectSchema.optional() }).passthrough()))(); @@ -23067,35 +23158,35 @@ export const SyncAccountsRequestSchema = /* @__PURE__ */ (() => (z.object({ }).passthrough()))(); export const SyncAccountsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const ComplyTestControllerRequestSchema: z.ZodObject, any> = /* @__PURE__ */ (() => (z.object({ @@ -23115,13 +23206,15 @@ export const ComplyTestControllerRequestSchema: z.ZodObject (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().max(128).optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), - payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional() + payload: z.object({}).passthrough().optional() }).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives."))))(); export const AdCPAsyncResponseDataSchema: z.ZodType = /* @__PURE__ */ (() => (z.union([GetProductsResponseSchema, GetProductsRejectedSchema, GetProductsAsyncWorkingSchema, GetProductsAsyncInputRequiredSchema, GetProductsAsyncSubmittedSchema, RequestProposalsResponseSchema, RequestProposalsAsyncSubmittedSchema, RefineProposalsResponseSchema, RefineProposalsAsyncSubmittedSchema, DeclineProposalsResponseSchema, MediaBuyCommitmentResponseSchema, ControlMediaBuyResponseSchema, CompactTaskSubmittedSchema, CompactTaskWorkingSchema, CompactTaskInputRequiredSchema, GetSignalsResponseSchema, GetSignalsAsyncWorkingSchema, GetSignalsAsyncSubmittedSchema, CreateMediaBuyResponseSchema, CreateMediaBuyAsyncWorkingSchema, CreateMediaBuyAsyncInputRequiredSchema, CreateMediaBuyAsyncSubmittedSchema, UpdateMediaBuyResponseSchema, UpdateMediaBuyAsyncWorkingSchema, UpdateMediaBuyAsyncInputRequiredSchema, UpdateMediaBuyAsyncSubmittedSchema, MediaBuyDeliveryWebhookResultSchema, BuildCreativeResponseSchema, PreviewCreativeResponseSchema, BuildCreativeAsyncWorkingSchema, BuildCreativeAsyncInputRequiredSchema, BuildCreativeAsyncSubmittedSchema, GetCreativeFeaturesResponseSchema, GetCreativeFeaturesAsyncSubmittedSchema, SyncCreativesResponseSchema, SyncCreativesAsyncWorkingSchema, SyncCreativesAsyncInputRequiredSchema, SyncCreativesAsyncSubmittedSchema, SyncCatalogsResponseSchema, SyncCatalogsAsyncWorkingSchema, SyncCatalogsAsyncInputRequiredSchema, SyncCatalogsAsyncSubmittedSchema])))(); @@ -23230,12 +23323,12 @@ export const MCPWebhookPayloadSchema: z.ZodType = /* @__PURE__ */ (() => (z.obje idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/), notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/).optional(), operation_id: z.string(), - task_id: z.string(), + task_id: TaskIDSchema, task_type: TaskTypeSchema, protocol: AdCPProtocolSchema.optional(), status: TaskStatusSchema, timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), - message: z.string().optional(), + message: TaskMessageSchema.optional(), context_id: z.string().optional(), token: z.string().min(16).max(4096).optional(), result: AdCPAsyncResponseDataSchema.optional() @@ -23268,19 +23361,19 @@ export const PlacementDefinitionSchema = /* @__PURE__ */ (() => (z.object({}).pa export const TrustJsonSchema = /* @__PURE__ */ (() => (z.union([AuthoritativeLocationRedirectSchema, TrustRecordSchema])))(); export const GetMediaBuysResponseSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), media_buys: z.array(GetMediaBuysResponseMediaBuySchema), errors: z.array(ErrorSchema).optional(), pagination: PaginationResponseSchema.optional(), @@ -23289,19 +23382,19 @@ export const GetMediaBuysResponseSchema: z.ZodType = /* @__PURE__ */ (() => (z.o }).passthrough()))(); export const ListCreativesResponseSchema: z.ZodType = /* @__PURE__ */ (() => (z.object({ + adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), + adcp_major_version: z.number().int().gte(1).lte(99).optional(), context_id: z.string().optional(), context: ContextObjectSchema.optional(), - task_id: z.string().optional(), + task_id: TaskIDSchema.optional(), status: TaskStatusSchema, - message: z.string().optional(), + message: TaskMessageSchema.optional(), timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), replayed: z.boolean().optional(), adcp_error: ErrorSchema.optional(), push_notification_config: PushNotificationConfigSchema.optional(), governance_context: z.string().min(1).max(4096).regex(new RegExp("^[\\x20-\\x7E]+$")).optional(), payload: z.object({}).passthrough().optional(), - adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(), - adcp_major_version: z.number().int().gte(1).lte(99).optional(), query_summary: z.object({ total_matching: z.int().min(0), returned: z.int().min(0), diff --git a/src/lib/types/targeting-keys.generated.ts b/src/lib/types/targeting-keys.generated.ts index 8b0ff73df..c20bd4461 100644 --- a/src/lib/types/targeting-keys.generated.ts +++ b/src/lib/types/targeting-keys.generated.ts @@ -1,7 +1,7 @@ // Generated by scripts/generate-targeting-keys.ts. Do not edit. import type { TargetingOverlay, TargetingOverlaySupport } from './core.generated'; -/** All TargetingOverlay keys in AdCP 3.3.0-beta.2, including extension fields. */ +/** All TargetingOverlay keys in AdCP 3.3.0-beta.3, including extension fields. */ export const TargetingOverlayKeys = Object.freeze([ "geo_countries", "geo_countries_exclude", @@ -44,7 +44,7 @@ export const TargetingOverlayKeys = Object.freeze([ "negative_keywords" ] as const satisfies readonly (keyof TargetingOverlay)[]); -/** All TargetingOverlaySupport keys in AdCP 3.3.0-beta.2, including extension fields. */ +/** All TargetingOverlaySupport keys in AdCP 3.3.0-beta.3, including extension fields. */ export const TargetingOverlaySupportKeys = Object.freeze([ "geo_countries", "geo_countries_exclude", diff --git a/src/lib/types/tools.generated.ts b/src/lib/types/tools.generated.ts index a38d90210..ab338d0d0 100644 --- a/src/lib/types/tools.generated.ts +++ b/src/lib/types/tools.generated.ts @@ -92,6 +92,7 @@ import type { CreativeApprovalStatus, CreativeAsset, CreativeBrief, + CreativeChangeKind, CreativeEventReasonCode, CreativeIdentifierType, CreativeMergeRejectionReason, @@ -176,6 +177,7 @@ import type { LandingPageRequirement, LaterProposalReason, LiftDimension, + LiveUpdateServingMode, LogoSlot, MacroDialectFamily, MacroMappingStatus, @@ -318,7 +320,7 @@ import type { WebhookSigningProfile, } from './core.generated'; -export type { AccountCurrencyMode, AccountReference, AccountRequestResolution, AccountRequestState, AccountScope, AccountStatus, ActionNotAllowedReason, ActionSource, AdCPProtocol, AdCPSpecialism, AdCPVersionEnvelope, AdvertiserIndustry, AgeDeterminationBasis, AgeVerificationMethod, AgentOnboardingMode, AgentOnboardingRequirementKind, AssessmentStatus, AssetContentType, AssetVariant, AttestationClaim, AttributionMethodology, AttributionModel, AudienceConstraints, AudienceEvidenceMethodology, AudienceEvidenceRelationship, AudienceMatchRateBasis, AudienceResolutionMethod, AudienceSizePrecision, AudienceSource, AudienceStatus, AudienceSubjectType, AudioChannelLayout, AudioDistributionType, AuthenticationScheme, AvailabilityStatus, AvailableMetric, BillingParty, BinaryVerdict, BrandAgentType, BrandReference, BrowserFamily, BudgetChangeConstraints, BusinessEntity, C2PAWatermarkAction, CTVAdExperience, CanceledBy, CancellationPolicy, CanonicalFormatAgentPlacementAISurfaceSponsoredPlacement, CanonicalFormatBase, CanonicalFormatCoordinatedPlacements, CanonicalFormatDAASTAudio, CanonicalFormatDisplayTag, CanonicalFormatHTML5Banner, CanonicalFormatHostedAudio, CanonicalFormatHostedVideo, CanonicalFormatImage, CanonicalFormatImageCarousel, CanonicalFormatNativeInFeed, CanonicalFormatOption, CanonicalFormatResponsiveCreative, CanonicalFormatSellerRenderedStatefulDisplay, CanonicalFormatSponsoredPlacementRetailMediaCatalogDriven, CanonicalFormatVASTAudio, CanonicalFormatVASTVideo, CanonicalMediaBuyActionMode, CanonicalMediaBuyActionName, CanonicalOptimizationGoal, CanonicalProposal, CatalogAction, CatalogItemDeliveryMetrics, CatalogItemStatus, CatalogType, CloudStorageProtocol, CoBrandingRequirement, CollectionCadence, CollectionKind, CollectionMechanism, CollectionRelationship, CollectionStatus, CommittedMediaBuy, CompletionSource, ConsentBasis, ContentIDType, ContentRatingSystem, CountryFusedPostalCodeSystem, CreativeAction, CreativeActivationMethod, CreativeAgentCapability, CreativeApprovalStatus, CreativeAsset, CreativeBrief, CreativeEventReasonCode, CreativeIdentifierType, CreativeMergeRejectionReason, CreativeMotionLevel, CreativeQuality, CreativeSelectionStrategy, CreativeSortField, CreativeStatus, DAASTTrackingEvent, DAASTVersion, DOOHMotionType, DayOfWeek, DaypartTarget, DaypartTimeGranularity, DaypartTimezoneMode, DelegationAuthority, DeliveryMetricAggregate, DeliveryMetrics, DeliveryProjectionBasis, DeliveryProjectionEndState, DeliveryRecipientCloud, DeliveryStatus, DeliveryType, DemographicSystem, DerivativeType, DevicePlatform, DeviceType, DigitalSourceType, DimensionUnit, DisclosurePersistence, DisclosurePosition, DistanceUnit, DistributionIdentifierType, EffectiveTimingConstraints, EmbeddedProvenanceMethod, ErrorCode, ErrorScope, EscalationSeverity, EventType, Exclusivity, ExecutionReadinessStatus, ExtensionObject, FeatureCheckStatus, FeedFormat, FeedbackSource, Fixed, FlightChangeConstraints, ForecastMethod, ForecastPoint, ForecastRangeUnit, ForecastableMetric, Format, FormatIDParameter, FormatReferenceStructuredObject, FrameRateType, FrequencyCapControlMode, FrequencyCapMutableField, FrequencyCapScope, GOPType, GenreTaxonomy, GeoDeliveryMetrics, GeographicTargetingLevel, GetProductsAsyncSubmitted, GovernanceDecision, GovernanceDomain, GovernanceMode, GovernancePhase, HTTPMethod, HistoryEntryType, ImageAsset, ImpairmentOfflineState, ImpairmentReasonCode, IndicatorType, InstallmentStatus, InvoiceKind, JavaScriptModuleType, KeywordDeliveryMetrics, LandingPageRequirement, LaterProposalReason, LiftDimension, LogoSlot, MacroDialectFamily, MacroMappingStatus, MacroProcessingActor, MacroProcessingOperation, MacroResolutionReason, MacroValueContext, MakegoodRemedy, MarkdownFlavor, MatchIDType, MatchType, MeasurementTerms, MediaBuyActionMode, MediaBuyAvailableAction, MediaBuyChangeTermConstraints, MediaBuyDeliveryWebhookResult, MediaBuyFrequencyCapControlMode, MediaBuyHealth, MediaBuyLineageReason, MediaBuyStatus, MediaBuyValidAction, MediaChannel, MetricScope, MetricType, MetroAreaSystem, MoovAtomPosition, MultiSize, None, NotificationType, OfferReason, OfferingAvailabilityStatus, OptimizationGoal, OutcomeTargetCostStrength, OutcomeType, Pacing, PackageCountConstraints, PackageUpdate, PaymentTerms, PendingActionKind, PendingActionParty, PerformanceBaseline, PerformanceStandardMetric, PixelTrackingEvent, PlatformExtensionReference, PolicyCategory, PolicyEnforcementLevel, PostalCodeSystem, PostalCountrySystem, PreviewOutputFormat, PriceAdjustmentKind, PricingModel, PricingStructure, PrincipalKind, PrincipalRelationshipStatus, ProductAllowedAction, ProductionQuality, PropertyIdentifierTypes, PropertyType, ProposalDeclineReason, ProposalDisposition, ProposalInitiator, ProposalRefinementReason, ProposalStatus, ProtocolEnvelope, Provenance, PublisherIdentifierTypes, PublisherPropertySelector, PurchaseType, ReachAggregation, ReachUnit, ReportingCustody, ReportingDeliveryMethod, ReportingDestinationSetupState, ReportingDimension, ReportingFinality, ReportingFrequency, ReportingHealth, RepresentationSelectionStrategy, RequestProposalsResponse, RequestSigningErrorCode, Responsive, RestrictedAttribute, RightType, RightUse, RightsBillingPeriod, RightsConstraint, SISessionStatus, ScanType, ScopedCreativeApproval, SellerPolicyDeclineReason, SignalAvailabilityType, SignalDefinitionEnrichment, SignalDeliveryStatus, SignalSource, SignalStatus, SignalTargetingExpression, SignalValueType, SizeModeMutex, SnapshotUnavailableReason, SocialPlacementSurface, SortDirection, SortMetric, SpecialCategory, SponsoredPlacementType, SpotStatus, TMPResponseType, TalentRole, TargetingOverlayRequirements, TargetingOverlaySupport, TaskStatus, TaskType, TrackerExecutionActor, TrackerFiringPath, TransportMode, TravelTimeUnit, UIDType, URLAssetType, UniversalMacro, UpdateFrequency, VASTMediaDeliveryMethod, VASTTrackingEvent, VASTVersion, ValidationMode, VendorRelationship, VideoPlacementType, ViewThresholdBasis, ViewabilityStandard, WCAGLevel, WarningAffectedResource, WarningCode, WatermarkMediaType, WebhookResponseType, WebhookSecurityMethod, WebhookSigningProfile } from './core.generated'; +export type { AccountCurrencyMode, AccountReference, AccountRequestResolution, AccountRequestState, AccountScope, AccountStatus, ActionNotAllowedReason, ActionSource, AdCPProtocol, AdCPSpecialism, AdCPVersionEnvelope, AdvertiserIndustry, AgeDeterminationBasis, AgeVerificationMethod, AgentOnboardingMode, AgentOnboardingRequirementKind, AssessmentStatus, AssetContentType, AssetVariant, AttestationClaim, AttributionMethodology, AttributionModel, AudienceConstraints, AudienceEvidenceMethodology, AudienceEvidenceRelationship, AudienceMatchRateBasis, AudienceResolutionMethod, AudienceSizePrecision, AudienceSource, AudienceStatus, AudienceSubjectType, AudioChannelLayout, AudioDistributionType, AuthenticationScheme, AvailabilityStatus, AvailableMetric, BillingParty, BinaryVerdict, BrandAgentType, BrandReference, BrowserFamily, BudgetChangeConstraints, BusinessEntity, C2PAWatermarkAction, CTVAdExperience, CanceledBy, CancellationPolicy, CanonicalFormatAgentPlacementAISurfaceSponsoredPlacement, CanonicalFormatBase, CanonicalFormatCoordinatedPlacements, CanonicalFormatDAASTAudio, CanonicalFormatDisplayTag, CanonicalFormatHTML5Banner, CanonicalFormatHostedAudio, CanonicalFormatHostedVideo, CanonicalFormatImage, CanonicalFormatImageCarousel, CanonicalFormatNativeInFeed, CanonicalFormatOption, CanonicalFormatResponsiveCreative, CanonicalFormatSellerRenderedStatefulDisplay, CanonicalFormatSponsoredPlacementRetailMediaCatalogDriven, CanonicalFormatVASTAudio, CanonicalFormatVASTVideo, CanonicalMediaBuyActionMode, CanonicalMediaBuyActionName, CanonicalOptimizationGoal, CanonicalProposal, CatalogAction, CatalogItemDeliveryMetrics, CatalogItemStatus, CatalogType, CloudStorageProtocol, CoBrandingRequirement, CollectionCadence, CollectionKind, CollectionMechanism, CollectionRelationship, CollectionStatus, CommittedMediaBuy, CompletionSource, ConsentBasis, ContentIDType, ContentRatingSystem, CountryFusedPostalCodeSystem, CreativeAction, CreativeActivationMethod, CreativeAgentCapability, CreativeApprovalStatus, CreativeAsset, CreativeBrief, CreativeChangeKind, CreativeEventReasonCode, CreativeIdentifierType, CreativeMergeRejectionReason, CreativeMotionLevel, CreativeQuality, CreativeSelectionStrategy, CreativeSortField, CreativeStatus, DAASTTrackingEvent, DAASTVersion, DOOHMotionType, DayOfWeek, DaypartTarget, DaypartTimeGranularity, DaypartTimezoneMode, DelegationAuthority, DeliveryMetricAggregate, DeliveryMetrics, DeliveryProjectionBasis, DeliveryProjectionEndState, DeliveryRecipientCloud, DeliveryStatus, DeliveryType, DemographicSystem, DerivativeType, DevicePlatform, DeviceType, DigitalSourceType, DimensionUnit, DisclosurePersistence, DisclosurePosition, DistanceUnit, DistributionIdentifierType, EffectiveTimingConstraints, EmbeddedProvenanceMethod, ErrorCode, ErrorScope, EscalationSeverity, EventType, Exclusivity, ExecutionReadinessStatus, ExtensionObject, FeatureCheckStatus, FeedFormat, FeedbackSource, Fixed, FlightChangeConstraints, ForecastMethod, ForecastPoint, ForecastRangeUnit, ForecastableMetric, Format, FormatIDParameter, FormatReferenceStructuredObject, FrameRateType, FrequencyCapControlMode, FrequencyCapMutableField, FrequencyCapScope, GOPType, GenreTaxonomy, GeoDeliveryMetrics, GeographicTargetingLevel, GetProductsAsyncSubmitted, GovernanceDecision, GovernanceDomain, GovernanceMode, GovernancePhase, HTTPMethod, HistoryEntryType, ImageAsset, ImpairmentOfflineState, ImpairmentReasonCode, IndicatorType, InstallmentStatus, InvoiceKind, JavaScriptModuleType, KeywordDeliveryMetrics, LandingPageRequirement, LaterProposalReason, LiftDimension, LiveUpdateServingMode, LogoSlot, MacroDialectFamily, MacroMappingStatus, MacroProcessingActor, MacroProcessingOperation, MacroResolutionReason, MacroValueContext, MakegoodRemedy, MarkdownFlavor, MatchIDType, MatchType, MeasurementTerms, MediaBuyActionMode, MediaBuyAvailableAction, MediaBuyChangeTermConstraints, MediaBuyDeliveryWebhookResult, MediaBuyFrequencyCapControlMode, MediaBuyHealth, MediaBuyLineageReason, MediaBuyStatus, MediaBuyValidAction, MediaChannel, MetricScope, MetricType, MetroAreaSystem, MoovAtomPosition, MultiSize, None, NotificationType, OfferReason, OfferingAvailabilityStatus, OptimizationGoal, OutcomeTargetCostStrength, OutcomeType, Pacing, PackageCountConstraints, PackageUpdate, PaymentTerms, PendingActionKind, PendingActionParty, PerformanceBaseline, PerformanceStandardMetric, PixelTrackingEvent, PlatformExtensionReference, PolicyCategory, PolicyEnforcementLevel, PostalCodeSystem, PostalCountrySystem, PreviewOutputFormat, PriceAdjustmentKind, PricingModel, PricingStructure, PrincipalKind, PrincipalRelationshipStatus, ProductAllowedAction, ProductionQuality, PropertyIdentifierTypes, PropertyType, ProposalDeclineReason, ProposalDisposition, ProposalInitiator, ProposalRefinementReason, ProposalStatus, ProtocolEnvelope, Provenance, PublisherIdentifierTypes, PublisherPropertySelector, PurchaseType, ReachAggregation, ReachUnit, ReportingCustody, ReportingDeliveryMethod, ReportingDestinationSetupState, ReportingDimension, ReportingFinality, ReportingFrequency, ReportingHealth, RepresentationSelectionStrategy, RequestProposalsResponse, RequestSigningErrorCode, Responsive, RestrictedAttribute, RightType, RightUse, RightsBillingPeriod, RightsConstraint, SISessionStatus, ScanType, ScopedCreativeApproval, SellerPolicyDeclineReason, SignalAvailabilityType, SignalDefinitionEnrichment, SignalDeliveryStatus, SignalSource, SignalStatus, SignalTargetingExpression, SignalValueType, SizeModeMutex, SnapshotUnavailableReason, SocialPlacementSurface, SortDirection, SortMetric, SpecialCategory, SponsoredPlacementType, SpotStatus, TMPResponseType, TalentRole, TargetingOverlayRequirements, TargetingOverlaySupport, TaskStatus, TaskType, TrackerExecutionActor, TrackerFiringPath, TransportMode, TravelTimeUnit, UIDType, URLAssetType, UniversalMacro, UpdateFrequency, VASTMediaDeliveryMethod, VASTTrackingEvent, VASTVersion, ValidationMode, VendorRelationship, VideoPlacementType, ViewThresholdBasis, ViewabilityStandard, WCAGLevel, WarningAffectedResource, WarningCode, WatermarkMediaType, WebhookResponseType, WebhookSecurityMethod, WebhookSigningProfile } from './core.generated'; // Tool Parameter and Response Types // Generated from official AdCP schemas @@ -5185,6 +5187,14 @@ export interface PaginationRequest { } // get_products response +/** + * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. A submitted response carries it: every submitted body and branch composes core/task-submitted.json, which requires it. + */ +export type TaskID = string; +/** + * Human-readable summary of the task result, suitable for display to end users or for AI agent comprehension. At most 2,000 characters, and untrusted input to the receiver: see core/task-message.json. + */ +export type TaskMessage = string; /** * Represents available advertising inventory */ @@ -7934,25 +7944,28 @@ export type ExecutionRequirementReadiness = { */ export interface GetProductsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -7969,15 +7982,6 @@ export interface GetProductsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Array of matching products */ @@ -11207,6 +11211,41 @@ export type ListProductsResponse = { * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ adcp_version?: string; + /** + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. + */ + adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * Whether this response carries a product page or confirms that the selected feed has not changed. */ @@ -11241,15 +11280,9 @@ export type ListProductsResponse = { description: string; estimated_wait?: Duration; }[]; - replayed?: true; - context?: ContextObject; ext?: ExtensionObject; } & ( | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; /** * Whether this response carries a product page or confirms that the selected feed has not changed. */ @@ -11284,15 +11317,10 @@ export type ListProductsResponse = { description: string; estimated_wait?: Duration; }[]; - replayed?: true; context?: ContextObject; ext?: ExtensionObject; } | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; /** * Whether this response carries a product page or confirms that the selected feed has not changed. */ @@ -11326,7 +11354,6 @@ export type ListProductsResponse = { description: string; estimated_wait?: Duration; }[]; - replayed?: true; context?: ContextObject; ext?: ExtensionObject; } @@ -12179,6 +12206,45 @@ export type CanonicalReportingCommitment = * One page of proposals for the requested account with their seller-tracked dispositions, plus the current state of every opportunity those proposals belong to. Each snapshot is returned byte-for-byte as issued, so terms_digest still verifies; lifecycle state lives beside it, never inside it. Experimental (media_buy.open_opportunities). */ export interface ListProposalsResponse { + /** + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. + */ + adcp_version?: string; + /** + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. + */ + adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; outcome: 'listed'; proposals: { proposal: CanonicalProposal; @@ -12220,8 +12286,6 @@ export interface ListProposalsResponse { * @minLength 1 */ next_cursor?: string; - replayed?: true; - context?: ContextObject; ext?: ExtensionObject; } /** @@ -12479,6 +12543,7 @@ export interface LaterProposalsState { updated_at: string; } + // list_collections parameters /** * Experimental (media_buy.collection_catalog), added in AdCP 3.3. Read the selling agent's catalog of collection cards: look up specific collections by key, or browse with filters and pages. Returns the same core/response-collection.json copies, under the same authority rules, as include_collections on product and proposal reads, and never returns products. Not to be confused with list_collection_lists, which lists buyer-owned collection targeting lists on a governance agent. Side-effect free: the call never provisions an account. It is the bootstrap and repair read for collection_card.* and collection_catalog.bulk_change webhooks, which are registered only through sync_accounts notification_configs; the request takes no push_notification_config, so a call never creates a subscription. Sellers implementing it MUST list media_buy.collection_catalog and media_buy.collection_cards in experimental_features. A seller MUST NOT serve this task to a caller whose adcp_version is below 3.3; it fails the request with UNSUPPORTED_FEATURE. @@ -12569,6 +12634,45 @@ export interface ListCollectionsRequest { * Experimental (media_buy.collection_catalog), added in AdCP 3.3. One page of the selling agent's collection cards, or confirmation that the selected catalog has not changed. Entries are core/response-collection.json copies under the authority rules defined there and for include_collections: adagents.json stays the root of authorization, a copy wins only on images, sample_content, url, description, season, cadence and distribution[].followers, and a copy of an undeclared collection or from an agent adagents.json does not authorize is unverified display data that never feeds carriage verification. For the same key, account and moment, the copy MUST equal the one a product or proposal read with include_collections returns. The response carries no products, pricing, availability or account terms. */ export type ListCollectionsResponse = { + /** + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. + */ + adcp_version?: string; + /** + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. + */ + adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * listed when the response carries a page of collections; unchanged when if_collections_version matched the current version of the selected catalog. */ @@ -12587,8 +12691,6 @@ export type ListCollectionsResponse = { * public when the visible set does not depend on the account, and always when the request carried no account; account when it does. A seller MAY return public to a conditional request whose earlier response was account, meaning the account no longer has a distinct visible set; the buyer drops its account-scoped copy and uses the public one. */ cache_scope?: 'public' | 'account'; - replayed?: true; - context?: ContextObject; ext?: ExtensionObject; } & ( | { @@ -12610,7 +12712,6 @@ export type ListCollectionsResponse = { * public when the visible set does not depend on the account, and always when the request carried no account; account when it does. A seller MAY return public to a conditional request whose earlier response was account, meaning the account no longer has a distinct visible set; the buyer drops its account-scoped copy and uses the public one. */ cache_scope: 'public' | 'account'; - replayed?: true; context?: ContextObject; ext?: ExtensionObject; } @@ -12628,7 +12729,6 @@ export type ListCollectionsResponse = { * public when the visible set does not depend on the account, and always when the request carried no account; account when it does. A seller MAY return public to a conditional request whose earlier response was account, meaning the account no longer has a distinct visible set; the buyer drops its account-scoped copy and uses the public one. */ cache_scope: 'public' | 'account'; - replayed?: true; context?: ContextObject; ext?: ExtensionObject; } @@ -13014,7 +13114,6 @@ export type TargetingOverlay1 = TargetingUnknownAgeEligibilityConstraint & keyword_targets?: TargetingKeywords; negative_keywords?: TargetingNegativeKeywords; }; - /** * Response-level confirmation of structured targeting interpreted from explicit hard requirements in the brief. Sellers MUST emit this when that interpretation materially affects eligibility, pricing, or forecasting; otherwise it remains a best practice. Product-specific changes to explicit criteria.targeting_overlay values remain on Product.targeting_resolution. */ @@ -13172,11 +13271,7 @@ export interface ProductChangeMap { * One ordered result per requested source proposal. Revision results may carry multiple immutable draft proposals when alternatives were requested; finalization and hold extension each return one committed proposal per source. Products contains the compact canonical products needed to evaluate the resulting terms. */ export type RefineProposalsResponse = - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + | (ProtocolEnvelope & { /** * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. */ @@ -13272,21 +13367,12 @@ export type RefineProposalsResponse = * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. */ collections?: ResponseCollection[]; - status?: 'completed'; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status?: 'completed'; + }) + | (ProtocolEnvelope & { /** * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. */ @@ -13321,21 +13407,12 @@ export type RefineProposalsResponse = * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. */ collections?: ResponseCollection[]; - status?: 'completed'; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status?: 'completed'; + }) + | (ProtocolEnvelope & { /** * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. */ @@ -13431,15 +13508,6 @@ export type RefineProposalsResponse = * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. */ collections?: ResponseCollection[]; - status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; /** * Optional estimate, on a submitted response to a finalize-only or extend_hold-only request, of when the seller expects to resolve the finalize or extension, for example when a creator, host or talent must agree before the hold or its extension. Same semantics as on `create_media_buy`: an estimate, not a commitment or expiry; buyers SHOULD schedule a status check for it and MUST NOT treat a passed timestamp as failure. Sellers SHOULD NOT send it on revise requests. * @format date-time @@ -13448,13 +13516,10 @@ export type RefineProposalsResponse = errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; + status: 'submitted'; + task_id: TaskID; + }) + | (ProtocolEnvelope & { /** * Results in the request's refinements[] order; position carries no ranking. If any result is finalized, every result MUST be finalized; under inventory_hold semantics a finalize batch either creates every requested hold or none, and under terms_only semantics (get_adcp_capabilities media_buy.proposal_refinement.hold_semantics, or a draft hold_policy with available false) it commits every requested proposal's terms or none, with no inventory hold placed for those entries. An extend_hold batch either extends every requested hold or none. Every returned proposal carries parent_proposal_id equal to the result's source_proposal_id, making negotiation lineage reconstructible from the proposals alone. */ @@ -13489,15 +13554,6 @@ export type RefineProposalsResponse = * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. */ collections?: ResponseCollection[]; - status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; /** * Optional estimate, on a submitted response to a finalize-only or extend_hold-only request, of when the seller expects to resolve the finalize or extension, for example when a creator, host or talent must agree before the hold or its extension. Same semantics as on `create_media_buy`: an estimate, not a commitment or expiry; buyers SHOULD schedule a status check for it and MUST NOT treat a passed timestamp as failure. Sellers SHOULD NOT send it on revise requests. * @format date-time @@ -13506,8 +13562,9 @@ export type RefineProposalsResponse = errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - }; + status: 'submitted'; + task_id: TaskID; + }); /** * Confirmation of structured targeting interpreted from this refinement's explicit hard prose instructions. Required when that interpretation materially affects the revised proposal's eligibility, pricing, or forecast; otherwise a best practice. */ @@ -13599,7 +13656,7 @@ export interface DeclineProposalsRequest { * One ordered terminal result for each requested proposal decline. */ export type DeclineProposalsResponse = - | { + | (ProtocolEnvelope & { /** * One result per requested decline, in request order. Empty only when the request carried an empty declines array with an opportunity update. */ @@ -13624,16 +13681,12 @@ export type DeclineProposalsResponse = reason: string; } )[]; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - } - | { + status?: 'completed'; + }) + | (ProtocolEnvelope & { /** * One result per requested decline, in request order. Empty only when the request carried an empty declines array with an opportunity update. */ @@ -13658,21 +13711,12 @@ export type DeclineProposalsResponse = reason: string; } )[]; - status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; - }; - + status: 'submitted'; + task_id: TaskID; + }); // buy_products parameters /** @@ -13882,7 +13926,7 @@ export type BuyProductsResponse = MediaBuyCommitmentResponse; /** * Shared result for clean product purchase and proposal acceptance. A successful result returns the MediaBuy identity and the immutable accepted commercial snapshot without embedding creative or package graphs. Optional warnings report non-blocking observations at the commitment boundary; continuing conditions remain readable as indicators through get_media_buys. */ -export type MediaBuyCommitmentResponse = CommittedMediaBuy | CommitmentError | CommitmentSubmitted; +export type MediaBuyCommitmentResponse = ProtocolEnvelope & (CommittedMediaBuy | CommitmentError | CommitmentSubmitted); /** * A currently available MediaBuy action with the compact-lifecycle task an SDK calls to exercise it. Deprecated coarse action values are absent. In AdCP 3.3, update_creative_start_policy is an operational package control with an explicit eligible package scope, independent of commercial change terms. */ @@ -13940,6 +13984,7 @@ export type Warning = { }; ext?: ExtensionObject; }; +export type CommitmentSubmitted = TaskSubmitted; export interface CommitmentError { status: 'failed'; /** @@ -13948,20 +13993,13 @@ export interface CommitmentError { errors: [Error, ...Error[]]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } -export interface CommitmentSubmitted { +/** + * The submitted task acknowledgement: status is submitted and task_id identifies the task the caller polls and webhooks reference. Every submitted response body and branch composes this schema through allOf, so the rule lives in one place. + */ +export interface TaskSubmitted { status: 'submitted'; - task_id: string; - message?: string; - /** - * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. - */ - expected_confirmation_at?: string; - errors?: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - replayed?: true; + task_id: TaskID; } @@ -14238,7 +14276,7 @@ export interface KeywordTarget { /** * Result of applying operational controls without embedding the package or creative object graphs. */ -export type ControlMediaBuyResponse = ControlApplied | ControlError | ControlSubmitted; +export type ControlMediaBuyResponse = ProtocolEnvelope & (ControlApplied | ControlError | ControlSubmitted); export interface ControlApplied { status: 'completed'; /** @@ -14265,29 +14303,19 @@ export interface ControlApplied { })[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } export interface ControlError { status: 'failed'; errors: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } export interface ControlSubmitted { status: 'submitted'; - /** - * @minLength 1 - */ - task_id: string; - /** - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; errors?: Error[]; context?: ContextObject; ext?: ExtensionObject; - replayed?: true; } @@ -14632,25 +14660,28 @@ export type GroupDaastTrackerAsset = BaseGroupAsset; */ export interface ListCreativeFormatsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -14667,15 +14698,6 @@ export interface ListCreativeFormatsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * @deprecated * Deprecated named-format definitions projected for older 3.x callers. This list is neither the publisher acceptance catalog nor the seller's canonical product deliverability contract. @@ -15359,25 +15381,28 @@ export interface CommittedProposalExecution { */ export type CreateMediaBuyResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -15394,15 +15419,6 @@ export type CreateMediaBuyResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (CreateMediaBuySuccess | CreateMediaBuyError | CreateMediaBuySubmitted); /** * Deprecated in 3.3. 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. @@ -15432,6 +15448,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15457,6 +15474,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15523,6 +15541,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15548,6 +15567,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15614,6 +15634,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15639,6 +15660,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15705,6 +15727,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15730,6 +15753,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15796,6 +15820,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15821,6 +15846,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15887,6 +15913,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15912,6 +15939,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -15978,6 +16006,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16003,6 +16032,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16069,6 +16099,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16094,6 +16125,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16160,6 +16192,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16185,6 +16218,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16251,6 +16285,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16276,6 +16311,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16342,6 +16378,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16367,6 +16404,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16433,6 +16471,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16458,6 +16497,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16524,6 +16564,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16549,6 +16590,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16615,6 +16657,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16640,6 +16683,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16706,6 +16750,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16731,6 +16776,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16797,6 +16843,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -16822,6 +16869,7 @@ export type NotificationConfig = { | 'creative.assignment_changed' | 'indicators.changed' | 'creative.purged' + | 'creative.staged_update_changed' | 'account.status_changed' | 'account.change_recorded' | 'product.created' @@ -18654,19 +18702,8 @@ export interface CreateMediaBuyError { * Async task envelope returned when the media buy cannot be confirmed before the response is emitted — for example, when a guaranteed buy requires IO signing, when governance review is outstanding, or when the seller has queued the request for batch processing. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the media_buy_id and packages land in the terminal result, not this envelope. Do not use a 'pending_approval' MediaBuy.status for this case — that value is not in MediaBuyStatus; IO review and similar pre-issuance workflows are modeled at the task layer only. */ export interface CreateMediaBuySubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, which uses `media_buy_status` for lifecycle state. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The media_buy_id is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting IO signature from sales team; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional estimate of when the seller expects to confirm this request, used when confirmation depends on a scheduled event such as a booking round or a manual review window. A seller SHOULD set it when it knows that event; omit it when it does not. Buyers SHOULD schedule a status check (get_task_status, or reconciling against the webhook) for this time rather than polling tightly before it. This is an estimate, not a commitment: the seller MAY confirm earlier or later, the task status remains authoritative, and buyers MUST NOT treat a passed timestamp as a failure or auto-cancel on it. Sellers SHOULD NOT send a timestamp in the past. Not an expiry or SLA. * @format date-time @@ -18803,25 +18840,28 @@ export interface UpdateMediaBuyRequest { */ export type UpdateMediaBuyResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -18838,15 +18878,6 @@ export type UpdateMediaBuyResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (UpdateMediaBuySuccess | UpdateMediaBuyError | UpdateMediaBuySubmitted); /** * Success response - media buy updated successfully @@ -18944,19 +18975,8 @@ export interface UpdateMediaBuyError { * Async task envelope returned when update_media_buy cannot be confirmed before the response — for example, when operator re-approval is required for mid-flight changes. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the updated media buy state lands in the terminal result, not this envelope. */ export interface UpdateMediaBuySubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose media_buy_id is issued in-line. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Awaiting operator re-approval; typical turnaround 2–4 hours.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. */ @@ -19031,25 +19051,28 @@ export interface GetMediaBuysRequest { */ export interface GetMediaBuysResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -19066,15 +19089,6 @@ export interface GetMediaBuysResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Array of media buys with status, creative approval state, and optional delivery snapshots */ @@ -19218,11 +19232,37 @@ export interface GetMediaBuysResponseMediaBuy { */ reason?: string; }; + /** + * Present only when status is canceled: when delivery stops under the cancellation. It equals cancellation.canceled_at when delivery stops at once, and is later when the seller keeps delivering through a notice period (the product's cancellation_policy.notice_period) or to the end of a committed unit. Not later than end_time. Sellers advertising media_buy.reporting_subscriptions MUST populate it, because subscription reporting is owed through the period containing this instant, not the instant the cancellation was recorded. Buyers use cancellation.canceled_at when it is absent. + * @format date-time + */ + cancellation_effective_at?: string; /** * When the seller moved the buy to completed; present when status is completed. Sellers advertising media_buy.reporting_subscriptions MUST populate it for completed buys, because a buy that completes before end_time stops being owed reporting at this instant. * @format date-time */ completed_at?: string; + /** + * Retroactive flight edits, oldest first, so a buyer can recompute which periods a reporting subscription owed (media_buy.reporting_subscriptions). The buy's flight runs from start_time to its stop time, as the reporting-subscription.json coverage rule defines it. An edit is retroactive when the start_time or stop time before or after it is earlier than the instant the seller recorded it. Each entry carries the flight in force before that edit. The flight in force at an instant X is the one in the earliest entry recorded after X, or the current flight when no entry is. Edits whose before and after values all lie after recorded_at change no elapsed period, so they are not listed. Sellers advertising media_buy.reporting_subscriptions MUST list every retroactive edit recorded within the last status_retention_days; an older entry MAY be dropped, because it governs only periods that ended before it was recorded. At most 64 entries are retained: a seller MUST refuse a retroactive edit that would exceed that with INVALID_STATE, and an edit it cannot refuse, such as one observed on a connected platform, it applies from the instant it records it (no start_time or stop time earlier than recorded_at), which needs no entry. + * @maxItems 64 + */ + flight_history?: { + /** + * When the seller recorded the edit, or ingested it when it was observed on a connected platform. Flight values change at this instant for every period resolved after it. + * @format date-time + */ + recorded_at: string; + /** + * start_time in force before the edit. + * @format date-time + */ + start_time: string; + /** + * Stop time in force before the edit. + * @format date-time + */ + stop_time: string; + }[]; /** * Current optimistic concurrency token. Pass this in update_media_buy requests intended to change state. Sellers advance it on every committed change to state this read reports, whatever its origin (AdCP task, seller operator, seller automation, another authorized principal, or a connected platform), and reject stale tokens with CONFLICT when a revision token is provided. * @minimum 1 @@ -19433,6 +19473,11 @@ export interface PackageStatus { * @format date-time */ end_time?: string; + /** + * The reporting delivery offerings this package can satisfy (media_buy.reporting_subscriptions): its product's reporting_capabilities.reporting_delivery_offering_ids after account-level narrowing, fixed when the package is confirmed. A later product or catalog change does not alter it, so a buyer resolves a subscription selector per package from this list and each offering's available_from and withdrawn_at. An offering in it stops being a candidate at its withdrawn_at. Sellers advertising media_buy.reporting_subscriptions MUST include it on every package, [] when none applies. + * @maxItems 64 + */ + reporting_delivery_offering_ids?: ReportingDeliveryOfferingID[]; /** * AdCP 3.3 initial-start policy. False (default) serves eligible approved assignments. True MUST retain booking and inventory commitment but block first enablement for serving until every current assignment is approved in all applicable package scopes; an empty set or library approval alone is insufficient. Retain pending-review/rejected assignments; same-creative_id resubmission needs no reassignment. Flight, pause, format-coverage and commitment constraints still apply. After first enablement, ordinary serving and impairment rules apply. Opt-in requires media_buy.features.creative_start_policy: true; otherwise buyers MUST NOT send true and sellers MUST reject true with UNSUPPORTED_FEATURE before mutation. Stage the full initial set atomically or while paused; the gate cannot anticipate future assignments. Sellers MUST echo the effective value on package readback, including false when defaulted. */ @@ -20305,25 +20350,28 @@ export type PlacementPropertyDeliveryMetrics = DeliveryMetrics & { */ export interface GetMediaBuyDeliveryResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -20340,15 +20388,6 @@ export interface GetMediaBuyDeliveryResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Type of webhook notification (only present in webhook deliveries): scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = resending period with corrected data (same window), window_update = resending period with a wider measurement window (e.g., C3 superseding live, C7 superseding C3) */ @@ -21308,25 +21347,28 @@ export interface GetReportingStatusRequest { */ export type GetReportingStatusResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -21343,15 +21385,6 @@ export type GetReportingStatusResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; view?: ReportingStatusView; /** * Opaque identity of the seller's consistent reporting-ledger snapshot. Every page reached from one periods cursor MUST return the same value. @@ -21397,7 +21430,7 @@ export type GetReportingStatusResponse = { */ all_accessible_media_buys: boolean; /** - * Exact independently reconciled configuration generations in the denominator. + * Exact independently reconciled configuration generations in the denominator. A generation derived from a reporting subscription is listed once per resolved offering, with offering_id, because one subscription version can resolve several offerings (match all, different products, or a resolution change). */ delivery_config_generations: { /** @@ -21411,6 +21444,13 @@ export type GetReportingStatusResponse = { */ delivery_config_version: number; feed_purpose: ReportingFeedPurpose; + /** + * Present when and only when the generation is derived from a reporting subscription (media_buy.reporting_subscriptions): the offering its obligations in this entry resolved. + * @minLength 1 + * @maxLength 128 + * @pattern ^[A-Za-z0-9_.:-]{1,128}$ + */ + offering_id?: string; }[]; feed_purposes: ReportingFeedPurpose[]; finality: ReportingFinality[]; @@ -21432,7 +21472,7 @@ export type GetReportingStatusResponse = { */ data_through?: string | null; /** - * Next obligation due time for an open scope. In a complete summary (view: summary, health: complete), the nearest future period start, strictly after ledger_as_of, across all active committed configuration generations in scope.delivery_config_generations. Sellers MUST populate it when such a scheduled period exists outside the closed evaluated scope, and omit it when none exists. This complete-scope projection applies only to summary responses. It is derived from the configuration schedule and does not represent an open obligation in the evaluated scope; its presence does not indicate that the scope is still open. Projecting it MUST NOT create, expose, lease, count, or alter an obligation whose period has not closed, or change obligation_counts, scope, or coverage. Obligation expected_at remains period.end plus schedule.delivery_sla; get_media_buy_delivery.next_expected_at remains the next webhook notification time. + * Next obligation due time for an open scope. In a complete summary (view: summary, health: complete), the nearest future period start, strictly after ledger_as_of, across all active committed configuration generations in scope.delivery_config_generations. Sellers MUST populate it when such a scheduled period exists outside the closed evaluated scope, and omit it when none exists. This complete-scope projection applies only to summary responses. It is derived from the configuration schedule and does not represent an open obligation in the evaluated scope; its presence does not indicate that the scope is still open. Projecting it MUST NOT create, expose, lease, count, or alter an obligation whose period has not closed, or change obligation_counts, scope, or coverage. Obligation expected_at remains period.end plus schedule.delivery_sla; get_media_buy_delivery.next_expected_at remains the next webhook notification time. For a generation derived from a reporting subscription, a scheduled period counts only when the subscription coverage rule, less open exceptions, owes it for at least one covered buy as flights currently stand; the value is a projection that a flight edit, a new buy, or an exception can move. * @format date-time */ next_expected_at?: string; @@ -21485,7 +21525,7 @@ export type GetReportingStatusResponse = { */ adjustments?: ReportingAdjustment[]; /** - * Authenticated caller's append-only reporting status history on this page. Current leaves are identified by obligation current_consumer_status_id or, for a missing seller obligation, by the supersession chain over configuration generation, report definition, and period. No other consumer's status is disclosed. + * Authenticated caller's append-only reporting status history on this page. Current leaves are identified by obligation current_consumer_status_id or, for a missing seller obligation, by the supersession chain over configuration generation, report definition, offering when the generation is subscription-derived, and period. No other consumer's status is disclosed. */ consumer_statuses?: ReportingConsumerStatus[]; /** @@ -21500,7 +21540,7 @@ export type GetReportingStatusResponse = { */ receipts?: ReportingReceipt[]; /** - * Summary and periods views (experimental, media_buy.reporting_subscriptions): coverage exceptions, one entry per caller reporting subscription whose scope includes this account, including inactive subscriptions with retained obligations. Omitted when the seller does not advertise subscriptions. + * Summary and periods views (experimental, media_buy.reporting_subscriptions): coverage exceptions, one entry per caller reporting subscription whose scope includes this account, including inactive subscriptions with retained obligations, which carry status inactive, and subscriptions the account was removed from in place while its excluded_by_buyer entry is retained. Omitted when the seller does not advertise subscriptions. */ subscription_coverage?: ReportingSubscriptionCoverage[]; errors?: Error[]; @@ -21520,6 +21560,10 @@ export type ReportingObligation = { */ offering_id?: string; feed_purpose: ReportingFeedPurpose; + /** + * Present, and true, only on a billing stub: the stretch [E, first incoming boundary after E) that a cutover hands to a billing feed whose schedule has no boundary at E (reporting-subscription.json cutover), on a billing reporting subscription or an account-level billing configuration (reporting-delivery-config.json billing_continuity). Its period starts off the schedule's grid and is shorter than one schedule period. It is otherwise an ordinary obligation: expected_at is period.end plus schedule.delivery_sla, and revisions, receipts, and consumer status key on its exact period. Absent on every other obligation. + */ + stub?: true; reporting_profile: string; account_id: string; /** @@ -21604,7 +21648,7 @@ export type ReportingObligation = { resource_retained_until?: string; }; /** - * One immutable, authenticated consumer statement about whether the required reporting for an expected configuration period could actually be consumed. It is operational status, not measurement data, delivery totals, a billing receipt, or authority to overwrite the seller's obligation/revision ledger. New statements supersede the current statement for the same consumer, configuration generation, report definition, and period while preserving append-only history. + * One immutable, authenticated consumer statement about whether the required reporting for an expected configuration period could actually be consumed. It is operational status, not measurement data, delivery totals, a billing receipt, or authority to overwrite the seller's obligation/revision ledger. New statements supersede the current statement for the same consumer, configuration generation, report definition, offering_id when present, and period while preserving append-only history. */ export type ReportingConsumerStatus = { } & { @@ -21613,7 +21657,7 @@ export type ReportingConsumerStatus = { */ reporting_status_id: string; /** - * The authenticated consumer's current status leaf replaced by this statement. It must identify the same account, configuration generation, report definition, and period. + * The authenticated consumer's current status leaf replaced by this statement. It must identify the same account, configuration generation, report definition, offering_id when present, and period. */ supersedes_reporting_status_id?: string; delivery_config_id: string; @@ -21622,6 +21666,10 @@ export type ReportingConsumerStatus = { * Exact immutable report definition accepted with the configuration generation, preventing unlike reporting promises from sharing a status chain. */ report_definition_id: string; + /** + * The resolved offering, for a generation derived from a reporting subscription (media_buy.reporting_subscriptions). Part of the chain identity there, because one subscription version can resolve several offerings that share a report definition and period. Required when the period's obligation carries offering_id, or would carry one when the consumer reports obligation_missing; absent otherwise. + */ + offering_id?: string; /** * Expected half-open reporting period derived from the accepted configuration generation. This identity works even when the seller omitted the corresponding obligation. */ @@ -21882,9 +21930,13 @@ export type ReportingSubscriptionCoverage = { subscription_id: string; subscription_version: number; /** - * Current account-level state. active: no account-level exclusion is in effect; individual buys may still be excluded. excluded: an open account-level entry is in effect and none has reason action_required. action_required: an open account-level entry with reason action_required is in effect and pending_action says what must happen. + * Current account-level state. active: no account-level exclusion is in effect; individual buys may still be excluded. excluded: an open account-level entry is in effect and none has reason action_required. action_required: an open account-level entry with reason action_required is in effect and pending_action says what must happen. inactive: the subscription is deactivated (active false or omitted); periods that started before deactivated_at stay owed, and no later periods are. Takes precedence over the other values. An inactive subscription appears only while it still has retained obligations for this account; after that its entry is omitted. */ - status: 'active' | 'excluded' | 'action_required'; + status: 'active' | 'excluded' | 'action_required' | 'inactive'; + /** + * When the subscription was deactivated. Present when and only when status is inactive. + */ + deactivated_at?: string; pending_action?: PendingAction; /** * Exceptions that remove periods. An entry without media_buy_id applies to the whole account. Opening or closing one fires principal.changed with reason reporting_subscription_changed. Retained for status_retention_days after until. When the account's covered offerings have different period boundaries, the seller lists one entry per offering_id, each with that offering's cutover instants, as for gaps and timezone_cutovers. @@ -21892,7 +21944,7 @@ export type ReportingSubscriptionCoverage = { excluded: { }[]; /** - * Account timezone changes affecting account_timezone-aligned periods, retained for status_retention_days. A cutover: periods under the old timezone are owed when they start before the change, so they end by effective_at; periods under the new timezone are owed when they start at or after effective_at. Any stretch from effective_at to the first new-timezone boundary is owed under neither. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id; an entry without offering_id applies to every offering on the account. + * Account timezone changes affecting account_timezone-aligned periods, retained for status_retention_days. A cutover: periods under the old timezone are owed when they start before the change, so they end by effective_at; periods under the new timezone are owed when they start at or after effective_at. Any stretch from effective_at to the first new-timezone boundary is owed under neither, except on a billing offering, where it is owed as one stub period [effective_at, first new-timezone boundary) whose obligation carries stub true, so no billable hour goes unreported. Period boundaries differ between offerings, so when the account's covered offerings have different boundaries the seller lists one entry per offering_id; an entry without offering_id applies to every offering on the account. */ timezone_cutovers?: { /** @@ -21925,7 +21977,7 @@ export type ReportingSubscriptionCoverage = { */ from: string; /** - * First period boundary at or after the re-grant. + * First period boundary at or after the re-grant, authorization.regranted_at. */ until: string; reason: 'unauthorized'; @@ -22018,22 +22070,11 @@ export interface RevisionView { pagination: {}; } export interface UnavailableLookup { - adcp_version?: string; - /** - * @format int - */ - adcp_major_version?: number; status: 'failed'; view: 'summary' | 'periods' | 'revision'; failure_kind: 'lookup_unavailable'; - context_id?: string; context?: ContextObject; message?: 'Reporting status resource is unavailable.'; - /** - * @format date-time - */ - timestamp?: string; - replayed?: boolean; adcp_error?: { code: 'NOT_FOUND'; message: 'Reporting status resource is unavailable.'; @@ -22047,30 +22088,17 @@ export interface UnavailableLookup { }[]; } export interface OperationalFailure { - adcp_version?: string; - /** - * @format int - */ - adcp_major_version?: number; status: 'failed'; view: 'summary' | 'periods' | 'revision'; failure_kind: 'operational'; - context_id?: string; context?: ContextObject; - message?: string; - /** - * @format date-time - */ - timestamp?: string; - replayed?: boolean; - adcp_error?: Error; errors: Error[]; } // sync_reporting_status parameters /** - * Submit the authenticated consumer's operational reporting status for expected configuration periods. This is a batched idempotent append-only sync over seller-hosted task transport, not a webhook registration, measurement-data feed, or billing receipt. Identity comes from authenticated transport; the request MUST NOT assert a buyer or consumer principal. After the caller loses account authority, statuses for revisions it read before unauthorized_at remain acceptable for status_retention_days. + * Submit the authenticated consumer's operational reporting status for expected configuration periods. This is a batched idempotent append-only sync over seller-hosted task transport, not a webhook registration, measurement-data feed, or billing receipt. Identity comes from authenticated transport; the request MUST NOT assert a buyer or consumer principal. After the caller loses account authority, its statuses for that account are refused like any other reference; a seller that permits reconciliation after a relationship ends keeps a reduced grant instead of revoking. */ export interface SyncReportingStatusRequest { /** @@ -22104,42 +22132,6 @@ export interface SyncReportingStatusRequest { * Per-statement durable recording results. Successful readback proves that the seller recorded the authenticated consumer's status without treating it as seller-authored reporting evidence. */ export interface SyncReportingStatusResponse { - /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). - */ - context_id?: string; - context?: ContextObject; - /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. - */ - task_id?: string; - status: TaskStatus; - /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. - */ - message?: string; - /** - * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. - */ - timestamp?: string; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - adcp_error?: Error; - push_notification_config?: PushNotificationConfig; - /** - * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. - * - * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. - * - * This is the primary correlation key for audit and reporting across the governance lifecycle. - */ - governance_context?: string; - /** - * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. - */ - payload?: {}; /** * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ @@ -22149,96 +22141,20 @@ export interface SyncReportingStatusResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; - /** - * @maxItems 100 - */ - results: (RecordedReportingConsumerStatus | UnchangedReportingConsumerStatus | FailedReportingConsumerStatus)[]; - ext?: ExtensionObject; -} -export interface RecordedReportingConsumerStatus { - result: 'recorded'; - consumer_status: ReportingConsumerStatus & { - }; -} -export interface UnchangedReportingConsumerStatus { - result: 'unchanged'; - consumer_status: ReportingConsumerStatus & { - }; -} -export interface FailedReportingConsumerStatus { - result: 'failed'; - /** - * @minLength 16 - * @maxLength 255 - * @pattern ^[A-Za-z0-9_.:-]{16,255}$ - */ - reporting_status_id: string; - /** - * @maxItems 16 - */ - errors: Error[]; -} - -// sync_reporting_receipts parameters -/** - * Submit durable authenticated consumer reconciliation results for reporting materializations and post-official adjustments. 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. After the caller loses account authority, receipts for revisions it read before unauthorized_at remain acceptable for status_retention_days. - */ -export interface SyncReportingReceiptsRequest { - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; - account: CanonicalAccountReference; - /** - * Client-generated batch key. Exact retries reuse the key and body. - * @minLength 16 - * @maxLength 255 - * @pattern ^[A-Za-z0-9_.:-]{16,255}$ - */ - idempotency_key: string; - /** - * @maxItems 100 - */ - receipts?: ReportingReceipt[]; - /** - * Consumer acceptance or rejection of exact post-official adjustments. - * @maxItems 100 - */ - adjustment_receipts?: ReportingAdjustmentReceipt[]; - context?: ContextObject; - ext?: ExtensionObject; -} - -// sync_reporting_receipts response -/** - * Per-receipt durable recording results for revisions and post-official adjustments. Successful readback lets a consumer prove the seller recorded its reconciliation outcome; failed results expose no cross-caller or cross-account resource metadata. - */ -export interface SyncReportingReceiptsResponse { /** * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ context_id?: string; context?: ContextObject; - /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. - */ - task_id?: string; + task_id?: TaskID; status: TaskStatus; - /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. - */ - message?: string; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -22255,6 +22171,41 @@ export interface SyncReportingReceiptsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; + /** + * @maxItems 100 + */ + results: (RecordedReportingConsumerStatus | UnchangedReportingConsumerStatus | FailedReportingConsumerStatus)[]; + ext?: ExtensionObject; +} +export interface RecordedReportingConsumerStatus { + result: 'recorded'; + consumer_status: ReportingConsumerStatus & { + }; +} +export interface UnchangedReportingConsumerStatus { + result: 'unchanged'; + consumer_status: ReportingConsumerStatus & { + }; +} +export interface FailedReportingConsumerStatus { + result: 'failed'; + /** + * @minLength 16 + * @maxLength 255 + * @pattern ^[A-Za-z0-9_.:-]{16,255}$ + */ + reporting_status_id: string; + /** + * @maxItems 16 + */ + errors: Error[]; +} + +// sync_reporting_receipts parameters +/** + * Submit durable authenticated consumer reconciliation results for reporting materializations and post-official adjustments. 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. After the caller loses account authority, its receipts for that account are refused like any other reference; a seller that permits reconciliation after a relationship ends keeps a reduced grant instead of revoking. + */ +export interface SyncReportingReceiptsRequest { /** * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ @@ -22264,6 +22215,71 @@ export interface SyncReportingReceiptsResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + account: CanonicalAccountReference; + /** + * Client-generated batch key. Exact retries reuse the key and body. + * @minLength 16 + * @maxLength 255 + * @pattern ^[A-Za-z0-9_.:-]{16,255}$ + */ + idempotency_key: string; + /** + * @maxItems 100 + */ + receipts?: ReportingReceipt[]; + /** + * Consumer acceptance or rejection of exact post-official adjustments. + * @maxItems 100 + */ + adjustment_receipts?: ReportingAdjustmentReceipt[]; + context?: ContextObject; + ext?: ExtensionObject; +} + +// sync_reporting_receipts response +/** + * Per-receipt durable recording results for revisions and post-official adjustments. Successful readback lets a consumer prove the seller recorded its reconciliation outcome; failed results expose no cross-caller or cross-account resource metadata. + */ +export interface SyncReportingReceiptsResponse { + /** + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. + */ + adcp_version?: string; + /** + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. + */ + adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * @maxItems 100 */ @@ -22364,27 +22380,21 @@ export interface ReportMediaBuyIssueRequest { /** * Stored issue snapshot or terminal task error, never both. The issue status is a domain lifecycle distinct from completion of the reporting/read task. */ -export type ReportMediaBuyIssueResponse = - | { - outcome: 'recorded'; - issue: MediaBuyIssue; - context?: ContextObject; - ext?: ExtensionObject; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - } - | { - outcome: 'failed'; - errors: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - }; +export type ReportMediaBuyIssueResponse = ProtocolEnvelope & + ( + | { + outcome: 'recorded'; + issue: MediaBuyIssue; + context?: ContextObject; + ext?: ExtensionObject; + } + | { + outcome: 'failed'; + errors: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + } + ); /** * Seller-owned report status, separate from transport task status and MediaBuy revision. Only the seller may acknowledge or resolve it. Reporting never changes delivery or commercial terms. */ @@ -22459,27 +22469,21 @@ export interface GetMediaBuyIssueRequest { /** * Stored issue snapshot or terminal task error, never both. The issue status is a domain lifecycle distinct from completion of the reporting/read task. */ -export type GetMediaBuyIssueResponse = - | { - outcome: 'found'; - issue: MediaBuyIssue; - context?: ContextObject; - ext?: ExtensionObject; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - } - | { - outcome: 'failed'; - errors: Error[]; - context?: ContextObject; - ext?: ExtensionObject; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - }; +export type GetMediaBuyIssueResponse = ProtocolEnvelope & + ( + | { + outcome: 'found'; + issue: MediaBuyIssue; + context?: ContextObject; + ext?: ExtensionObject; + } + | { + outcome: 'failed'; + errors: Error[]; + context?: ContextObject; + ext?: ExtensionObject; + } + ); // provide_performance_feedback parameters /** @@ -22623,25 +22627,28 @@ export interface DatetimeRange { */ export type ProvidePerformanceFeedbackResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -22658,15 +22665,6 @@ export type ProvidePerformanceFeedbackResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (ProvidePerformanceFeedbackSuccess | ProvidePerformanceFeedbackError); /** * Success response - feedback received and processed @@ -22818,25 +22816,28 @@ export interface EventSurface { */ export type SyncEventSourcesResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -22853,15 +22854,6 @@ export type SyncEventSourcesResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncEventSourcesSuccess | SyncEventSourcesError); /** * Success response - sync operation processed event sources @@ -23192,25 +23184,28 @@ export interface EventCustomData { */ export type LogEventResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -23227,15 +23222,6 @@ export type LogEventResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (LogEventSuccess | LogEventError); /** * Success response - events received and queued for processing @@ -23440,25 +23426,28 @@ export interface PlatformSegment { */ export type SyncAudiencesResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -23475,15 +23464,6 @@ export type SyncAudiencesResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncAudiencesSuccess | SyncAudiencesError | SyncAudiencesSubmitted); /** * Success response - sync operation processed audiences (may include per-item failures) @@ -23630,19 +23610,8 @@ export interface SyncAudiencesError { * Async task envelope returned when the whole sync operation cannot be confirmed before the response is emitted — for example, when the seller batches ingestion, when governance review gates the upload before matching can start, or when an upstream clean-room flow needs to settle before any per-audience result can be issued. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the audiences array with per-item action/status lands in the terminal result, not this envelope. Per-audience asynchronous matching (one audience in 'processing' while the rest of the sync resolves synchronously) belongs on the SyncAudiencesSuccess branch with status: processing on that item, not here. Matching latency on the per-audience status enum (processing → ready / too_small) is the common case; this envelope is the less-common operation-level case. */ export interface SyncAudiencesSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose audiences array carries per-item matching state via audience-status. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The audiences array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Batch ingestion queued; typical turnaround 15-30 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. */ @@ -23781,25 +23750,28 @@ export interface CatalogItemAvailabilityReference { */ export type SyncCatalogsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -23816,15 +23788,6 @@ export type SyncCatalogsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncCatalogsSuccess | SyncCatalogsError | SyncCatalogsSubmitted); /** * Seller acknowledgement for one buyer-authored catalog item availability update. @@ -23922,7 +23885,6 @@ export type CatalogItemAvailabilityState = { errors?: [CatalogItemAvailabilityError, ...CatalogItemAvailabilityError[]]; ext?: ExtensionObject; }; - /** * Success response - sync operation processed catalogs (may include per-catalog failures) */ @@ -24047,19 +24009,8 @@ export interface SyncCatalogsError { * Async task envelope returned when a catalog-only sync cannot be confirmed before the response — for example, when catalog ingestion and deduplication are queued for batch processing. A request containing item_availability_updates or item_availability_queries MUST NOT return this branch because availability operations are synchronous; mixed requests whose catalog work cannot finish synchronously and atomically fail before mutation and are retried as separate calls. For catalog-only requests, the buyer invokes get_task_status with task_id or receives a webhook when the task completes; the per-catalog results land in the terminal result, not this envelope. */ export interface SyncCatalogsSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose catalogs array is issued in-line. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Catalog ingestion queued; typical turnaround 5–15 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. */ @@ -24762,25 +24713,28 @@ export interface Artifact { */ export type BuildCreativeResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -24797,15 +24751,6 @@ export type BuildCreativeResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | BuildCreativeSuccess | BuildCreativeMultiSuccess @@ -25506,19 +25451,8 @@ export interface BuildCreativeError { * Async task envelope returned when build_creative cannot be confirmed before the response — for example, when a slow generative pipeline or multi-minute LLM workflow is queued. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creative_manifest(s) land in the terminal result, not this envelope. */ export interface BuildCreativeSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shapes, whose creative_manifest or creative_manifests are issued in-line. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Generative build queued; typical turnaround 3–5 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. */ @@ -25654,25 +25588,28 @@ export type PreviewCreativeRequest = { */ export type PreviewCreativeResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -25689,15 +25626,6 @@ export type PreviewCreativeResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | PreviewCreativeSingleResponse | PreviewCreativeBatchResponse @@ -25826,23 +25754,12 @@ export interface PreviewCreativeVariantResponse { * Async task envelope returned only when the preview_creative request set allow_async to true and rendering cannot complete inline. The buyer polls get_task_status with task_id; the completed preview response is the task result. */ export interface PreviewCreativeSubmitted { + status: 'submitted'; + task_id: TaskID; /** * Preview-response discriminator for the asynchronous arm. */ response_type: 'submitted'; - /** - * Discriminates this opt-in async envelope from synchronous preview responses. - */ - status: 'submitted'; - /** - * Task handle used to poll get_task_status for the completed preview response. - */ - task_id: string; - /** - * Optional human-readable explanation of why preview rendering was queued. Plain text only; buyers MUST treat this as untrusted agent input. - * @maxLength 2000 - */ - message?: string; context?: ContextObject; ext?: ExtensionObject; } @@ -26140,25 +26057,28 @@ export type TransformerParam = { */ export interface ListTransformersResponseCreativeAgent { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -26175,15 +26095,6 @@ export interface ListTransformersResponseCreativeAgent { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Transformer descriptors matching the query. */ @@ -26288,25 +26199,28 @@ export type CreativeVariant = DeliveryMetrics & { */ export interface GetCreativeDeliveryResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -26323,15 +26237,6 @@ export interface GetCreativeDeliveryResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Account identifier. Present when the response spans or is scoped to a specific account. */ @@ -26501,7 +26406,7 @@ export interface ListCreativesRequest { webhook_activity_limit?: number; account?: AccountReference; /** - * Specific fields to include in response (omit for all fields). The 'concept' value returns both concept_id and concept_name. `format_id` is a deprecated 3.x compatibility projection; new integrations request `format_kind` and `format_option_ref`. Selecting localization automatically includes creative_id, status, assets, the selected format identity, and localization_unavailable when applicable. Selecting rights_attestation_evaluations automatically includes rights so each seller-produced result can be reconciled with the exact retained constraint and reference. + * Specific fields to include in response (omit for all fields). The 'concept' value returns both concept_id and concept_name. `format_id` is a deprecated 3.x compatibility projection; new integrations request `format_kind` and `format_option_ref`. Selecting localization automatically includes creative_id, status, assets, the selected format identity, and localization_unavailable when applicable. Selecting rights_attestation_evaluations automatically includes rights so each seller-produced result can be reconciled with the exact retained constraint and reference. staged_update is experimental (creative.live_updates); selecting it automatically includes status so the serving state and the staged update are read together. */ fields?: ( | 'creative_id' @@ -26525,6 +26430,7 @@ export interface ListCreativesRequest { | 'variables' | 'concept' | 'pricing_options' + | 'staged_update' )[]; context?: ContextObject; ext?: ExtensionObject; @@ -26643,6 +26549,31 @@ export interface CreativeFilters { } // list_creatives response +/** + * A change accepted in staged mode and not yet promoted. While present, assets, revision_id, and status describe the version that serves; the staged content is the buyer's last synced content. Removed on promotion (the staged content and revision become current) and on withdrawal. Stays with status rejected under on_rejection keeps_prior until the buyer supersedes or withdraws it. + */ +export type CreativeStagedUpdate = { +} & { + /** + * Review state of the staged update. rejected appears only when the seller's on_rejection is keeps_prior; the prior version keeps serving until the buyer supersedes or withdraws the update. + */ + status: 'processing' | 'pending_review' | 'rejected'; + revision_id?: CreativeRevisionID; + /** + * Kinds of change the staged update makes relative to the serving version. + * + * @minItems 1 + */ + change_kinds: [CreativeChangeKind, ...CreativeChangeKind[]]; + /** + * When the seller accepted the staged update. + */ + staged_at: string; + /** + * Human-readable reason. Present only when status is rejected. + */ + rejection_reason?: string; +}; /** * An asset inside a materialized creative locale variant. Text and markdown assets may omit language when they make no language claim. When language is present, it MUST use the shared AdCP BCP 47 wire profile; conformance additionally requires exact equality with the enclosing variant locale. */ @@ -26705,25 +26636,28 @@ export type MacroBearingURL11 = MacroBearingURL; */ export interface ListCreativesResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -26740,15 +26674,6 @@ export interface ListCreativesResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Summary of the query that was executed */ @@ -26851,6 +26776,7 @@ export interface ListedCreativeNamedFormatReference { */ platform_id?: string; revision_id?: CreativeRevisionID; + staged_update?: CreativeStagedUpdate; /** * Seller-maintained change token for this creative, distinct from the buyer-assigned revision_id. Sellers MUST use a positive integer or a string of 1 to 255 characters; the schema does not encode these bounds because JSON Schema bounds on an integer-or-string type break SDK code generation. The seller advances it on every committed change to state this read reports, whatever its origin: an AdCP task, a seller operator, seller automation, another authorized principal, or a connected platform. An externally observed change advances it when the seller ingests it. Reads, validation-only calls, and exact idempotency replays do not advance it. Sellers MUST NOT reuse a value for a different state of the same creative or move it backward. Buyers MUST treat the value as opaque: equal values mean the same state as the seller has observed and a different value means the state changed. Integer values also order numerically. A change record's resource_revision is the value immediately after that change, in the same JSON type; a read that returns a different value reflects later changes. Sellers MUST NOT use it as the buyer revision_id, and a buyer revision_id never substitutes for it. Optional; a seller that does not maintain it omits it. */ @@ -27067,7 +26993,7 @@ export interface ListedCreativeNamedFormatReference { reason_code: CreativeEventReasonCode; }; /** - * Recent webhook fires scoped to this creative — creative.status_changed, creative.purged, creative.assignment_changed, and assignment-level indicators.changed deliveries. Present only when include_webhook_activity is true. Account-anchored records include subscriber_id; the parent creative_id disambiguates the record. Retention: 30 days from completed_at. See snapshot-and-log.mdx § Webhook activity log pattern. + * Recent webhook fires scoped to this creative — creative.status_changed, creative.staged_update_changed, creative.purged, creative.assignment_changed, and assignment-level indicators.changed deliveries. Present only when include_webhook_activity is true. Account-anchored records include subscriber_id; the parent creative_id disambiguates the record. Retention: 30 days from completed_at. See snapshot-and-log.mdx § Webhook activity log pattern. * @maxItems 200 */ webhook_activity?: WebhookActivityRecord[]; @@ -27200,6 +27126,7 @@ export interface ListedCreativeCanonicalFormatKind { */ platform_id?: string; revision_id?: CreativeRevisionID; + staged_update?: CreativeStagedUpdate; /** * Seller-maintained change token for this creative, distinct from the buyer-assigned revision_id. Sellers MUST use a positive integer or a string of 1 to 255 characters; the schema does not encode these bounds because JSON Schema bounds on an integer-or-string type break SDK code generation. The seller advances it on every committed change to state this read reports, whatever its origin: an AdCP task, a seller operator, seller automation, another authorized principal, or a connected platform. An externally observed change advances it when the seller ingests it. Reads, validation-only calls, and exact idempotency replays do not advance it. Sellers MUST NOT reuse a value for a different state of the same creative or move it backward. Buyers MUST treat the value as opaque: equal values mean the same state as the seller has observed and a different value means the state changed. Integer values also order numerically. A change record's resource_revision is the value immediately after that change, in the same JSON type; a read that returns a different value reflects later changes. Sellers MUST NOT use it as the buyer revision_id, and a buyer revision_id never substitutes for it. Optional; a seller that does not maintain it omits it. */ @@ -27416,7 +27343,7 @@ export interface ListedCreativeCanonicalFormatKind { reason_code: CreativeEventReasonCode; }; /** - * Recent webhook fires scoped to this creative — creative.status_changed, creative.purged, creative.assignment_changed, and assignment-level indicators.changed deliveries. Present only when include_webhook_activity is true. Account-anchored records include subscriber_id; the parent creative_id disambiguates the record. Retention: 30 days from completed_at. See snapshot-and-log.mdx § Webhook activity log pattern. + * Recent webhook fires scoped to this creative — creative.status_changed, creative.staged_update_changed, creative.purged, creative.assignment_changed, and assignment-level indicators.changed deliveries. Present only when include_webhook_activity is true. Account-anchored records include subscriber_id; the parent creative_id disambiguates the record. Retention: 30 days from completed_at. See snapshot-and-log.mdx § Webhook activity log pattern. * @maxItems 200 */ webhook_activity?: WebhookActivityRecord[]; @@ -27647,25 +27574,28 @@ export interface MergeSellerCopy { */ export type SyncCreativesResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -27682,15 +27612,6 @@ export type SyncCreativesResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncCreativesSuccess | SyncCreativesError | SyncCreativesSubmitted); /** * Path-addressable preflight result for one declaration. `resolvable` means the selected execution path advertises the exact operation; it does not claim that serve-time substitution has already occurred. @@ -27742,6 +27663,7 @@ export interface SyncCreativesSuccess { account?: Account; action: CreativeAction; status?: CreativeStatus; + staged_update?: CreativeStagedUpdate; /** * The seller's identifier for this creative in its source of truth. Also returned on list_creatives. */ @@ -27831,19 +27753,8 @@ export interface SyncCreativesError { * Async task envelope returned when the whole sync operation cannot be confirmed before the response is emitted — for example, when the seller batches ingestion, when async review must settle before per-item results can be issued, or when governance review gates the sync. The buyer invokes get_task_status with task_id or receives a webhook when the task completes; the creatives array with per-item action/status lands in the terminal result, not this envelope. Per-item async review (an item in pending_review while the rest of the sync resolves synchronously) belongs on the SyncCreativesSuccess branch with status: pending_review, not here. */ export interface SyncCreativesSubmitted { - /** - * Task-level status literal. Discriminates this async envelope from the synchronous success shape, whose creatives array carries per-item approval state via CreativeStatus. See task-status.json for the full task-status enum. - */ status: 'submitted'; - /** - * Task handle the buyer uses with get_task_status (or the legacy AdCP tasks/get alias), and that the seller references on push-notification callbacks. The creatives array is issued on the completion artifact, not here. This AdCP application-layer handle remains the snake_case task_id in every transport payload and is distinct from any transport-native A2A Task id. - */ - task_id: string; - /** - * Optional human-readable explanation of why the task is submitted — e.g., 'Batch ingestion queued; typical turnaround 15-30 minutes.' Plain text only. Buyers MUST treat this as untrusted seller input: escape before rendering to HTML UIs, and sanitize or isolate before passing to an LLM prompt context — a hostile seller may inject prompt-injection payloads aimed at the buyer's agent. - * @maxLength 2000 - */ - message?: string; + task_id: TaskID; /** * Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here. */ @@ -27972,25 +27883,28 @@ export type ValidateInputResult = { */ export interface ValidateInputResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28007,15 +27921,6 @@ export interface ValidateInputResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Per-target validation results. */ @@ -28428,25 +28333,28 @@ export type Deployment = */ export interface GetSignalsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28463,15 +28371,6 @@ export interface GetSignalsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Array of matching signals */ @@ -28782,25 +28681,28 @@ export interface ActivateSignalRequest { */ export type ActivateSignalResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -28817,15 +28719,6 @@ export type ActivateSignalResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (ActivateSignalSuccess | ActivateSignalError); /** * Success response - signal activated successfully to one or more deployment targets @@ -28996,25 +28889,28 @@ export interface PropertyListFilters { */ export interface CreatePropertyListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29031,15 +28927,6 @@ export interface CreatePropertyListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: PropertyList; /** * Read-only bearer credential shareable with receivers to call get_property_list for this list_id, including all pages, in place of normal agent credentials. MUST NOT authorize other lists or mutations. Store this; it is only returned at creation time. @@ -29152,25 +29039,28 @@ export interface UpdatePropertyListRequest { */ export interface UpdatePropertyListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29187,15 +29077,6 @@ export interface UpdatePropertyListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: PropertyList; ext?: ExtensionObject; } @@ -29249,25 +29130,28 @@ export interface GetPropertyListRequest { */ export interface GetPropertyListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29284,15 +29168,6 @@ export interface GetPropertyListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: PropertyList; /** * Resolved identifiers that passed filters (if resolve=true). Cache these locally for real-time use. @@ -29348,25 +29223,28 @@ export interface ListPropertyListsRequest { */ export interface ListPropertyListsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29383,15 +29261,6 @@ export interface ListPropertyListsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Array of property lists (metadata only, not resolved properties) */ @@ -29436,25 +29305,28 @@ export interface DeletePropertyListRequest { */ export interface DeletePropertyListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29471,15 +29343,6 @@ export interface DeletePropertyListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Whether the list was successfully deleted */ @@ -29673,25 +29536,28 @@ export interface CollectionListFilters { */ export interface CreateCollectionListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29708,15 +29574,6 @@ export interface CreateCollectionListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: CollectionList; /** * Token that authorizes sellers to fetch this list via get_collection_list. Only returned at creation time — buyers MUST store it in a secret manager. Scoped to this one list_id; MUST NOT be reused across lists. Governance agents MUST issue a distinct token per seller so per-relationship revocation is possible. Tokens MUST NOT be logged, appear in cache keys, or echo in error responses. delete_collection_list MUST revoke the token immediately; compromise-driven revocation MUST also signal cache invalidation to sellers (reduced cache_valid_until or a list-changed webhook). See Security considerations in docs/governance/collection/tasks/collection_lists. @@ -29823,25 +29680,28 @@ export interface UpdateCollectionListRequest { */ export interface UpdateCollectionListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29858,15 +29718,6 @@ export interface UpdateCollectionListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: CollectionList; ext?: ExtensionObject; } @@ -29920,25 +29771,28 @@ export interface GetCollectionListRequest { */ export interface GetCollectionListResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -29955,15 +29809,6 @@ export interface GetCollectionListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; list: CollectionList; /** * Resolved collections that passed filters (if resolve=true). Each entry contains identification and key metadata for seller matching. @@ -30060,64 +29905,6 @@ export interface ListCollectionListsRequest { * Response payload for list_collection_lists task */ export interface ListCollectionListsResponse { - /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). - */ - context_id?: string; - context?: ContextObject; - /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. - */ - task_id?: string; - status: TaskStatus; - /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. - */ - message?: string; - /** - * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. - */ - timestamp?: string; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - adcp_error?: Error; - push_notification_config?: PushNotificationConfig; - /** - * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. - * - * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. - * - * This is the primary correlation key for audit and reporting across the governance lifecycle. - */ - governance_context?: string; - /** - * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. - */ - payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; - /** - * Array of collection lists (metadata only, not resolved collections) - */ - lists: CollectionList[]; - pagination?: PaginationResponse; - ext?: ExtensionObject; -} - -// delete_collection_list parameters -/** - * Request parameters for deleting a collection list - */ -export interface DeleteCollectionListRequest { /** * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ @@ -30127,47 +29914,20 @@ export interface DeleteCollectionListRequest { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; - /** - * ID of the collection list to delete - */ - list_id: string; - account?: AccountReference; - context?: ContextObject; - ext?: ExtensionObject; - /** - * Client-generated unique key for at-most-once execution. If a request with the same key has already been processed, the server returns the original response without re-processing. MUST be unique per (seller, request) pair to prevent cross-seller correlation. Use a fresh UUID v4 for each request. - * @minLength 16 - * @maxLength 255 - * @pattern ^[A-Za-z0-9_.:-]{16,255}$ - */ - idempotency_key: string; -} - -// delete_collection_list response -/** - * Response payload for delete_collection_list task - */ -export interface DeleteCollectionListResponse { /** * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ context_id?: string; context?: ContextObject; - /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. - */ - task_id?: string; + task_id?: TaskID; status: TaskStatus; - /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. - */ - message?: string; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -30184,6 +29944,49 @@ export interface DeleteCollectionListResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; + /** + * Array of collection lists (metadata only, not resolved collections) + */ + lists: CollectionList[]; + pagination?: PaginationResponse; + ext?: ExtensionObject; +} + +// delete_collection_list parameters +/** + * Request parameters for deleting a collection list + */ +export interface DeleteCollectionListRequest { + /** + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. + */ + adcp_version?: string; + /** + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. + */ + adcp_major_version?: number; + /** + * ID of the collection list to delete + */ + list_id: string; + account?: AccountReference; + context?: ContextObject; + ext?: ExtensionObject; + /** + * Client-generated unique key for at-most-once execution. If a request with the same key has already been processed, the server returns the original response without re-processing. MUST be unique per (seller, request) pair to prevent cross-seller correlation. Use a fresh UUID v4 for each request. + * @minLength 16 + * @maxLength 255 + * @pattern ^[A-Za-z0-9_.:-]{16,255}$ + */ + idempotency_key: string; +} + +// delete_collection_list response +/** + * Response payload for delete_collection_list task + */ +export interface DeleteCollectionListResponse { /** * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ @@ -30193,6 +29996,36 @@ export interface DeleteCollectionListResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * Whether the list was successfully deleted */ @@ -30241,25 +30074,28 @@ export interface ListContentStandardsRequest { */ export type ListContentStandardsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -30276,15 +30112,6 @@ export type ListContentStandardsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { /** @@ -30783,25 +30610,28 @@ export interface GetContentStandardsRequest { */ export type GetContentStandardsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -30818,15 +30648,6 @@ export type GetContentStandardsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { /** @@ -31183,25 +31004,28 @@ export interface Artifact1 { */ export type CreateContentStandardsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -31218,15 +31042,6 @@ export type CreateContentStandardsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { /** @@ -31356,25 +31171,28 @@ export interface UpdateContentStandardsRequest { */ export type UpdateContentStandardsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -31391,15 +31209,6 @@ export type UpdateContentStandardsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (UpdateContentStandardsSuccess | UpdateContentStandardsError); export interface UpdateContentStandardsSuccess { /** @@ -31466,25 +31275,28 @@ export interface CalibrateContentRequest { */ export type CalibrateContentResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -31501,15 +31313,6 @@ export type CalibrateContentResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { verdict: BinaryVerdict; @@ -31634,25 +31437,28 @@ export interface ValidateContentDeliveryRequest { */ export type ValidateContentDeliveryResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -31669,15 +31475,6 @@ export type ValidateContentDeliveryResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { /** @@ -31809,25 +31606,28 @@ export interface GetMediaBuyArtifactsRequest { */ export type GetMediaBuyArtifactsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -31844,15 +31644,6 @@ export type GetMediaBuyArtifactsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | { /** @@ -31976,25 +31767,28 @@ export interface GetCreativeFeaturesRequest { */ export type GetCreativeFeaturesResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -32011,15 +31805,6 @@ export type GetCreativeFeaturesResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (GetCreativeFeaturesSuccess | GetCreativeFeaturesError | GetCreativeFeaturesSubmitted); /** * Terminal success response. In AdCP 3.x evaluation_id is an optional migration field that providers SHOULD emit; it becomes required in AdCP 4.0. When present, it is the provider-side reconciliation identity allocated when the evaluation was accepted and remains stable across exact replays and asynchronous completion. @@ -32138,25 +31923,13 @@ export interface GetCreativeFeaturesError { * Async acknowledgement returned after the provider accepts an evaluation but cannot complete it within the response window. Exact keyed request replays return this original acknowledgement with replayed: true and the same task_id. In AdCP 3.x providers SHOULD also return evaluation_id; it becomes required in AdCP 4.0. When present, exact replays and terminal results preserve it. The caller polls get_task_status using task_id. */ export interface GetCreativeFeaturesSubmitted { - /** - * Task-level status literal that discriminates this acknowledgement from terminal success and error responses. - */ status: 'submitted'; - /** - * AdCP task handle used to poll get_task_status or correlate terminal webhook delivery. Distinct from evaluation_id. - * @minLength 1 - */ - task_id: string; + task_id: TaskID; /** * Provider-generated identity allocated when the evaluation is accepted. Optional in AdCP 3.x and required in AdCP 4.0. Providers SHOULD emit it in 3.x; when present, exact replays and the terminal result MUST carry this same value. Distinct from task_id and idempotency_key. * @minLength 1 */ evaluation_id?: string; - /** - * Optional human-readable explanation of why the evaluation is submitted. Plain text only; callers treat it as untrusted provider input. - * @maxLength 2000 - */ - message?: string; context?: ContextObject; ext?: ExtensionObject; } @@ -32486,25 +32259,28 @@ export interface SyncPlansRequest { */ export interface SyncPlansResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -32521,15 +32297,6 @@ export interface SyncPlansResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Status for each synced plan. */ @@ -32889,6 +32656,36 @@ export interface ReportPlanOutcomeResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * Unique identifier for this outcome record. */ @@ -32945,11 +32742,6 @@ export interface ReportPlanOutcomeResponse { */ budget_remaining?: number; }; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - context?: ContextObject; ext?: ExtensionObject; } @@ -33075,6 +32867,36 @@ export interface ReportPlanAdjustmentResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * Governance-agent identifier for the adjustment record. */ @@ -33128,11 +32950,6 @@ export interface ReportPlanAdjustmentResponse { net_committed: number; budget_remaining: number; }; - /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. - */ - replayed?: boolean; - context?: ContextObject; ext?: ExtensionObject; } @@ -33180,25 +32997,28 @@ export interface GetPlanAuditLogsRequest { */ export interface GetPlanAuditLogsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -33215,15 +33035,6 @@ export interface GetPlanAuditLogsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Audit data for each requested plan. */ @@ -34067,6 +33878,36 @@ export interface CheckGovernanceResponse { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + /** + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + */ + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; + /** + * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. + */ + timestamp?: string; + /** + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + */ + replayed?: boolean; + adcp_error?: Error; + push_notification_config?: PushNotificationConfig; + /** + * Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id. + * + * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context. + * + * This is the primary correlation key for audit and reporting across the governance lifecycle. + */ + governance_context?: string; + /** + * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. + */ + payload?: {}; /** * Unique identifier for this governance check record. Use in report_plan_outcome to link outcomes to the check that authorized them. */ @@ -34234,16 +34075,6 @@ export interface CheckGovernanceResponse { * @pattern ^sha256:[a-f0-9]{64}$ */ runtime_attestation_binding_digest?: string; - /** - * Opaque authorization context for this governed action. Present only when verdict is approved; denied and conditions responses MUST NOT carry it. The buyer attaches it to the protocol envelope when sending the governed request. The service persists and forwards it on subsequent execution and lifecycle checks without requiring plan_id. - * - * Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate the standard authorization claims but MUST NOT interpret embedded governance state for business logic. The issuing governance agent uses the token to recover its internal plan and decision state. - * @minLength 1 - * @maxLength 4096 - * @pattern ^[\x20-\x7E]+$ - */ - governance_context?: string; - context?: ContextObject; ext?: ExtensionObject; } @@ -34295,25 +34126,28 @@ export type SIContextUse = 'presentation_only' | 'comparison_set' | 'reasoning_c */ export interface SIGetOfferingResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -34330,15 +34164,6 @@ export interface SIGetOfferingResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Whether the offering is currently available */ @@ -34817,25 +34642,28 @@ export type SIUIElement = { */ export interface SIInitiateSessionResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -34852,15 +34680,6 @@ export interface SIInitiateSessionResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Unique session identifier for subsequent messages */ @@ -34947,25 +34766,28 @@ export interface SISendMessageRequest { */ export interface SISendMessageResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -34982,15 +34804,6 @@ export interface SISendMessageResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Session identifier */ @@ -35165,25 +34978,28 @@ export interface SITerminateSessionRequest { */ export interface SITerminateSessionResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -35200,15 +35016,6 @@ export interface SITerminateSessionResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Terminated session identifier */ @@ -35988,7 +35795,7 @@ export type ReportingDeliveryCapabilities = { subscriptions?: { supported: true; /** - * Most accounts one subscription serves. Beyond it the seller excludes accounts with reason capacity, deterministically, and reports which. Absent means no declared limit. + * Most accounts one subscription serves. Admission is sticky and ordered by the account's authorization.authorized_at, then account_id in byte order, the same for every subscription of a principal, and accounts without covered buys count (reporting-subscription.json admission). Waiting accounts carry a capacity exception. Absent means no declared limit. */ max_accounts?: number; /** @@ -36039,7 +35846,7 @@ export type ReportingDeliveryCapabilities = { */ automated_recovery_window_seconds: number; /** - * Minimum period for which obligation, revision, and materialization metadata remain queryable. Revision content is retained for this period only for the revisions named in reporting-revision.json content_retention; other superseded snapshot revisions MAY be compacted to metadata only. + * Minimum period, in exact 24-hour days (86,400 seconds each, not civil days, wherever it bounds a window such as unauthorized_at plus status_retention_days), for which obligation, revision, and materialization metadata remain queryable. Revision content is retained for this period only for the revisions named in reporting-revision.json content_retention; other superseded snapshot revisions MAY be compacted to metadata only. */ status_retention_days: number; /** @@ -36101,6 +35908,14 @@ export type ReportingDeliveryOffering = { */ unmapped_dimensions?: string[]; + /** + * Experimental (media_buy.reporting_subscriptions). When this offering became, or becomes, available. Before it the offering is not a candidate for subscription resolution or configuration. Absent: available since before any retained obligation. + */ + available_from?: string; + /** + * Experimental (media_buy.reporting_subscriptions). When the seller withdrew, or will withdraw, this offering. From it the offering is not a candidate, and subscriptions that resolved it move to their next candidate as a resolution change, a cutover at withdrawn_at, so periods that started before it stay owed under it in full. A withdrawn offering stays in offerings, with withdrawn_at, while any obligation that resolved it is retained, so buyers can still read its schedule. Sellers advertising media_buy.reporting_subscriptions MUST NOT remove an offering from offerings any other way while such an obligation is retained. + */ + withdrawn_at?: string; /** * Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin. */ @@ -36191,6 +36006,14 @@ export type ReportingDeliveryOffering = { */ unmapped_dimensions?: string[]; + /** + * Experimental (media_buy.reporting_subscriptions). When this offering became, or becomes, available. Before it the offering is not a candidate for subscription resolution or configuration. Absent: available since before any retained obligation. + */ + available_from?: string; + /** + * Experimental (media_buy.reporting_subscriptions). When the seller withdrew, or will withdraw, this offering. From it the offering is not a candidate, and subscriptions that resolved it move to their next candidate as a resolution change, a cutover at withdrawn_at, so periods that started before it stay owed under it in full. A withdrawn offering stays in offerings, with withdrawn_at, while any obligation that resolved it is retained, so buyers can still read its schedule. Sellers advertising media_buy.reporting_subscriptions MUST NOT remove an offering from offerings any other way while such an obligation is retained. + */ + withdrawn_at?: string; /** * Retrievable immutable reporting-report-definition.json document on the authenticated seller/provider or AdCP-registry origin. */ @@ -36394,25 +36217,28 @@ export type ExperimentalFeatureID = string; */ export interface GetAdCPCapabilitiesResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -36429,15 +36255,6 @@ export interface GetAdCPCapabilitiesResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Seller working-time calendars, uniquely keyed by immutable calendar_id. Every published business-clock SLA MUST resolve to one declaration here. Retain earlier declarations while requests referencing them remain pending. Presence declares calendar support, not any product-level timing commitment. * @maxItems 32 @@ -37592,6 +37409,28 @@ export interface GetAdCPCapabilitiesResponse { * When true, this agent accepts the merge operation in sync_creatives assignment_operations: a buyer declares that a seller-assigned creative assigned to a package is the same creative as its own, and the seller moves that assignment's serving object, approval, and delivery continuity to the buyer's creative_id. Requires has_creative_library: true and stable_creative_ids: true. When false or absent, the agent rejects merge with UNSUPPORTED_FEATURE and buyers MUST NOT send it. */ supports_assignment_merge?: boolean; + /** + * Which kinds of change this agent applies in place to a live creative through sync_creatives under the same creative_id, and how the creative serves while each is decided. A creative is live when its status is approved and it has at least one assignment on a package that is not canceled, whose flight has not ended, and whose media buy is not in a terminal state; a paused package still counts. This declaration is a floor: every listed kind is accepted on every live creative in the listed serving mode or a less disruptive one (uninterrupted < staged < paused_for_review). An unlisted kind may still be accepted for some creatives; a sync_creatives dry_run returns the exact outcome of one change. A declaring agent MUST refuse a change it does not apply in place with CREATIVE_LIVE_UPDATE_UNSUPPORTED (not INVALID_STATE), and MUST always accept changes to name and tags. Requires has_creative_library: true. Omitted: the agent makes no claim about live creatives. + */ + live_updates?: { + /** + * Change kinds applied in place, each with its serving mode. At most one entry per change kind (sellers MUST NOT list a kind twice). An empty array means live creatives are immutable apart from name and tags. + */ + in_place: { + change: CreativeChangeKind; + serving: LiveUpdateServingMode; + /** + * Only with serving staged; defaults to keeps_prior. keeps_prior: if review rejects the staged update, the prior version keeps serving and the creative's status is unchanged. stops: the creative transitions to rejected and stops serving, with impairments on its media buys. + */ + on_rejection?: 'keeps_prior' | 'stops'; + }[]; + /** + * Upper bound, in seconds, between the moment an in-place change is applied or a staged update is promoted and the moment no assignment serves the prior version anywhere (ad-server, CDN, SSAI, and exchange caches). Omitted: the agent makes no bound claim, and buyers SHOULD assume the prior version may serve briefly. + * @minimum 0 + * @format int + */ + max_propagation_seconds?: number; + }; /** * When true, this agent accepts trackers on creative assignments in create_media_buy, update_media_buy, and sync_creatives, fires them in addition to the creative's own trackers or rejects the assignment, enforces shared format tracker-slot limits, and returns the assignment-scoped tracker list in list_creatives and get_media_buys readback. Requires has_creative_library: true. When false or absent, the agent MUST reject the field with UNSUPPORTED_FEATURE and buyers MUST NOT send it. */ @@ -38229,7 +38068,7 @@ export interface AccountRequestsSupported { request_task: 'request_account'; read_task: 'list_accounts'; /** - * Account attributes this seller accepts in request_account change requests (account_id plus fields). Absent or empty means the seller supports opening accounts only. Advisory: sellers still validate each change. + * Account attributes this seller accepts in request_account change requests (account_id plus fields). Absent or empty means the seller supports opening accounts only. Advisory: sellers still validate each change. currency and timezone are changeable only when listed; a seller that changes an account's timezone through request_account MUST list timezone, and refuses a change to an unlisted currency or timezone with UNSUPPORTED_FEATURE. */ changeable_attributes?: ( | 'countries' @@ -38462,10 +38301,7 @@ export interface GetTaskStatusRequest { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; - /** - * Unique identifier of the task to retrieve - */ - task_id: string; + task_id: TaskID; account?: AccountReference; /** * Include full conversation history for this task (may increase response size) @@ -38485,25 +38321,28 @@ export interface GetTaskStatusRequest { */ export interface GetTaskStatusResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for this task + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -38520,15 +38359,6 @@ export interface GetTaskStatusResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; task_type: TaskType; protocol: AdCPProtocol; /** @@ -38687,7 +38517,7 @@ export interface ListTasksRequest { * Filter by specific task IDs * @maxItems 100 */ - task_ids?: string[]; + task_ids?: TaskID[]; /** * Filter tasks where context contains this text (searches media_buy_id, signal_id, etc.) */ @@ -38722,25 +38552,28 @@ export interface ListTasksRequest { */ export interface ListTasksResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -38757,15 +38590,6 @@ export interface ListTasksResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Summary of the query that was executed */ @@ -38831,10 +38655,7 @@ export interface ListTasksResponse { * Array of tasks matching the query criteria */ tasks: { - /** - * Unique identifier for this task - */ - task_id: string; + task_id: TaskID; task_type: TaskType; /** * AdCP domain this task belongs to @@ -38958,25 +38779,28 @@ export interface AgentNotificationConfig { */ export interface SyncAgentNotificationConfigsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -38993,15 +38817,6 @@ export interface SyncAgentNotificationConfigsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Whether this was a dry run and no persisted subscriber set changed. */ @@ -39040,7 +38855,7 @@ export type ReportingSubscription = { */ subscription_id: string; /** - * Caller-selected immutable semantic generation, with its own accepted_at. Increment when the selector, reconciliation_mode, destination, scope, exclude_account_ids, or operator_domains change. active and replace_account_configs change in place. Sellers reject a reused version with different semantic content. + * Caller-selected immutable semantic generation, with its own accepted_at. Increment when the selector, reconciliation_mode, destination (including destination_overrides), the scope kind (all_authorized_accounts or account_ids), or operator_domains change. Membership edits, adding or removing account_ids and changing exclude_account_ids, apply in place without a new version (see membership), as do active and replace_account_configs. Sellers reject a reused version with different semantic content. */ subscription_version: number; /** @@ -39098,11 +38913,11 @@ export type ReportingSubscription = { dimensions?: ReportingDimension[]; /** - * exact selects the offering whose dimension set equals dimensions; native dimensions that do not map to the vocabulary count as distinct, so package by device does not equal package. finest selects the single offering with the most mapped dimensions among those including every selector dimension. Ties under exact and finest go to the lowest offering_id in byte order. all selects every offering including every selector dimension, each with its own obligations. Defaults to exact when dimensions is present and finest when it is absent. With match exact and no dimensions, every candidate qualifies and the lowest offering_id wins. Matching reads each offering's standard_dimensions and unmapped_dimensions. Billing subscriptions SHOULD use exact. + * exact selects the offering whose dimension set equals dimensions; native dimensions that do not map to the vocabulary count as distinct, so package by device does not equal package. finest selects the single offering with the most mapped dimensions among those including every selector dimension. Ties under exact and finest go to the lowest offering_id in byte order. all selects every offering including every selector dimension, each with its own obligations. Defaults to exact when dimensions is present and finest when it is absent. With match exact and no dimensions, every candidate qualifies and the lowest offering_id wins. Matching reads each offering's standard_dimensions and unmapped_dimensions. Billing subscriptions MUST use exact with dimensions, so a billing feed's breakdown never depends on which offerings happen to exist. */ match?: 'exact' | 'finest' | 'all'; /** - * IANA timezone override for period boundaries. Only valid when scope.account_ids names exactly one account. An account_timezone offering matches and uses this zone in place of the account's. A utc offering matches only when this is a UTC alias (UTC or Etc/UTC). A source_timezone or fixed billing_cycle offering matches only when its published period_timezone equals this one. A billing_cycle offering whose anchor the buyer configures never matches a subscription, which has no way to supply the anchor. + * IANA timezone override for period boundaries. Only valid when scope.account_ids names exactly one account. An account_timezone offering matches and uses this zone in place of the account's. A utc offering matches only when this is exactly UTC or Etc/UTC; other names that tzdata links to UTC, such as Etc/GMT, GMT, Etc/Universal, or Zulu, do not match. A source_timezone or fixed billing_cycle offering matches only when its published period_timezone equals this one. A billing_cycle offering whose anchor the buyer configures never matches a subscription, which has no way to supply the anchor. */ period_timezone?: string; }; @@ -39124,6 +38939,25 @@ export type ReportingSubscription = { */ path_template?: string; }; + /** + * Per-account routing inside one subscription, so an agency keeps advertisers apart without registering a subscription per destination. Each entry sends the accounts it selects, by account_ids or by operator domain, to its own destination; every other account uses destination. An account_ids entry wins over an operator_domains entry. An account may appear in at most one account_ids entry and an operator domain in at most one operator_domains entry; otherwise the whole request fails with INVALID_REQUEST. Every override destination MUST have the same pattern and transport as destination, so routing never changes which offering resolves. Changing overrides is a destination change and needs a new subscription_version. Requires destination. + * + * @minItems 1 + * @maxItems 64 + */ + destination_overrides?: ({ + } & ( + | { + } + | { + } + ) & + ( + | { + } + | { + } + ))[]; }; /** * This task begins after authentication: AdCP defines no credential-registration protocol, and the seller’s authorization system (OAuth, API keys, signed requests, workload identity) issues and maps credentials before the first call. Declaratively synchronize selected sections of the authenticated principal's standing configuration with one AdCP agent. The principal is a party: a buyer agent, or an operator-side identity acting through any client. Use this task only to change state; read current state, the configuration version, and destination setup progress through get_principal, and prefer this task over the narrower sync_agent_notification_configs when both are advertised. This task does not register a buyer agent: the stable principal MAY be a delegated human user or an autonomous workload. 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 principal resources but grants no advertiser-account authority. Sellers implementing it MUST advertise adcp.principal and protocol.principal. @@ -39375,17 +39209,16 @@ export type ReportingSubscriptionState = { */ accepted_at: string; /** - * Earlier versions, newest first, retained while any obligation of that version is retained, so a buyer can recompute their expected periods after local-state loss. Each entry carries the configuration that version had. + * Earlier versions, newest first, retained while any obligation of that version is retained, so a buyer can recompute their expected periods after local-state loss. Each entry carries the configuration that version had. At most the 16 newest are listed inline; prior_versions_count gives the total, and the rest are read through get_principal reporting_subscription_page. + * + * @maxItems 16 */ - prior_versions?: { - subscription_version: number; - accepted_at: string; - /** - * The next version's accepted_at, the cutover instant: this version owes its periods that start before it, in full. - */ - superseded_at: string; - configuration?: ReportingSubscription; - }[]; + prior_versions?: + ReportingSubscriptionPriorVersion[]; + /** + * Total retained prior versions. Present whenever prior_versions is. When larger than the number listed inline, page the rest through get_principal reporting_subscription_page with list prior_versions. + */ + prior_versions_count?: number; /** * When active false was applied. Present when and only when state is inactive. */ @@ -39418,73 +39251,62 @@ export type ReportingSubscriptionState = { issues?: Error[]; /** - * Accounts where this subscription has an open get_reporting_status exception, so a caller need not poll every account. Changes fire principal.changed with reason reporting_subscription_changed. + * Accounts where this subscription has an open get_reporting_status exception, so a caller need not poll every account, in account_id byte order. At most 1000 are listed inline; accounts_with_exceptions_count gives the total, and the rest are read through get_principal reporting_subscription_page. Changes fire principal.changed with reason reporting_subscription_changed. * * @maxItems 1000 */ - accounts_with_exceptions?: { - account_id: string; - /** - * Reasons of the open exceptions, account- or buy-level. - * - * @minItems 1 - */ - reasons: [ - 'offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required', - ...('offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required')[] - ]; + accounts_with_exceptions?: ReportingSubscriptionAccountExceptions[]; + /** + * Total accounts with an open exception. Present whenever accounts_with_exceptions is. + */ + accounts_with_exceptions_count?: number; + /** + * Total accounts in accounts_unauthorized. Present whenever accounts_unauthorized is. + */ + accounts_unauthorized_count?: number; + /** + * Destination generation bound for each destination_overrides destination_id. Present when and only when the configuration has destination_overrides. + * + * @maxItems 64 + */ + destination_override_refs?: { + destination_id: string; + destination_ref: string; }[]; /** - * Accounts this subscription covered whose authority the caller has since lost, so a revoked grant reads differently from a seller that stopped publishing. Only accounts the subscription previously covered appear. Entries carry no current account data and nothing created after unauthorized_at. An entry is removed on re-grant and is otherwise retained for status_retention_days after unauthorized_at; after that it drops, and a later re-grant is a fresh coverage start from authorized_at with no gap claimed. Every addition or removal fires principal.changed with reason reporting_subscription_changed. + * Accounts this subscription covered whose authority the caller has since lost, in account_id byte order, so a revoked grant reads differently from a seller that stopped publishing. At most 1000 are listed inline; accounts_unauthorized_count gives the total, and the rest are read through get_principal reporting_subscription_page. Only accounts the subscription previously covered appear. Entries carry no current account data and nothing created after unauthorized_at. An entry is removed on re-grant and is otherwise retained for status_retention_days after unauthorized_at; after that it drops, and a later re-grant is a fresh coverage start from authorized_at with no gap claimed. Every addition or removal fires principal.changed with reason reporting_subscription_changed. * * @maxItems 1000 */ - accounts_unauthorized?: { - account_id: string; - /** - * When the caller's authority for the account ended. Nothing is delivered for periods ending after it, including on retries. - */ - unauthorized_at: string; - /** - * Last period boundary at or before unauthorized_at: the end of the last period owed before authority ended. - */ - last_owed_period_end?: string; - /** - * Owed periods that ended at or before unauthorized_at but were not delivered by then. They are withheld, not missing, and never count as seller delay. If authority returns, they are owed again, due at the re-grant time plus the offering's delivery_sla. - */ - withheld_period_count: number; - /** - * Obligations of the withheld periods, when the seller lists them. - * - * @maxItems 1000 - */ - withheld_reporting_obligation_ids?: string[]; - }[]; + accounts_unauthorized?: ReportingSubscriptionUnauthorizedAccount[]; }; /** * Result of synchronizing selected sections of the principal's standing configuration. 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 principal identifiers, versions, or configuration state. */ export interface SyncPrincipalResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -39501,15 +39323,6 @@ export interface SyncPrincipalResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; result: AppliedPrincipalConfiguration | ValidatedPrincipalDryRun | FailedPrincipalSync; ext?: ExtensionObject; } @@ -39640,6 +39453,48 @@ export interface PrincipalDeclarationsState { reason: string; }[]; } +export interface ReportingSubscriptionPriorVersion { + subscription_version: number; + accepted_at: string; + /** + * The next version's accepted_at, the cutover instant: this version owes its periods that start before it, in full. + */ + superseded_at: string; + configuration?: ReportingSubscription; +} +export interface ReportingSubscriptionAccountExceptions { + account_id: string; + /** + * Reasons of the open exceptions, account- or buy-level. + * + * @minItems 1 + */ + reasons: [ + 'offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required', + ...('offering_unsupported' | 'capacity' | 'overridden' | 'excluded_by_buyer' | 'action_required')[] + ]; +} +export interface ReportingSubscriptionUnauthorizedAccount { + account_id: string; + /** + * When the caller's authority for the account ended. Nothing is delivered for periods ending after it, including on retries. + */ + unauthorized_at: string; + /** + * Last period boundary at or before unauthorized_at: the end of the last period owed before authority ended. + */ + last_owed_period_end?: string; + /** + * Owed periods that ended at or before unauthorized_at but were not delivered by then. They are withheld, not missing, and never count as seller delay. If authority returns, they are owed again, due at the re-grant time plus the offering's delivery_sla. + */ + withheld_period_count: number; + /** + * Obligations of the withheld periods, when the seller lists them. + * + * @maxItems 1000 + */ + withheld_reporting_obligation_ids?: string[]; +} export interface ValidatedPrincipalDryRun { kind: 'validated'; action: 'would_update' | 'would_be_unchanged' | 'would_clear'; @@ -39672,6 +39527,19 @@ export interface GetPrincipalRequest { * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ adcp_major_version?: number; + /** + * Experimental (media_buy.reporting_subscriptions). Page through one reporting subscription's accounts_with_exceptions, accounts_unauthorized, or prior_versions when the inline list in configuration.reporting_subscriptions is shorter than its count. The response carries the usual result plus reporting_subscription_page. An unknown subscription_id fails with INVALID_REQUEST. + */ + reporting_subscription_page?: { + /** + * @minLength 1 + * @maxLength 64 + * @pattern ^[A-Za-z0-9_.:-]{1,64}$ + */ + subscription_id: string; + list: 'accounts_with_exceptions' | 'accounts_unauthorized' | 'prior_versions'; + pagination?: PaginationRequest; + }; context?: ContextObject; ext?: ExtensionObject; } @@ -39682,25 +39550,28 @@ export interface GetPrincipalRequest { */ export interface GetPrincipalResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -39717,15 +39588,6 @@ export interface GetPrincipalResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; result: | CurrentPrincipalConfiguration | RecognizedPrincipalWithoutStandingConfiguration @@ -39750,6 +39612,31 @@ export interface CurrentPrincipalConfiguration { */ configuration_version: string; configuration: PrincipalState; + /** + * Present when and only when the request carried reporting_subscription_page: one page of the requested list, with the same entries and order as the inline list (account_id byte order for the account lists, newest first for prior_versions). Exactly the property named by list is present. + */ + reporting_subscription_page?: { + /** + * @minLength 1 + * @maxLength 64 + * @pattern ^[A-Za-z0-9_.:-]{1,64}$ + */ + subscription_id: string; + list: 'accounts_with_exceptions' | 'accounts_unauthorized' | 'prior_versions'; + /** + * @maxItems 100 + */ + accounts_with_exceptions?: ReportingSubscriptionAccountExceptions[]; + /** + * @maxItems 100 + */ + accounts_unauthorized?: ReportingSubscriptionUnauthorizedAccount[]; + /** + * @maxItems 100 + */ + prior_versions?: ReportingSubscriptionPriorVersion[]; + pagination: PaginationResponse; + }; } /** * The seller's commercial relationship with this caller, or its application in progress. Omitted when there is neither. @@ -39852,25 +39739,28 @@ export interface ListAccountChangesRequest { */ export type ListAccountChangesResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -39887,15 +39777,6 @@ export type ListAccountChangesResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Matching changes in oldest-first total account order. Timestamps are descriptive and do not define this order. * @maxItems 100 @@ -40312,6 +40193,24 @@ export type AccountRequest = { account_id?: string; account?: Account; resolution?: AccountRequestResolution; + /** + * Present when and only when the request resolved as updated and changed billing, billing_entity, or payment_terms: when the new money terms take effect. Delivery before it is invoiced under the previous terms, and delivery from it under the new ones. At or after the instant the request resolved; a seller MAY choose a later instant, such as its next invoice-period boundary. Changes to other attributes take effect when the request resolves. + */ + effective_at?: string; + /** + * Present when and only when a change request resolved as created, a separate new account: the named account's account-level configurations the new account does not have, so the buyer knows what to set up again. notification_configs, reporting_delivery_configs, reporting_bucket, and governance_agents are the account fields of the same names; creatives, audiences, catalogs, and event_sources are account-scoped libraries synced through their own tasks. [] means every one of them carried over. Principal-level configuration is unaffected: an all_authorized_accounts reporting subscription covers the new account from its authorization, while an account_ids subscription covers it only once the buyer adds it. + * + * @maxItems 8 + */ + not_carried_over?: + (| 'notification_configs' + | 'reporting_delivery_configs' + | 'reporting_bucket' + | 'governance_agents' + | 'creatives' + | 'audiences' + | 'catalogs' + | 'event_sources')[]; /** * Present when state is ambiguous. Accounts that match the request, limited to accounts the caller is already granted. The seller MUST NOT list accounts the caller cannot already reach. When the only matches are outside the caller's grants, every caller-visible state, pending-action kind, and error MUST be one the seller could also return when nothing matches. * @@ -40340,25 +40239,28 @@ export type AccountRequest = { */ export interface ListAccountsResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -40375,15 +40277,6 @@ export interface ListAccountsResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Array of accounts accessible to the authenticated agent. Each entry is the full Account object plus optional authorization. Buyer-declared entries include account_id, brand, operator, and any operator_unit, fixed currency, buyer-selected account timezone, and sandbox attributes so a buyer can recover its account IDs after a cold start. Sellers SHOULD return account_scope on every entry, with brand and/or operator wherever the scope names them, so a caller can map its buyers onto listed accounts. There is no preference order between scopes: the choice decides who is invoiced, so a person makes it. */ @@ -40423,6 +40316,10 @@ export interface AccountAuthorization { * When the caller's current authorization chain for this account began. A re-grant before the previous unauthorized_at plus status_retention_days continues the chain and leaves authorized_at unchanged; a later re-grant starts a new chain and sets it to the re-grant time. Reporting subscriptions cover the account from the first period boundary at or after it. Sellers advertising media_buy.reporting_subscriptions MUST populate it. */ authorized_at?: string; + /** + * The latest re-grant within the caller's current authorization chain for this account: when authority last resumed after a loss that the re-grant continued, because it came before the previous unauthorized_at plus status_retention_days. Absent while the chain has had no re-grant. A re-grant that starts a new chain sets authorized_at to the re-grant time and leaves this absent. Reporting subscriptions owe withheld periods at this instant plus the offering's delivery_sla, and an unbackfilled gap ends at the first period boundary at or after it. Sellers advertising media_buy.reporting_subscriptions MUST populate it whenever the current chain has a re-grant. + */ + regranted_at?: string; /** * Convenience flag. When true, the caller is permitted only non-mutating tasks. Sellers MUST reject any mutation from a read-only caller with READ_ONLY_SCOPE. For the AdCP 3.2 product split, read-only permits list_products but rejects request_proposals, refine_proposals, and decline_proposals; a legacy get_products call is permitted only when the seller can guarantee the selected arm is a synchronous side-effect-free read. Sellers MAY omit this field; omission is equivalent to `false`. Callers MUST NOT infer read-only from `allowed_tasks` alone — the seller MUST set this explicitly when it applies. */ @@ -40462,7 +40359,7 @@ export interface AccountCandidate { // request_account parameters /** - * The single account write (experimental, account.requests). Open an account (brand and operator: the seller finds an existing one or creates one) or change one (account_id plus the attributes to change), possibly after human review on either side. Every write is a request with the same lifecycle. Experimental in 3.3 (#8280): sellers implementing this task MUST list account.requests in experimental_features. Retries are safe through idempotency_key; deduplicating separate requests for the same advertiser is seller discretion, with non-normative guidance in the task docs. Send either account_id, or brand and operator; sellers enforce this at runtime so the MCP input schema stays a plain root object, and reject a request carrying both, or neither, with INVALID_REQUEST. With account_id, every other field present is a requested change, validated as when the account opens: brand.domain and brand.brand_id must equal the account's (a different brand is a different account, INVALID_REQUEST), currency and timezone changes MAY be refused with UNSUPPORTED_FEATURE, and sandbox never changes. Authorization (change or select): the seller first resolves account_id against the caller's own access and answers an unreachable account exactly as an unknown one, before any other validation of the body. A change requires request_account in the caller's allowed_tasks for that account and read_only: false; when the grant lists request_account under field_scopes, every changed field (including billing, billing_entity, and payment_terms) must be in that allowlist, as field_scopes already works. Otherwise SCOPE_INSUFFICIENT, READ_ONLY_SCOPE, or FIELD_NOT_PERMITTED. A change that goes in_review re-checks revision when it resolves; if the account changed meanwhile, the request is rejected with CONFLICT. A new change request for the same account from the same caller supersedes that caller's open change request: the new request gets its own request_id and must carry every change still wanted, and the open one moves to rejected with CONFLICT and details.superseded_by. It never affects another caller's request. + * The single account write (experimental, account.requests). Open an account (brand and operator: the seller finds an existing one or creates one) or change one (account_id plus the attributes to change), possibly after human review on either side. Every write is a request with the same lifecycle. Experimental in 3.3 (#8280): sellers implementing this task MUST list account.requests in experimental_features. Retries are safe through idempotency_key; deduplicating separate requests for the same advertiser is seller discretion, with non-normative guidance in the task docs. Send either account_id, or brand and operator; sellers enforce this at runtime so the MCP input schema stays a plain root object, and reject a request carrying both, or neither, with INVALID_REQUEST. With account_id, every other field present is a requested change, validated as when the account opens: brand.domain and brand.brand_id must equal the account's (a different brand is a different account, INVALID_REQUEST), currency and timezone change only on sellers that list them in account.requests.changeable_attributes and are otherwise refused with UNSUPPORTED_FEATURE, and sandbox never changes. A timezone change is a reporting cutover for account_timezone periods. Authorization (change or select): the seller first resolves account_id against the caller's own access and answers an unreachable account exactly as an unknown one, before any other validation of the body. A change requires request_account in the caller's allowed_tasks for that account and read_only: false; when the grant lists request_account under field_scopes, every changed field (including billing, billing_entity, and payment_terms) must be in that allowlist, as field_scopes already works. Otherwise SCOPE_INSUFFICIENT, READ_ONLY_SCOPE, or FIELD_NOT_PERMITTED. A change that goes in_review re-checks revision when it resolves; if the account changed meanwhile, the request is rejected with CONFLICT. A new change request for the same account from the same caller supersedes that caller's open change request: the new request gets its own request_id and must carry every change still wanted, and the open one moves to rejected with CONFLICT and details.superseded_by. It never affects another caller's request. */ export interface RequestAccountRequest { /** @@ -40535,25 +40432,28 @@ export interface RequestAccountRequest { */ export type RequestAccountResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -40570,15 +40470,6 @@ export type RequestAccountResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; request?: AccountRequest; errors?: Error[]; ext?: ExtensionObject; @@ -40742,25 +40633,28 @@ export interface SettingsUpdateMode { */ export type SyncAccountsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -40777,15 +40671,6 @@ export type SyncAccountsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncAccountsSuccess | SyncAccountsError); /** * Deprecated in 3.3 with operator_identity. 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. @@ -41047,25 +40932,28 @@ export interface SyncGovernanceRequest { */ export type SyncGovernanceResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -41082,15 +40970,6 @@ export type SyncGovernanceResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (SyncGovernanceSuccess | SyncGovernanceError); /** * Sync processed — individual accounts may have errors @@ -41254,25 +41133,28 @@ export interface ReportUsageRequest { */ export interface ReportUsageResponse { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -41289,15 +41171,6 @@ export interface ReportUsageResponse { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; /** * Number of usage records successfully stored. * @minimum 0 @@ -41341,25 +41214,28 @@ export interface GetAccountFinancialsRequest { */ export type GetAccountFinancialsResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -41376,15 +41252,6 @@ export type GetAccountFinancialsResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & (GetAccountFinancialsSuccess | GetAccountFinancialsError); /** * Financial data retrieved successfully @@ -41647,284 +41514,282 @@ export type ComplianceTaskCompletionData = /** * Canonical response contract for get_products, including completed results, terminal failures, wholesale unchanged responses, and the structured GetProductsRejected business outcome. */ -export type GetProductsCompletion = AdCPVersionEnvelope & - ProtocolEnvelope & { - } & { - /** - * Array of matching products - */ - products?: Product[]; - /** - * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. - * - * @minItems 1 - */ - collections?: [ResponseCollection, ...ResponseCollection[]]; - targeting_resolution?: ProductDiscoveryTargetingResolution; - /** - * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. - */ - extensions?: { - }; - /** - * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. - */ - proposals?: Proposal[]; - /** - * Task-specific errors and warnings (e.g., product filtering issues) - */ - errors?: Error[]; - /** - * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. - */ - reason?: string; - /** - * Actionable alternatives available only on the GetProductsRejected arm. - * - * @maxItems 20 - */ - suggestions?: - string[]; - /** - * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. - */ - property_list_applied?: boolean; - /** - * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. - */ - catalog_applied?: boolean; - /** - * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. - */ - refinement_applied?: ( - | { - /** - * Echoes scope 'request' from the corresponding refine entry. - */ - scope: 'request'; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - | { - } - | { - /** - * Echoes scope 'proposal' from the corresponding refine entry. - */ - scope: 'proposal'; - /** - * Echoes proposal_id from the corresponding refine entry. - */ - proposal_id: string; - /** - * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. - */ - status: 'applied' | 'partial' | 'unable'; - /** - * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. - */ - notes?: string; - } - )[]; - /** - * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. - * - * @minItems 1 - */ - incomplete?: [ - { +export type GetProductsCompletion = ProtocolEnvelope & { +} & { + /** + * Array of matching products + */ + products?: Product[]; + /** + * Experimental (media_buy.collection_cards). Full collection objects for collections referenced by the collections selectors of the returned products. Sellers MUST NOT return this array unless the request set include_collections to true; when it is set, sellers SHOULD include every referenced collection and MUST NOT include one that no returned product references. At most one entry per (publisher_domain, collection_id). If a key appears more than once, that collection is unresolvable from this response; buyers fall back to the publisher's adagents.json, as they do for an omitted collection, and ignore entries that no returned product references. These are convenience copies, never authorization evidence: a copy wins over adagents.json only on images, sample_content, url, description, season, cadence and distribution[].followers (see core/response-collection.json). Present only alongside products. + * + * @minItems 1 + */ + collections?: [ResponseCollection, ...ResponseCollection[]]; + targeting_resolution?: ProductDiscoveryTargetingResolution; + /** + * Bundled platform-extension definitions referenced by any product in `products`. Keyed by `@` (e.g., `https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel@sha256:abc...`). When present, lets buyers resolve `platform_extensions` references on product format declarations without a separate fetch. Buyer SDKs cache by URI@digest; subsequent get_products responses MAY omit definitions the buyer already has cached and rely on the digest match. Each value is an extension definition with `extends` (the canonical concept it extends, e.g., `tracking`), `fields` (the schema for additional fields the extension contributes), `version`, and optional `description`. + */ + extensions?: { + }; + /** + * Optional legacy proposed media plans. When the request carries media_buy_frequency_cap, every returned proposal echoes the bound value as proposal.frequency_cap. Buyers may refine or execute a committed proposal by ID. + */ + proposals?: Proposal[]; + /** + * Task-specific errors and warnings (e.g., product filtering issues) + */ + errors?: Error[]; + /** + * Buyer-facing market explanation required only on the GetProductsRejected arm. MAY be sanitized to protect confidential seller rules. Plain text only. + */ + reason?: string; + /** + * Actionable alternatives available only on the GetProductsRejected arm. + * + * @maxItems 20 + */ + suggestions?: + string[]; + /** + * [AdCP 3.0] Indicates whether deprecated top-level property_list filtering was applied. True if the agent filtered products based on the provided property_list; every returned product also carries the corresponding property/include list_applications receipt. Absent or false if property_list was not provided or not supported by this agent. + */ + property_list_applied?: boolean; + /** + * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching. + */ + catalog_applied?: boolean; + /** + * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'. Each entry MUST echo the request entry's scope and — for product and proposal scopes — the matching id field (product_id or proposal_id), so orchestrators can cross-validate alignment. In AdCP 3.3, when any refine entry carries package, this array is REQUIRED for the entire request. For each package entry, applied requires result_product_id, resolved_start_time, and resolved_end_time and confirms that the mapped returned product forecast uses exactly the resolved package inputs, including its goal; unable requires non-empty notes explaining why those exact inputs could not be forecast, and the product MUST NOT carry a substitute forecast. partial MUST NOT be used to imply exact package forecast support. Insufficient inventory is an applied forecast with availability_status unavailable, not an unable outcome. + */ + refinement_applied?: ( + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'request' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'request'; /** - * Human-readable explanation of what is missing and why. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - description: string; + status: 'applied' | 'partial' | 'unable'; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. */ - estimated_wait?: Duration; - }, - ...{ + notes?: string; + } + | { + } + | { /** - * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. + * Echoes scope 'proposal' from the corresponding refine entry. */ - scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; + scope: 'proposal'; /** - * Human-readable explanation of what is missing and why. + * Echoes proposal_id from the corresponding refine entry. */ - description: string; + proposal_id: string; /** - * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. + * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why. */ - estimated_wait?: Duration; - }[] - ]; - /** - * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. - */ - filter_diagnostics?: { + status: 'applied' | 'partial' | 'unable'; + /** + * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'. + */ + notes?: string; + } + )[]; + /** + * Declares what the seller could not finish within the buyer's time_budget or due to internal limits while still returning a usable response. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. This field does not classify the condition as retryable; retryability is carried by error.recovery on the error channel. + * + * @minItems 1 + */ + incomplete?: [ + { /** - * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - semantics?: 'only' | 'any' | 'approximate'; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. + * Human-readable explanation of what is missing and why. */ - total_candidates?: number; + description: string; /** - * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - excluded_by?: { - [k: string]: - | { - /** - * Number of products excluded by this filter, interpreted per the parent `semantics` field. - */ - count: number; - /** - * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. - */ - values?: (string | {})[]; - /** - * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). - */ - notes?: string; - } - | undefined; - }; - }; - pagination?: PaginationResponse; - /** - * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; - /** - * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. - */ - execution_readiness?: { + estimated_wait?: Duration; + }, + ...{ /** - * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. + * 'products': not all inventory sources were searched. 'pricing': products returned but pricing is absent or unconfirmed. 'forecast': products returned but forecast data is absent. 'proposals': proposals were not generated or are incomplete. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget — symmetric with get_signals' 'wholesale_feed' scope so sellers have a precise way to declare wholesale-incomplete on the products surface. */ - version: string; + scope: 'products' | 'pricing' | 'forecast' | 'proposals' | 'wholesale_feed'; /** - * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. + * Human-readable explanation of what is missing and why. */ - evaluated_at?: string; + description: string; /** - * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. + * How much additional time is expected to resolve this scope. Allows the buyer to decide whether to make a new attempt with a larger time_budget; its presence is not an automatic-retry instruction. */ - products: { - [k: string]: ProductExecutionReadiness | undefined; - }; - ext?: ExtensionObject; - }; + estimated_wait?: Duration; + }[] + ]; + /** + * Optional non-fatal diagnostic block describing how the request's `filters` narrowed the candidate set. Use this to disambiguate empty/small result lists between 'no inventory matches the brief' and 'a specific filter excluded everything', without breaking the filter-not-fail convention (sellers still silently exclude unmatched products; this block is observability, not error reporting). Sellers MAY populate this when meaningful narrowing occurred; buyers MAY use it for triage UX without depending on its presence. Counts only — products are not enumerated by name to avoid leaking competitive intelligence about adjacent campaigns or seller inventory. `total_candidates` and `excluded_by` are independently optional — sellers whose baseline candidate set size is sensitive MAY emit `excluded_by` without `total_candidates`, or vice versa. + */ + filter_diagnostics?: { /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + * How `excluded_by[*].count` values are computed across multiple filters. `only`: counts products that would have been included if not for THIS filter alone (deterministic; the right value for 'which filter killed my result set' triage — recommended when feasible). `any`: counts products excluded by ANY filter (so multiple filters' counts may overlap and sum to more than `total_candidates`). `approximate`: sellers SHOULD use this when their pipeline can't cleanly attribute exclusions to a single filter. Buyers SHOULD inspect `semantics` before doing arithmetic on counts. */ - cache_scope?: 'public' | 'account'; + semantics?: 'only' | 'any' | 'approximate'; /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + * Number of products the seller considered before applying `filters`. Baseline for interpreting per-filter exclusion counts. Approximate — sellers MAY return a sampled or capped count when their candidate pool is large. Optional; sellers whose baseline candidate set size is sensitive (revealing market posture or competitive density) MAY omit this while still emitting `excluded_by`. */ - unchanged?: true; + total_candidates?: number; /** - * When true, this response contains simulated data from sandbox mode. + * Per-filter exclusion counts, keyed by the filter property name as it appears in the request's `filters` object (e.g., `pricing_currencies`, `required_metrics`, `required_vendor_metrics`, `required_geo_targeting`, `budget_range`). Values are objects carrying `count` and optional filter-specific detail. Only filters that actually narrowed the set need appear here; absence of a key means that filter did not exclude anything (or was not in the request). */ - sandbox?: boolean; - context?: ContextObject; - ext?: ExtensionObject; + excluded_by?: { + [k: string]: + | { + /** + * Number of products excluded by this filter, interpreted per the parent `semantics` field. + */ + count: number; + /** + * Optional list of the specific filter values that contributed to exclusions, when meaningful. For `required_metrics`: the metric names that excluded products (strings). For `required_vendor_metrics`: the vendor/metric pin entries (objects). Item shape is filter-specific; the schema admits string OR object items. Buyers without filter-specific knowledge SHOULD treat as opaque. + */ + values?: (string | {})[]; + /** + * Optional human-readable note about why this filter narrowed the set (e.g., 'no products in this brief support DV viewability at the requested threshold'). + */ + notes?: string; + } + | undefined; + }; }; -/** - * Response payload for get_signals task - */ -export type GetSignalsCompletion = AdCPVersionEnvelope & - ProtocolEnvelope & { - /** - * Array of matching signals - */ - signals?: (SignalListing & - SignalDefinitionEnrichment & { - })[]; - /** - * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. - * - * @minItems 1 - */ - signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; - /** - * Task-specific errors and warnings (e.g., signal discovery or pricing issues) - */ - errors?: Error[]; - /** - * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. - * - * @minItems 1 - */ - incomplete?: [ - { - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }, - ...{ - /** - * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. - */ - scope: 'signals' | 'pricing' | 'wholesale_feed'; - /** - * Human-readable explanation of what is missing and why. - */ - description: string; - /** - * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. - */ - estimated_wait?: Duration; - }[] - ]; - /** - * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. - */ - wholesale_feed_version?: string; - /** - * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. - */ - pricing_version?: string; + pagination?: PaginationResponse; + /** + * Opaque token representing the version of the wholesale product feed state used to compose this response. Sellers that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so buyers can cache and probe later. Buyers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A buyer caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog, include_collections) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. Without include_collections, collection copies are outside the version; with include_collections true, the version also changes when any returned collection copy changes, and sellers issue distinct tokens for the two settings. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer, including product pricing_options and nested signal_targeting_options pricing_options. When the seller supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Sellers not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Experimental (`media_buy.execution_readiness`). Whether the request's `account` can satisfy the `execution_requirements[]` of the products on this response, keyed by `product_id`. Present only when the request set `include_execution_readiness: true` and carried an authorized `account`. Advisory: `create_media_buy` revalidates. Not part of the cache layer: it does not change `cache_scope`, `wholesale_feed_version`, or `pricing_version`, buyers key it by (account, `version`) and MUST NOT cache it under the public key, sellers MUST NOT put it in wholesale feed webhooks and MUST omit it on `unchanged: true` responses. Covers only this response's products; merge pages by `product_id`. See the media-buy specification, 'Per-account execution readiness'. + */ + execution_readiness?: { /** - * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. + * Opaque token for the account's readiness state, independent of `wholesale_feed_version` and `pricing_version`. Compare for equality only. Equal versions MUST imply identical entries for any product present in both responses. */ - cache_scope?: 'public' | 'account'; + version: string; /** - * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + * When the seller read the account's resources. Readiness may be stale by then; `create_media_buy` is authoritative. */ - unchanged?: true; - pagination?: PaginationResponse; + evaluated_at?: string; /** - * When true, this response contains simulated data from sandbox mode. + * Readiness keyed by `product_id`, for returned products that declare `execution_requirements`. A missing entry means not evaluated, not ready. */ - sandbox?: boolean; - context?: ContextObject; + products: { + [k: string]: ProductExecutionReadiness | undefined; + }; ext?: ExtensionObject; }; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the seller's published rate card; the buyer MAY dedupe under (agent, buying_mode, filters, targeting_overlay, media_buy_frequency_cap, required_overlay_support, required_media_buy_support, deprecated property_list, catalog) without scoping by account. 'account': this response includes account-specific overrides; the buyer MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the seller MUST return `cache_scope: 'public'`. When the request included `account`, the seller MUST return either: 'public' (this account prices off the public rate card — buyer dedupes) or 'account' (account-specific overrides exist — buyer caches under the account key). Sellers MAY return 'public' on an account-scoped request that previously had overrides — buyers SHOULD interpret this as a downgrade and drop their account-overlay. Without schema-required cache_scope, a seller silently omitting the field on an account-scoped response would cause buyers to mis-key the cache and serve account-overlay payloads to other accounts. **Backward-compatibility note for 3.1 validators:** SDKs that validate strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version` (release-precision version negotiation, 3.1). For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the seller's current version for the buyer's cache_scope, in which case products[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Buyers receiving unchanged: true MUST NOT mutate their local wholesale product mirror. **One shape per state:** sellers MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries products. Two shapes ({ unchanged: false, products: [...] } vs. { products: [...] }) for the same state would let some sellers always emit the field and some never would, creating an inconsistency the wire shouldn't carry. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. A seller MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the buyer echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the seller's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; +/** + * Response payload for get_signals task + */ +export type GetSignalsCompletion = ProtocolEnvelope & { + /** + * Array of matching signals + */ + signals?: (SignalListing & + SignalDefinitionEnrichment & { + })[]; + /** + * Experimental (signals.pricing_groups). Signal-agent default rules for how fees of signals sharing a pricing_group combine. Product-scoped signal_targeting_rules.signal_pricing_group_rules override these for the same pricing_group. A group with no rule is charged 'each'. + * + * @minItems 1 + */ + signal_pricing_group_rules?: [SignalPricingGroupRule, ...SignalPricingGroupRule[]]; + /** + * Task-specific errors and warnings (e.g., signal discovery or pricing issues) + */ + errors?: Error[]; + /** + * Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete. + * + * @minItems 1 + */ + incomplete?: [ + { + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }, + ...{ + /** + * 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget. + */ + scope: 'signals' | 'pricing' | 'wholesale_feed'; + /** + * Human-readable explanation of what is missing and why. + */ + description: string; + /** + * How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget. + */ + estimated_wait?: Duration; + }[] + ]; + /** + * Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model. + */ + wholesale_feed_version?: string; + /** + * Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both. + */ + pricing_version?: string; + /** + * Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break. + */ + cache_scope?: 'public' | 'account'; + /** + * Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals. **Cross-scope isolation:** the comparator that decides `unchanged` MUST be keyed on `(cache_scope, wholesale_feed_version)`, not on the token value alone. An agent MUST NOT emit `unchanged: true` when it resolves the request to a different `cache_scope` than the one whose token the caller echoed in `if_wholesale_feed_version` (and/or `if_pricing_version`): because the token is scope-keyed, a value minted for `cache_scope: 'public'` cannot match the agent's current token for `cache_scope: 'account'` (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token. + */ + unchanged?: true; + pagination?: PaginationResponse; + /** + * When true, this response contains simulated data from sandbox mode. + */ + sandbox?: boolean; + context?: ContextObject; + ext?: ExtensionObject; +}; /** * Projected authoritative demographic meaning for the signal. When projected from another provider, this MUST match the provider's definition exactly. Signal names alone never establish demographic semantics. */ @@ -41953,7 +41818,7 @@ export interface ComplyTestControllerRequest { */ adcp_major_version?: number; /** - * Test scenario to execute. 'list_scenarios' discovers supported scenarios. 'force_*' and 'simulate_*' trigger state transitions. 'reporting_core_lifecycle_probe' installs a caller/account-scoped Core fixture whose first elapsed obligation is visible before any report, advances its virtual clock into delayed or action_required, and can publish deterministic zero-row or non-empty revisions, restate a provisional revision, restate one the caller already received, or cross the consumer-status deadline and consumer-mismatch escalation boundaries, without waiting for wall-clock boundaries. 'force_hold_unavailable' (experimental, media_buy.hold_policy) makes the next refine_proposals finalize of one draft proposal fail with hold_unavailable, its batch siblings with batch_aborted, and is then consumed. Other scenarios provide deterministic sandbox probes for their documented lifecycle checks. Runners and sellers MUST accept unknown scenario strings - new scenarios may be added in additive releases. + * Test scenario to execute. 'list_scenarios' discovers supported scenarios. 'reporting_subscription_probe' (experimental, media_buy.reporting_subscriptions) revokes, re-grants, or reduces the caller's own grant on a sandbox account, changes a sandbox account's timezone, or advances the sandbox clock, so storyboards can test reporting-subscription coverage across grants and cutovers against a remote seller. 'force_*' and 'simulate_*' trigger state transitions. 'reporting_core_lifecycle_probe' installs a caller/account-scoped Core fixture whose first elapsed obligation is visible before any report, advances its virtual clock into delayed or action_required, and can publish deterministic zero-row or non-empty revisions, restate a provisional revision, restate one the caller already received, or cross the consumer-status deadline and consumer-mismatch escalation boundaries, without waiting for wall-clock boundaries. 'force_hold_unavailable' (experimental, media_buy.hold_policy) makes the next refine_proposals finalize of one draft proposal fail with hold_unavailable, its batch siblings with batch_aborted, and is then consumed. Other scenarios provide deterministic sandbox probes for their documented lifecycle checks. Runners and sellers MUST accept unknown scenario strings - new scenarios may be added in additive releases. */ scenario: string; /** @@ -42013,7 +41878,7 @@ export interface ComplyTestControllerRequest { */ fixture?: {}; /** - * Scenario-specific probe operation. catalog_item_availability_probe uses seed_inaccessible_item, query_eligibility, advance_time, and recreate_catalog. compact_product_lifecycle_probe uses prepare to make one seeded product's compact proposal, acceptance, operational-control, and MediaBuy readback path deterministic and expire_proposal to advance strictly beyond a committed proposal's stored expires_at and process the hold lapse. compact_direct_buy_lifecycle_probe uses prepare to make one seeded product's list, direct-purchase, operational-control, and readback path deterministic. reporting_core_lifecycle_probe uses prepare, advance_time, publish_zero_row, publish_nonempty, restate_snapshot, restate_after_received, omit_obligation, advance_past_status_deadline, and advance_past_escalation to exercise obligation availability, health deadlines, explicit reporting, provisional restatement, stale-received grace, buyer-side missing-obligation detection, counted consumer-status silence, and consumer-mismatch escalation. advance_past_status_deadline moves the clock strictly past expected_at plus the advertised automated_recovery_window_seconds without recording any consumer status, so obligation_counts.consumer_status_pending is gradable; advance_past_escalation moves it strictly past the open CONSUMER_STATUS_MISMATCH issue opened_at plus the advertised consumer_mismatch_escalation_seconds and returns both that boundary and any still-future stale_received_grace_deadline, so the escalation precedence rule is gradable. restate_snapshot publishes a new snapshot revision that immediately supersedes the current snapshot for the same logical slice and is invalid when the current revision is official. restate_after_received does the same restatement but only against the revision named in received_reporting_revision_id, so the stale-received grace projection can be graded live; it returns the grace deadline and advance_to positions the virtual clock inside or past it. Reliable Reporting tier probes use prepare plus publish_official_adjustment, probe_scheduler_dst, suppress_readiness, advance_within_retention, revoke_access, or publish_adjustment to seed deterministic Core-integrity, Managed Delivery, and Reconciled Billing lifecycle evidence. + * Scenario-specific probe operation. catalog_item_availability_probe uses seed_inaccessible_item, query_eligibility, advance_time, and recreate_catalog. compact_product_lifecycle_probe uses prepare to make one seeded product's compact proposal, acceptance, operational-control, and MediaBuy readback path deterministic and expire_proposal to advance strictly beyond a committed proposal's stored expires_at and process the hold lapse. compact_direct_buy_lifecycle_probe uses prepare to make one seeded product's list, direct-purchase, operational-control, and readback path deterministic. reporting_core_lifecycle_probe uses prepare, advance_time, publish_zero_row, publish_nonempty, restate_snapshot, restate_after_received, omit_obligation, advance_past_status_deadline, and advance_past_escalation to exercise obligation availability, health deadlines, explicit reporting, provisional restatement, stale-received grace, buyer-side missing-obligation detection, counted consumer-status silence, and consumer-mismatch escalation. advance_past_status_deadline moves the clock strictly past expected_at plus the advertised automated_recovery_window_seconds without recording any consumer status, so obligation_counts.consumer_status_pending is gradable; advance_past_escalation moves it strictly past the open CONSUMER_STATUS_MISMATCH issue opened_at plus the advertised consumer_mismatch_escalation_seconds and returns both that boundary and any still-future stale_received_grace_deadline, so the escalation precedence rule is gradable. restate_snapshot publishes a new snapshot revision that immediately supersedes the current snapshot for the same logical slice and is invalid when the current revision is official. restate_after_received does the same restatement but only against the revision named in received_reporting_revision_id, so the stale-received grace projection can be graded live; it returns the grace deadline and advance_to positions the virtual clock inside or past it. Reliable Reporting tier probes use prepare plus publish_official_adjustment, probe_scheduler_dst, suppress_readiness, advance_within_retention, revoke_access, or publish_adjustment to seed deterministic Core-integrity, Managed Delivery, and Reconciled Billing lifecycle evidence. reporting_subscription_probe (experimental, media_buy.reporting_subscriptions) uses revoke_grant, regrant, reduce_grant, set_account_timezone, and advance_time to drive grants, account timezone cutovers, and the sandbox clock for reporting-subscription coverage. */ operation?: | 'seed_inaccessible_item' @@ -42034,7 +41899,11 @@ export interface ComplyTestControllerRequest { | 'suppress_readiness' | 'advance_within_retention' | 'revoke_access' - | 'publish_adjustment'; + | 'publish_adjustment' + | 'revoke_grant' + | 'regrant' + | 'reduce_grant' + | 'set_account_timezone'; /** * Clock-derived health boundary selected by reporting_core_lifecycle_probe advance_time. The controller chooses the corresponding deterministic target time; callers do not supply timestamps. */ @@ -42069,7 +41938,18 @@ export interface ComplyTestControllerRequest { */ item_id?: string; /** - * Deterministic sandbox clock target used by catalog_item_availability_probe advance_time. + * reporting_subscription_probe reduce_grant: the complete allowed_tasks the caller's grant on account_id keeps, for example only get_reporting_status, sync_reporting_receipts, and sync_reporting_status to model a wind-down. + * @maxItems 64 + */ + allowed_tasks?: string[]; + /** + * reporting_subscription_probe set_account_timezone: the account's new IANA timezone. + * @minLength 1 + * @maxLength 255 + */ + timezone?: string; + /** + * Deterministic sandbox clock target used by catalog_item_availability_probe advance_time and reporting_subscription_probe advance_time. * @format date-time */ target_time?: string; @@ -42265,9 +42145,8 @@ export interface ComplyTestControllerRequest { arm?: 'submitted' | 'completed' | 'input-required' | 'rejected'; /** * Deterministic task handle the seller MUST emit verbatim on the next forced operation response when arm is 'submitted'. The seller MUST accept this exact value on subsequent tasks/get or get_task_status calls within the same authenticated sandbox account + principal pair and MUST return REFERENCE_NOT_FOUND for the same task_id under any other account or principal. Sandbox task_ids are caller-opaque strings - the seller's production task-id format rules do not apply. - * @maxLength 128 */ - task_id?: string; + task_id?: TaskID; /** * Deterministic provider evaluation identity the seller MUST emit on the next forced get_creative_features submitted acknowledgement and preserve on its terminal completion result. * @minLength 1 @@ -42438,25 +42317,28 @@ export interface GetCreativeFeaturesCompletion { */ export type ComplyTestControllerResponse = { /** - * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). + * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. */ - context_id?: string; - context?: ContextObject; + adcp_version?: string; /** - * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete. + * @deprecated + * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. */ - task_id?: string; - status: TaskStatus; + adcp_major_version?: number; /** - * Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response. + * Transport-managed conversation identifier. On A2A, this maps to the native Message/Task `contextId` used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body `context_id`, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from `context` (per-request opaque echo, see below) and from `task_id` (AdCP operation tracking). */ - message?: string; + context_id?: string; + context?: ContextObject; + task_id?: TaskID; + status: TaskStatus; + message?: TaskMessage; /** * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress. */ timestamp?: string; /** - * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed` appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. + * Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. `replayed: true` appears only when the request actually resolved through the idempotency cache; an absent `replayed` means `false`, and a response MAY carry `replayed: false`. Pure reads may ignore an optional `idempotency_key`; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract. */ replayed?: boolean; adcp_error?: Error; @@ -42473,15 +42355,6 @@ export type ComplyTestControllerResponse = { * Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body. */ payload?: {}; - /** - * Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values. - */ - adcp_version?: string; - /** - * @deprecated - * DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version. - */ - adcp_major_version?: number; } & ( | ListScenariosSuccess | StateTransitionSuccess @@ -42498,7 +42371,7 @@ export type ComplyTestControllerResponse = { export interface ListScenariosSuccess { success: true; /** - * Scenarios this seller has implemented. Runners and sellers MUST accept unknown scenario strings (open-for-extension) — new scenarios may be added in additive releases. Adopters who advertise `catalog_item_availability_probe` support deterministic cross-principal reference, eligibility-gate, expiry-clock, and catalog-generation tests for the catalog availability storyboard. Adopters who advertise `compact_product_lifecycle_probe` support deterministic synchronous list/request/finalize/decline/accept/control/readback behavior for a prepared product and strict post-deadline expiry of a committed proposal. Adopters who advertise `compact_direct_buy_lifecycle_probe` support deterministic synchronous list/buy/control/readback behavior for a prepared product. Adopters who advertise `reporting_core_lifecycle_probe` support deterministic obligation-before-report, clock-health, zero-row reporting, provisional-restatement, and post-received restatement-grace tests without wall-clock waits. `reliable_reporting_core_integrity_probe`, `reliable_reporting_managed_delivery_probe`, and `reliable_reporting_reconciled_billing_probe` seed the source-calendar/checkpoint, managed-resource, and receipt/adjustment workflows used by the Reliable Reporting tier storyboards. Adopters who advertise `force_creative_purge` opt in to deterministic creative purge coverage for account-level lifecycle webhooks. Adopters who advertise `force_media_buy_purge` opt in to deterministic deletion-independent idempotency replay coverage. Adopters who advertise `seed_measurement_catalog` opt in to deterministic measurement-catalog fixtures used by vendor_metric precondition storyboards. Adopters who advertise `query_upstream_traffic` opt in to the upstream-traffic conformance contract; storyboards that declare `check: upstream_traffic` grade not_applicable against adopters who do not advertise it. Adopters who advertise `query_provenance_audit_observations` opt in to sandbox-only audit-observation assertions for accepted creatives. Adopters who advertise `force_upstream_unavailable` opt in to stale-cache conformance testing via the `stale_response_advisory` storyboard. Adopters who advertise `force_hold_unavailable` opt in to deterministic hold-failure coverage for `refine_proposals` finalize (experimental, `media_buy.hold_policy`). + * Scenarios this seller has implemented. Runners and sellers MUST accept unknown scenario strings (open-for-extension) — new scenarios may be added in additive releases. Adopters who advertise `catalog_item_availability_probe` support deterministic cross-principal reference, eligibility-gate, expiry-clock, and catalog-generation tests for the catalog availability storyboard. Adopters who advertise `compact_product_lifecycle_probe` support deterministic synchronous list/request/finalize/decline/accept/control/readback behavior for a prepared product and strict post-deadline expiry of a committed proposal. Adopters who advertise `compact_direct_buy_lifecycle_probe` support deterministic synchronous list/buy/control/readback behavior for a prepared product. Adopters who advertise `reporting_core_lifecycle_probe` support deterministic obligation-before-report, clock-health, zero-row reporting, provisional-restatement, and post-received restatement-grace tests without wall-clock waits. Adopters who advertise `reporting_subscription_probe` (experimental) support deterministic grant revocation, re-grant, grant reduction, account timezone cutover, and sandbox clock tests for reporting-subscription coverage. `reliable_reporting_core_integrity_probe`, `reliable_reporting_managed_delivery_probe`, and `reliable_reporting_reconciled_billing_probe` seed the source-calendar/checkpoint, managed-resource, and receipt/adjustment workflows used by the Reliable Reporting tier storyboards. Adopters who advertise `force_creative_purge` opt in to deterministic creative purge coverage for account-level lifecycle webhooks. Adopters who advertise `force_media_buy_purge` opt in to deterministic deletion-independent idempotency replay coverage. Adopters who advertise `seed_measurement_catalog` opt in to deterministic measurement-catalog fixtures used by vendor_metric precondition storyboards. Adopters who advertise `query_upstream_traffic` opt in to the upstream-traffic conformance contract; storyboards that declare `check: upstream_traffic` grade not_applicable against adopters who do not advertise it. Adopters who advertise `query_provenance_audit_observations` opt in to sandbox-only audit-observation assertions for accepted creatives. Adopters who advertise `force_upstream_unavailable` opt in to stale-cache conformance testing via the `stale_response_advisory` storyboard. Adopters who advertise `force_hold_unavailable` opt in to deterministic hold-failure coverage for `refine_proposals` finalize (experimental, `media_buy.hold_policy`). */ scenarios: string[]; context?: ContextObject; @@ -42517,15 +42390,11 @@ export interface StateTransitionSuccess { * State after this transition */ current_state: string; - /** - * Human-readable description of the transition - */ - message?: string; context?: ContextObject; ext?: ExtensionObject; } /** - * A simulate_delivery, simulate_budget_spend, simulate_later_proposal, catalog_item_availability_probe, compact_product_lifecycle_probe, compact_direct_buy_lifecycle_probe, reporting_core_lifecycle_probe, or Reliable Reporting tier-probe operation succeeded. For delivery: simulated contains the metrics injected by this call (impressions/clicks/plays/reported_spend/conversions plus optional DOOH, reach, frequency, reach-window, and viewability values) and cumulative contains running totals or latest non-additive metric state. For budget: simulated contains spend_percentage/computed_spend/budget. For a later proposal: simulated contains proposal_id, opportunity_id, and later_reason of the created snapshot. For catalog availability: simulated reports seeded foreign identity, actual eligibility gates, processed expiry time, or delete/recreate generation rotation according to params.operation. For compact product lifecycle: simulated reports deterministic preparation through MediaBuy control/readback or strict post-deadline proposal expiry. For compact direct-buy lifecycle: simulated reports deterministic preparation. For reporting Core: simulated reports the fixed virtual time plus stable account, configuration, obligation, and revision identifiers created or advanced by the operation; prepare also reports the complete resolved configuration, period, expected_at, and recovery_deadline, restate_snapshot reports the new revision plus supersedes_reporting_revision_id, and restate_after_received additionally reports received_reporting_revision_id, restated_at, and stale_received_grace_deadline; advance_past_status_deadline reports expected_at, automated_recovery_window_seconds, and the crossed consumer_status_deadline; and advance_past_escalation reports issue_id, issue_opened_at, consumer_mismatch_escalation_seconds, consumer_mismatch_escalation_deadline, expected_recommended_action, and any still-future stale_received_grace_deadline. Reliable Reporting tier probes return the exact seeded ledger IDs, checkpoints, notification order, resource lifecycle evidence, and receipt bodies required by their storyboards. + * A simulate_delivery, simulate_budget_spend, simulate_later_proposal, catalog_item_availability_probe, compact_product_lifecycle_probe, compact_direct_buy_lifecycle_probe, reporting_core_lifecycle_probe, reporting_subscription_probe, or Reliable Reporting tier-probe operation succeeded. For delivery: simulated contains the metrics injected by this call (impressions/clicks/plays/reported_spend/conversions plus optional DOOH, reach, frequency, reach-window, and viewability values) and cumulative contains running totals or latest non-additive metric state. For budget: simulated contains spend_percentage/computed_spend/budget. For a later proposal: simulated contains proposal_id, opportunity_id, and later_reason of the created snapshot. For catalog availability: simulated reports seeded foreign identity, actual eligibility gates, processed expiry time, or delete/recreate generation rotation according to params.operation. For compact product lifecycle: simulated reports deterministic preparation through MediaBuy control/readback or strict post-deadline proposal expiry. For compact direct-buy lifecycle: simulated reports deterministic preparation. For reporting Core: simulated reports the fixed virtual time plus stable account, configuration, obligation, and revision identifiers created or advanced by the operation; prepare also reports the complete resolved configuration, period, expected_at, and recovery_deadline, restate_snapshot reports the new revision plus supersedes_reporting_revision_id, and restate_after_received additionally reports received_reporting_revision_id, restated_at, and stale_received_grace_deadline; advance_past_status_deadline reports expected_at, automated_recovery_window_seconds, and the crossed consumer_status_deadline; and advance_past_escalation reports issue_id, issue_opened_at, consumer_mismatch_escalation_seconds, consumer_mismatch_escalation_deadline, expected_recommended_action, and any still-future stale_received_grace_deadline. For reporting subscriptions: simulated reports simulated_now and account_id; revoke_grant adds unauthorized_at; regrant adds authorized_at, regranted_at when the re-grant continued the chain, and chain (continued or new); reduce_grant adds the applied allowed_tasks; set_account_timezone adds previous_timezone, timezone, and the per-offering effective_at cutover instants; advance_time adds the applied simulated_now. Reliable Reporting tier probes return the exact seeded ledger IDs, checkpoints, notification order, resource lifecycle evidence, and receipt bodies required by their storyboards. */ export interface SimulationSuccess { success: true; @@ -42537,7 +42406,6 @@ export interface SimulationSuccess { * Running totals across all simulation calls (simulate_delivery only) */ cumulative?: {}; - message?: string; context?: ContextObject; ext?: ExtensionObject; } @@ -42556,9 +42424,8 @@ export interface ForcedDirectiveSuccess { arm: 'submitted' | 'completed' | 'input-required' | 'rejected' | 'unable'; /** * Echo of the registered task_id. Present only when arm is 'submitted' (the arm that emits a task envelope). - * @maxLength 128 */ - task_id?: string; + task_id?: TaskID; /** * Echo of the provider evaluation identity registered by force_get_creative_features_arm. * @minLength 1 @@ -42582,10 +42449,6 @@ export interface ForcedDirectiveSuccess { */ proposal_id?: string; }; - /** - * Human-readable acknowledgement. - */ - message?: string; context?: ContextObject; ext?: ExtensionObject; } @@ -42594,10 +42457,6 @@ export interface ForcedDirectiveSuccess { */ export interface SeedSuccess { success: true; - /** - * Human-readable acknowledgement. - */ - message?: string; context?: ContextObject; ext?: ExtensionObject; } diff --git a/src/lib/validation/schema-loader.ts b/src/lib/validation/schema-loader.ts index ff02ab89e..6316ee7a5 100644 --- a/src/lib/validation/schema-loader.ts +++ b/src/lib/validation/schema-loader.ts @@ -1588,7 +1588,7 @@ const servedReleaseRootAliases = new Map>(); * `get_adcp_capabilities` response. * * Keys are AdCP versions in any form the SDK accepts for a pin (`'3.2'`, - * `'3.2.5'`, `'3.3.0-beta.2'`); values are schema-data roots in the same + * `'3.2.5'`, `'3.3.0-beta.3'`); values are schema-data roots in the same * shape as `schemaRoot` (a directory holding `bundled/`, e.g. a hosted * `dist/schemas/3.2.5`). Each root is checked against its key the same way * `withExternalSchemaRoot` checks one, and a malformed map throws before `fn` diff --git a/src/lib/version.ts b/src/lib/version.ts index 753278923..1c8007d31 100644 --- a/src/lib/version.ts +++ b/src/lib/version.ts @@ -9,7 +9,7 @@ export const LIBRARY_VERSION = '17.0.0-beta.10'; /** * AdCP specification version this library is built for */ -export const ADCP_VERSION = '3.3.0-beta.2'; +export const ADCP_VERSION = '3.3.0-beta.3'; /** * AdCP major version sent with every request (adcp_major_version field). @@ -95,8 +95,8 @@ export const COMPATIBLE_ADCP_VERSIONS = [ '3.2.5', '3.2.6', '3.2.7', - '3.3.0-beta.2', - '3.3-beta.2', + '3.3.0-beta.3', + '3.3-beta.3', ] as const; /** @@ -114,9 +114,9 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number]; */ export const VERSION_INFO = { library: '17.0.0-beta.10', - adcp: '3.3.0-beta.2', + adcp: '3.3.0-beta.3', compatibleVersions: COMPATIBLE_ADCP_VERSIONS, - generatedAt: '2026-10-30T20:11:07.843Z', + generatedAt: '2026-10-31T11:03:37.239Z', } as const; /** diff --git a/test/check-publish-protocol-artifacts.test.js b/test/check-publish-protocol-artifacts.test.js index d4a24b1f4..38ab069a3 100644 --- a/test/check-publish-protocol-artifacts.test.js +++ b/test/check-publish-protocol-artifacts.test.js @@ -8,7 +8,7 @@ const modulePromise = import( pathToFileURL(path.resolve(__dirname, '..', 'scripts', 'check-publish-protocol-artifacts.mjs')).href ); -const currentProtocolVersion = '3.3.0-beta.2'; +const currentProtocolVersion = '3.3.0-beta.3'; const compatibleVersions = [ 'v3', '3.0.1', @@ -18,7 +18,7 @@ const compatibleVersions = [ '3.2.7', '3.2', currentProtocolVersion, - '3.3-beta.2', + '3.3-beta.3', ]; function fixture(overrides = {}) { diff --git a/test/fixtures/reporting-subscriptions/canonical/PINNED.json b/test/fixtures/reporting-subscriptions/canonical/PINNED.json index a3bd45a64..7eaa2e86b 100644 --- a/test/fixtures/reporting-subscriptions/canonical/PINNED.json +++ b/test/fixtures/reporting-subscriptions/canonical/PINNED.json @@ -1,13 +1,14 @@ { "repository": "adcontextprotocol/adcp", "pr": 8616, - "sha": "023bbd26e7c230dcc74bea4087336ea6bc8d0f6a", + "tag": "v3.3.0-beta.3", + "sha": "a6106149a2b5c929eec0caa0042adbae4ccf3a9c", "path": "static/compliance/source/test-vectors/reporting-subscriptions", "vendored": "Byte-for-byte copies of the listed files at the pinned commit (the README stays upstream). test/lib/reporting-subscription-coverage.test.js fails when a file's sha256 differs from this pin. Refresh with: npm run sync:reporting-subscription-vectors -- --commit [--from ]. The Python SDK runs the same vectors.", "sha256": { - "case.schema.json": "0550b51097ea2c9a6bbd8721de5b5855acfcbd097dff31edeb0df2f397f7dc42", + "case.schema.json": "17448cb98b1c8ce671b0c5f354492e4965f833320c78f4ee6722b184ab344c60", "error-codes.json": "4e8e5142ada936fc8923735155d786a0801258922fb85b492785730479713481", "reason-codes.json": "2574b2a32fb8260fc7f9a7d9cd1eac1b588aa22c54a350e54964a893b80e77c4", - "vectors.json": "b392df771fc2bf635c5c441ff2dd5107e1cda13ab483fe902a6a56661f5e7904" + "vectors.json": "56cc381bc336b31cb0abc589d73d0f1a8ecd52f5c42532fc47fb9112c3b594a4" } } diff --git a/test/fixtures/reporting-subscriptions/canonical/case.schema.json b/test/fixtures/reporting-subscriptions/canonical/case.schema.json index cbf0750ad..cc54c675c 100644 --- a/test/fixtures/reporting-subscriptions/canonical/case.schema.json +++ b/test/fixtures/reporting-subscriptions/canonical/case.schema.json @@ -57,18 +57,6 @@ }, "description": "IANA zones the expected rows depend on, as named in the input. Empty when every schedule is utc-aligned." }, - "non_wire_inputs": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "enum": [ - "buys[].prior_flights", - "offerings[].available_from/withdrawn_at" - ] - }, - "description": "Input fields no AdCP response carries; a buyer must retain them to agree with the seller." - }, "input": { "$ref": "#/definitions/input" }, @@ -353,6 +341,10 @@ "$ref": "#/definitions/instant", "description": "cancellation.canceled_at." }, + "cancellation_effective_at": { + "$ref": "#/definitions/instant", + "description": "cancellation_effective_at, the delivery stop under the cancellation. When present it, not canceled_at, is the cancellation's term in the stop time." + }, "completed_at": { "$ref": "#/definitions/instant" }, @@ -380,30 +372,24 @@ "additionalProperties": false } }, - "prior_flights": { + "flight_history": { "type": "array", - "description": "Not on the wire. Flight values before an update replaced them; a value applies to periods resolved before its replaced_at.", + "description": "The buy's flight_history from get_media_buys (core/media-buy.json flight_history): its retroactive flight edits, oldest first, each with the flight in force before it. The flight in force at an instant is the one in the earliest entry recorded after it, or the current flight.", "items": { "type": "object", "required": [ - "replaced_at", + "recorded_at", "start_time", - "end_time" + "stop_time" ], "properties": { - "replaced_at": { + "recorded_at": { "$ref": "#/definitions/instant" }, "start_time": { "$ref": "#/definitions/instant" }, - "end_time": { - "$ref": "#/definitions/instant" - }, - "canceled_at": { - "$ref": "#/definitions/instant" - }, - "completed_at": { + "stop_time": { "$ref": "#/definitions/instant" } }, @@ -416,7 +402,7 @@ }, "offerings": { "type": "array", - "description": "Seller offerings as published (reporting-delivery-offering.json, with standard_dimensions and unmapped_dimensions). available_from and withdrawn_at are not on the wire: when the offering became or stopped being available, which changes a resolution.", + "description": "Seller offerings as published (reporting-delivery-offering.json, with standard_dimensions, unmapped_dimensions, and the availability window available_from and withdrawn_at, which changes a resolution).", "items": { "type": "object", "required": [ @@ -494,6 +480,11 @@ }, "period_end": { "$ref": "#/definitions/z_instant" + }, + "stub": { + "type": "boolean", + "const": true, + "description": "Present, and true, on a billing cutover stub: the stretch [E, first incoming boundary) a cutover hands to a billing feed whose schedule has no boundary at E (core/reporting-obligation.json stub)." } }, "additionalProperties": false @@ -521,6 +512,11 @@ "period_end": { "$ref": "#/definitions/z_instant" }, + "stub": { + "type": "boolean", + "const": true, + "description": "Present, and true, on a billing cutover stub: the stretch [E, first incoming boundary) a cutover hands to a billing feed whose schedule has no boundary at E (core/reporting-obligation.json stub)." + }, "media_buy_ids": { "type": "array", "minItems": 1, diff --git a/test/fixtures/reporting-subscriptions/canonical/vectors.json b/test/fixtures/reporting-subscriptions/canonical/vectors.json index d71be543a..aa327822d 100644 --- a/test/fixtures/reporting-subscriptions/canonical/vectors.json +++ b/test/fixtures/reporting-subscriptions/canonical/vectors.json @@ -11,11 +11,10 @@ }, "conventions": { "instants": "Every timestamp is an RFC 3339 instant and may carry fractional seconds or a non-Z offset. Compare instants, never strings. Expected rows write instants in Z form, with fractional seconds only when they are non-zero. Inputs carry at most millisecond precision.", - "rows": "expected has one row per (media buy, resolved offering, owed period), ordered by period_start, then subscription_version, then offering_id and media_buy_id in byte order. subscription_id, account_id, and report_definition_id are omitted: they are input.subscription_id, input.account.account_id, and the offering's report_definition_id.", + "rows": "expected has one row per (media buy, resolved offering, owed period), ordered by period_start, then subscription_version, then offering_id and media_buy_id in byte order. subscription_id, account_id, and report_definition_id are omitted: they are input.subscription_id, input.account.account_id, and the offering's report_definition_id. A billing cutover stub row, and its obligation, carry stub: true.", "obligations": "expected_obligations groups expected by subscription_version, offering_id, period_start, and period_end, with media_buy_ids sorted in byte order, the obligation's frozen media_buy_ids. Ordered by period_start, then subscription_version, then offering_id in byte order.", "now": "Only resolved periods are expected: those whose period_end is at or before input.now.", "input": "The input is what the buyer holds: its subscription versions as the get_principal readback shows them, the account's grants and timezone, the buys it can see through get_media_buys, the seller's offerings, and this subscription's get_reporting_status subscription_coverage entry for the account. case.schema.json describes each field.", - "non_wire_inputs": "Lists input fields no AdCP response carries, which a buyer must retain itself to agree with the seller: buys[].prior_flights (flight values before an update) and offerings[].available_from or withdrawn_at (when an offering became or stopped being available, which changes a resolution).", "expected_error": "When the input cannot determine coverage, expected_error gives the error code and detail an SDK raises, from error-codes.json in this directory (COVERAGE_INPUT_INCOMPLETE or COVERAGE_INPUT_INVALID). wire_valid is false when the input also fails AdCP schema validation.", "vocabularies": "error-codes.json freezes the error codes SDKs raise for subscriptions and coverage; reason-codes.json freezes the reasons a period is or is not owed. Both SDKs use them verbatim." }, @@ -549,6 +548,131 @@ } ] }, + { + "id": "cancellation-notice-period-is-owed-through-the-delivery-stop", + "name": "cancellation notice period is owed through the delivery stop", + "origin": "adcp", + "rule": "adcp#8617: canceled_at 11-05T06 records the cancellation, but the seller delivers through a notice period until cancellation_effective_at 11-07T00, the delivery stop. The stop time is the earliest of end_time, the delivery stop, and completed_at, so periods through 11-06 are owed; canceled_at alone would have stopped them at the period containing it.", + "spec_refs": [ + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", + "static/schemas/source/core/media-buy.json#/properties/cancellation_effective_at", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": [], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-11-01T12:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, + "reconciliation_mode": "delivery_only" + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-11-02T15:00:00Z", + "start_time": "2026-11-03T00:00:00Z", + "end_time": "2026-11-10T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}], + "canceled_at": "2026-11-05T06:00:00Z", + "cancellation_effective_at": "2026-11-07T00:00:00Z" + } + ], + "offerings": [ + { + "offering_id": "off_a_pkg", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_a_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_a_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + } + ], + "now": "2026-12-01T00:00:00Z" + }, + "expected": [ + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-06T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-06T00:00:00Z", + "period_end": "2026-11-07T00:00:00Z" + } + ], + "expected_obligations": [ + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-06T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-06T00:00:00Z", + "period_end": "2026-11-07T00:00:00Z", + "media_buy_ids": ["mb_1"] + } + ] + }, { "id": "early-completion-on-a-boundary", "name": "early completion on a boundary", @@ -640,7 +764,6 @@ "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" ], "timezones": [], - "non_wire_inputs": ["buys[].prior_flights"], "input": { "subscription_id": "analytics-daily", "versions": [ @@ -665,7 +788,7 @@ "start_time": "2026-11-03T00:00:00Z", "end_time": "2026-11-08T00:00:00Z", "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}], - "prior_flights": [{"replaced_at": "2026-11-07T12:00:00Z", "start_time": "2026-11-03T00:00:00Z", "end_time": "2026-11-06T00:00:00Z"}] + "flight_history": [{"recorded_at": "2026-11-07T12:00:00Z", "start_time": "2026-11-03T00:00:00Z", "stop_time": "2026-11-06T00:00:00Z"}] } ], "offerings": [ @@ -764,7 +887,6 @@ "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" ], "timezones": [], - "non_wire_inputs": ["buys[].prior_flights"], "input": { "subscription_id": "analytics-daily", "versions": [ @@ -789,14 +911,7 @@ "start_time": "2026-11-03T00:00:00Z", "end_time": "2026-11-08T00:00:00Z", "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}], - "prior_flights": [ - { - "replaced_at": "2026-11-06T12:00:00Z", - "start_time": "2026-11-03T00:00:00Z", - "end_time": "2026-11-08T00:00:00Z", - "canceled_at": "2026-11-04T12:00:00Z" - } - ] + "flight_history": [{"recorded_at": "2026-11-06T12:00:00Z", "start_time": "2026-11-03T00:00:00Z", "stop_time": "2026-11-04T12:00:00Z"}] } ], "offerings": [ @@ -1442,6 +1557,220 @@ } ] }, + { + "id": "billing-cutover-owes-a-stub", + "name": "billing cutover owes a stub", + "origin": "adcp", + "rule": "adcp#8617: v1 resolves a UTC-day billing offering, v2 (accepted 11-04T12Z, alignment account_timezone) a New York-day one. v1 owes UTC days starting before T, through E = 11-05T00Z. On a billing feed the stretch to the first New York boundary is owed as one stub period [11-05T00Z, 11-05T05Z), flagged stub; New York days follow from 11-05T05Z. Billable time is contiguous.", + "spec_refs": [ + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/cutover", + "static/schemas/source/core/reporting-obligation.json#/properties/stub", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": ["America/New_York"], + "input": { + "subscription_id": "billing-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-11-01T12:00:00Z", + "destination_method": {"pattern": "file_transfer", "transport": "s3"}, + "configuration": { + "subscription_id": "billing-daily", + "subscription_version": 1, + "active": true, + "scope": {"account_ids": ["acct_1"]}, + "selector": { + "feed_purpose": "billing", + "period_duration": "P1D", + "required_finality": "official", + "alignment": "utc", + "dimensions": ["package"] + }, + "reconciliation_mode": "consumer_receipt", + "destination": {"destination_id": "billing-archive"} + } + }, + { + "subscription_version": 2, + "accepted_at": "2026-11-04T12:00:00Z", + "destination_method": {"pattern": "file_transfer", "transport": "s3"}, + "configuration": { + "subscription_id": "billing-daily", + "subscription_version": 2, + "active": true, + "scope": {"account_ids": ["acct_1"]}, + "selector": { + "feed_purpose": "billing", + "period_duration": "P1D", + "required_finality": "official", + "alignment": "account_timezone", + "dimensions": ["package"] + }, + "reconciliation_mode": "consumer_receipt", + "destination": {"destination_id": "billing-archive"} + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-11-02T15:00:00Z", + "start_time": "2026-11-03T00:00:00Z", + "end_time": "2026-11-07T05:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_bill_ny", "off_bill_utc"]}] + } + ], + "offerings": [ + { + "offering_id": "off_bill_ny", + "feed_purpose": "billing", + "report_definition_id": "rd_off_bill_ny", + "report_definition_uri": "https://seller.example/report-definitions/off_bill_ny.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"], + "canonicalization_id": "adcp_jcs_rows_v1", + "canonicalization_contract_version": "1.0", + "canonicalization_media_type": "application/vnd.adcp.reporting-canonicalization+json", + "canonicalization_uri": "https://seller.example/canonicalization/adcp_jcs_rows_v1.json", + "canonicalization_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "schedule": {"period_duration": "P1D", "alignment": "account_timezone", "delivery_sla": "P1D"}, + "supported_finality": ["official"], + "reconciliation_mode": "consumer_receipt", + "standard_dimensions": ["package"], + "method": { + "pattern": "file_transfer", + "transport": "s3", + "orchestration": "producer_managed", + "destination_modes": ["existing"], + "provider": {"domain": "seller.example"}, + "format": "jsonl" + } + }, + { + "offering_id": "off_bill_utc", + "feed_purpose": "billing", + "report_definition_id": "rd_off_bill_utc", + "report_definition_uri": "https://seller.example/report-definitions/off_bill_utc.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"], + "canonicalization_id": "adcp_jcs_rows_v1", + "canonicalization_contract_version": "1.0", + "canonicalization_media_type": "application/vnd.adcp.reporting-canonicalization+json", + "canonicalization_uri": "https://seller.example/canonicalization/adcp_jcs_rows_v1.json", + "canonicalization_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "P1D"}, + "supported_finality": ["official"], + "reconciliation_mode": "consumer_receipt", + "standard_dimensions": ["package"], + "method": { + "pattern": "file_transfer", + "transport": "s3", + "orchestration": "producer_managed", + "destination_modes": ["existing"], + "provider": {"domain": "seller.example"}, + "format": "jsonl" + } + } + ], + "now": "2026-12-01T00:00:00Z" + }, + "expected": [ + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_bill_utc", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_bill_utc", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z" + }, + { + "subscription_version": 2, + "media_buy_id": "mb_1", + "offering_id": "off_bill_ny", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-05T05:00:00Z", + "stub": true + }, + { + "subscription_version": 2, + "media_buy_id": "mb_1", + "offering_id": "off_bill_ny", + "period_start": "2026-11-05T05:00:00Z", + "period_end": "2026-11-06T05:00:00Z" + }, + { + "subscription_version": 2, + "media_buy_id": "mb_1", + "offering_id": "off_bill_ny", + "period_start": "2026-11-06T05:00:00Z", + "period_end": "2026-11-07T05:00:00Z" + } + ], + "expected_obligations": [ + { + "subscription_version": 1, + "offering_id": "off_bill_utc", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_bill_utc", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 2, + "offering_id": "off_bill_ny", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-05T05:00:00Z", + "stub": true, + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 2, + "offering_id": "off_bill_ny", + "period_start": "2026-11-05T05:00:00Z", + "period_end": "2026-11-06T05:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 2, + "offering_id": "off_bill_ny", + "period_start": "2026-11-06T05:00:00Z", + "period_end": "2026-11-07T05:00:00Z", + "media_buy_ids": ["mb_1"] + } + ] + }, { "id": "deactivation", "name": "deactivation", @@ -4121,21 +4450,194 @@ "expected_obligations": [ { "subscription_version": 1, - "offering_id": "off_a_pkg", + "offering_id": "off_a_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-06T00:00:00Z", + "media_buy_ids": ["mb_1"] + } + ] + }, + { + "id": "finality-purpose-and-duration-must-match", + "name": "finality, purpose and duration must match", + "origin": "adcp-client#3505", + "rule": "An offering advertising only snapshot finality, another feed_purpose, or another period_duration is never a candidate.", + "spec_refs": [ + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/selection", + "static/schemas/source/core/reporting-subscription.json#/properties/selector/properties/match", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": [], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-11-01T12:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, + "reconciliation_mode": "delivery_only" + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-11-02T15:00:00Z", + "start_time": "2026-11-03T00:00:00Z", + "end_time": "2026-11-06T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg", "off_b_pkg", "off_c_pkg", "off_d_pkg"]}] + } + ], + "offerings": [ + { + "offering_id": "off_a_pkg", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_a_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_a_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, + "supported_finality": ["snapshot"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + }, + { + "offering_id": "off_b_pkg", + "feed_purpose": "pacing", + "report_definition_id": "rd_off_b_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_b_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + }, + { + "offering_id": "off_c_pkg", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_c_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_c_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "PT1H", "alignment": "utc", "delivery_sla": "PT1H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + }, + { + "offering_id": "off_d_pkg", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_d_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_d_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + } + ], + "now": "2026-12-01T00:00:00Z" + }, + "expected": [ + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_d_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_d_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_d_pkg", + "period_start": "2026-11-05T00:00:00Z", + "period_end": "2026-11-06T00:00:00Z" + } + ], + "expected_obligations": [ + { + "subscription_version": 1, + "offering_id": "off_d_pkg", "period_start": "2026-11-03T00:00:00Z", "period_end": "2026-11-04T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_a_pkg", + "offering_id": "off_d_pkg", "period_start": "2026-11-04T00:00:00Z", "period_end": "2026-11-05T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_a_pkg", + "offering_id": "off_d_pkg", "period_start": "2026-11-05T00:00:00Z", "period_end": "2026-11-06T00:00:00Z", "media_buy_ids": ["mb_1"] @@ -4143,10 +4645,10 @@ ] }, { - "id": "finality-purpose-and-duration-must-match", - "name": "finality, purpose and duration must match", + "id": "a-newly-available-offering-never-re-resolves", + "name": "a newly available offering never re-resolves", "origin": "adcp-client#3505", - "rule": "An offering advertising only snapshot finality, another feed_purpose, or another period_duration is never a candidate.", + "rule": "finest [package]: the (buy, version) pair resolves at the later of accepted_at (11-01T12) and confirmed_at (11-02T15), when only package is available. package x creative becomes available at 11-04T12, but an offering added later never re-resolves the pair, so package owes every period of the flight.", "spec_refs": [ "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/selection", @@ -4165,7 +4667,13 @@ "subscription_version": 1, "active": true, "scope": {"all_authorized_accounts": true}, - "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, + "selector": { + "feed_purpose": "analytics", + "period_duration": "P1D", + "required_finality": "official", + "dimensions": ["package"], + "match": "finest" + }, "reconciliation_mode": "delivery_only" } } @@ -4176,8 +4684,8 @@ "media_buy_id": "mb_1", "confirmed_at": "2026-11-02T15:00:00Z", "start_time": "2026-11-03T00:00:00Z", - "end_time": "2026-11-06T00:00:00Z", - "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg", "off_b_pkg", "off_c_pkg", "off_d_pkg"]}] + "end_time": "2026-11-07T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg", "off_b_pkg_creative"]}] } ], "offerings": [ @@ -4198,57 +4706,15 @@ "primary_keys": ["account_id", "package_id"] }, "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, - "supported_finality": ["snapshot"], - "reconciliation_mode": "delivery_only", - "standard_dimensions": ["package"] - }, - { - "offering_id": "off_b_pkg", - "feed_purpose": "pacing", - "report_definition_id": "rd_off_b_pkg", - "report_definition_uri": "https://seller.example/report-definitions/off_b_pkg.json", - "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "reporting_profile": { - "id": "adcp.delivery.v1", - "version": "1.0.0", - "schema_uri": "https://seller.example/schemas/delivery.json", - "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "schema_dialect": "https://json-schema.org/draft/2020-12/schema", - "schema_ref_policy": "local_fragment_only", - "grain": "daily", - "primary_keys": ["account_id", "package_id"] - }, - "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, - "supported_finality": ["official"], - "reconciliation_mode": "delivery_only", - "standard_dimensions": ["package"] - }, - { - "offering_id": "off_c_pkg", - "feed_purpose": "analytics", - "report_definition_id": "rd_off_c_pkg", - "report_definition_uri": "https://seller.example/report-definitions/off_c_pkg.json", - "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "reporting_profile": { - "id": "adcp.delivery.v1", - "version": "1.0.0", - "schema_uri": "https://seller.example/schemas/delivery.json", - "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "schema_dialect": "https://json-schema.org/draft/2020-12/schema", - "schema_ref_policy": "local_fragment_only", - "grain": "daily", - "primary_keys": ["account_id", "package_id"] - }, - "schedule": {"period_duration": "PT1H", "alignment": "utc", "delivery_sla": "PT1H"}, "supported_finality": ["official"], "reconciliation_mode": "delivery_only", "standard_dimensions": ["package"] }, { - "offering_id": "off_d_pkg", + "offering_id": "off_b_pkg_creative", "feed_purpose": "analytics", - "report_definition_id": "rd_off_d_pkg", - "report_definition_uri": "https://seller.example/report-definitions/off_d_pkg.json", + "report_definition_id": "rd_off_b_pkg_creative", + "report_definition_uri": "https://seller.example/report-definitions/off_b_pkg_creative.json", "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "reporting_profile": { "id": "adcp.delivery.v1", @@ -4263,7 +4729,8 @@ "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, "supported_finality": ["official"], "reconciliation_mode": "delivery_only", - "standard_dimensions": ["package"] + "standard_dimensions": ["package", "creative"], + "available_from": "2026-11-04T12:00:00Z" } ], "now": "2026-12-01T00:00:00Z" @@ -4272,54 +4739,69 @@ { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-03T00:00:00Z", "period_end": "2026-11-04T00:00:00Z" }, { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-04T00:00:00Z", "period_end": "2026-11-05T00:00:00Z" }, { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-05T00:00:00Z", "period_end": "2026-11-06T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-06T00:00:00Z", + "period_end": "2026-11-07T00:00:00Z" } ], "expected_obligations": [ { "subscription_version": 1, - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-03T00:00:00Z", "period_end": "2026-11-04T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-04T00:00:00Z", "period_end": "2026-11-05T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_d_pkg", + "offering_id": "off_a_pkg", "period_start": "2026-11-05T00:00:00Z", "period_end": "2026-11-06T00:00:00Z", "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-06T00:00:00Z", + "period_end": "2026-11-07T00:00:00Z", + "media_buy_ids": ["mb_1"] } - ] + ], + "changed_from_origin": "Re-ruled for 3.3.0-beta.3 (adcp#8619): resolution is fixed per (buy, version) when the pair first resolves, so package x creative becoming available at 11-04T12 no longer changes it. The origin case expected a resolution change at that instant." }, { - "id": "resolution-change-is-a-cutover", - "name": "resolution change is a cutover", - "origin": "adcp-client#3505", - "rule": "finest [package]: package x creative becomes available at 11-04T12, changing the resolution. The old offering owes periods starting before it (11-03, 11-04); the new one owes from E = 11-05.", + "id": "withdrawal-of-the-resolved-offering-is-a-cutover", + "name": "withdrawal of the resolved offering is a cutover", + "origin": "adcp", + "rule": "finest [package]: package x creative is available throughout and wins at resolution. It is withdrawn at 11-04T12, the one resolution change within a version: the package re-resolves to package, and the cutover hands off at E = 11-05. package x creative owes 11-03 and 11-04; package owes from 11-05.", "spec_refs": [ "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/cutover", @@ -4328,7 +4810,6 @@ "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" ], "timezones": [], - "non_wire_inputs": ["offerings[].available_from/withdrawn_at"], "input": { "subscription_id": "analytics-daily", "versions": [ @@ -4403,7 +4884,7 @@ "supported_finality": ["official"], "reconciliation_mode": "delivery_only", "standard_dimensions": ["package", "creative"], - "available_from": "2026-11-04T12:00:00Z" + "withdrawn_at": "2026-11-04T12:00:00Z" } ], "now": "2026-12-01T00:00:00Z" @@ -4412,28 +4893,28 @@ { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_a_pkg", + "offering_id": "off_b_pkg_creative", "period_start": "2026-11-03T00:00:00Z", "period_end": "2026-11-04T00:00:00Z" }, { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_a_pkg", + "offering_id": "off_b_pkg_creative", "period_start": "2026-11-04T00:00:00Z", "period_end": "2026-11-05T00:00:00Z" }, { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_b_pkg_creative", + "offering_id": "off_a_pkg", "period_start": "2026-11-05T00:00:00Z", "period_end": "2026-11-06T00:00:00Z" }, { "subscription_version": 1, "media_buy_id": "mb_1", - "offering_id": "off_b_pkg_creative", + "offering_id": "off_a_pkg", "period_start": "2026-11-06T00:00:00Z", "period_end": "2026-11-07T00:00:00Z" } @@ -4441,28 +4922,28 @@ "expected_obligations": [ { "subscription_version": 1, - "offering_id": "off_a_pkg", + "offering_id": "off_b_pkg_creative", "period_start": "2026-11-03T00:00:00Z", "period_end": "2026-11-04T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_a_pkg", + "offering_id": "off_b_pkg_creative", "period_start": "2026-11-04T00:00:00Z", "period_end": "2026-11-05T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_b_pkg_creative", + "offering_id": "off_a_pkg", "period_start": "2026-11-05T00:00:00Z", "period_end": "2026-11-06T00:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_b_pkg_creative", + "offering_id": "off_a_pkg", "period_start": "2026-11-06T00:00:00Z", "period_end": "2026-11-07T00:00:00Z", "media_buy_ids": ["mb_1"] @@ -9479,34 +9960,173 @@ "media_buy_ids": ["mb_1"] }, { - "subscription_version": 1, + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-06T00:00:00Z", + "period_end": "2026-11-07T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-07T00:00:00Z", + "period_end": "2026-11-08T00:00:00Z", + "media_buy_ids": ["mb_1"] + } + ] + }, + { + "id": "inactive-interval-spanning-a-version-change", + "name": "inactive interval spanning a version change", + "origin": "adcp-client#3505", + "rule": "Deactivated under v1 at 11-04T12, v2 accepted while inactive at 11-05T12, reactivated 11-06T12: v1 owes 11-03 and 11-04, v2 starts fresh at 11-07.", + "spec_refs": [ + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/cutover", + "static/schemas/source/core/reporting-subscription-state.json#/properties/prior_versions", + "static/schemas/source/core/reporting-subscription-state.json#/properties/inactive_intervals", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": [], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-11-01T12:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, + "reconciliation_mode": "delivery_only" + }, + "superseded_at": "2026-11-05T12:00:00Z" + }, + { + "subscription_version": 2, + "accepted_at": "2026-11-05T12:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 2, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, + "reconciliation_mode": "delivery_only", + "exclude_account_ids": ["acct_other"] + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-11-02T15:00:00Z", + "start_time": "2026-11-03T00:00:00Z", + "end_time": "2026-11-09T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}] + } + ], + "offerings": [ + { + "offering_id": "off_a_pkg", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_a_pkg", + "report_definition_uri": "https://seller.example/report-definitions/off_a_pkg.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "utc", "delivery_sla": "PT6H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + } + ], + "now": "2026-12-01T00:00:00Z", + "inactive_intervals": [{"deactivated_at": "2026-11-04T12:00:00Z", "reactivated_at": "2026-11-06T12:00:00Z"}] + }, + "expected": [ + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z" + }, + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z" + }, + { + "subscription_version": 2, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-07T00:00:00Z", + "period_end": "2026-11-08T00:00:00Z" + }, + { + "subscription_version": 2, + "media_buy_id": "mb_1", + "offering_id": "off_a_pkg", + "period_start": "2026-11-08T00:00:00Z", + "period_end": "2026-11-09T00:00:00Z" + } + ], + "expected_obligations": [ + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-03T00:00:00Z", + "period_end": "2026-11-04T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_a_pkg", + "period_start": "2026-11-04T00:00:00Z", + "period_end": "2026-11-05T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 2, "offering_id": "off_a_pkg", - "period_start": "2026-11-06T00:00:00Z", - "period_end": "2026-11-07T00:00:00Z", + "period_start": "2026-11-07T00:00:00Z", + "period_end": "2026-11-08T00:00:00Z", "media_buy_ids": ["mb_1"] }, { - "subscription_version": 1, + "subscription_version": 2, "offering_id": "off_a_pkg", - "period_start": "2026-11-07T00:00:00Z", - "period_end": "2026-11-08T00:00:00Z", + "period_start": "2026-11-08T00:00:00Z", + "period_end": "2026-11-09T00:00:00Z", "media_buy_ids": ["mb_1"] } ] }, { - "id": "inactive-interval-spanning-a-version-change", - "name": "inactive interval spanning a version change", - "origin": "adcp-client#3505", - "rule": "Deactivated under v1 at 11-04T12, v2 accepted while inactive at 11-05T12, reactivated 11-06T12: v1 owes 11-03 and 11-04, v2 starts fresh at 11-07.", + "id": "reactivation-after-a-schedule-change-never-owes-twice", + "name": "reactivation after a schedule change never owes twice", + "origin": "adcp", + "rule": "3.3.0-beta.3: v1 resolves a UTC day offering and is deactivated at 11-04T12Z, so its 11-04T00Z day stays owed through 11-05T00Z. While inactive, v2 is accepted at 11-04T13Z with alignment account_timezone in Tokyo (midnight 15:00Z), and the subscription is reactivated at 11-04T14Z. Coverage resumes at the first boundary at or after the later of the reactivation instant and the end of the last period owed before deactivation (11-05T00Z): 11-05T15Z. The fresh start alone would have owed the Tokyo day from 11-04T15Z, overlapping the owed UTC day.", "spec_refs": [ "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/cutover", - "static/schemas/source/core/reporting-subscription-state.json#/properties/prior_versions", "static/schemas/source/core/reporting-subscription-state.json#/properties/inactive_intervals", "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" ], - "timezones": [], + "timezones": ["Asia/Tokyo"], "input": { "subscription_id": "analytics-daily", "versions": [ @@ -9521,30 +10141,35 @@ "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, "reconciliation_mode": "delivery_only" }, - "superseded_at": "2026-11-05T12:00:00Z" + "superseded_at": "2026-11-04T13:00:00Z" }, { "subscription_version": 2, - "accepted_at": "2026-11-05T12:00:00Z", + "accepted_at": "2026-11-04T13:00:00Z", "configuration": { "subscription_id": "analytics-daily", "subscription_version": 2, "active": true, "scope": {"all_authorized_accounts": true}, - "selector": {"feed_purpose": "analytics", "period_duration": "P1D", "required_finality": "official", "dimensions": ["package"]}, - "reconciliation_mode": "delivery_only", - "exclude_account_ids": ["acct_other"] + "selector": { + "feed_purpose": "analytics", + "period_duration": "P1D", + "required_finality": "official", + "dimensions": ["package"], + "alignment": "account_timezone" + }, + "reconciliation_mode": "delivery_only" } } ], - "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "account": {"account_id": "acct_1", "timezone": "Asia/Tokyo", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, "buys": [ { "media_buy_id": "mb_1", "confirmed_at": "2026-11-02T15:00:00Z", "start_time": "2026-11-03T00:00:00Z", - "end_time": "2026-11-09T00:00:00Z", - "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}] + "end_time": "2026-11-07T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg", "off_e_pkg_acct_tz"]}] } ], "offerings": [ @@ -9568,10 +10193,31 @@ "supported_finality": ["official"], "reconciliation_mode": "delivery_only", "standard_dimensions": ["package"] + }, + { + "offering_id": "off_e_pkg_acct_tz", + "feed_purpose": "analytics", + "report_definition_id": "rd_off_e_pkg_acct_tz", + "report_definition_uri": "https://seller.example/report-definitions/off_e_pkg_acct_tz.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "P1D", "alignment": "account_timezone", "delivery_sla": "PT6H"}, + "supported_finality": ["official"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] } ], "now": "2026-12-01T00:00:00Z", - "inactive_intervals": [{"deactivated_at": "2026-11-04T12:00:00Z", "reactivated_at": "2026-11-06T12:00:00Z"}] + "inactive_intervals": [{"deactivated_at": "2026-11-04T12:00:00Z", "reactivated_at": "2026-11-04T14:00:00Z"}] }, "expected": [ { @@ -9591,16 +10237,16 @@ { "subscription_version": 2, "media_buy_id": "mb_1", - "offering_id": "off_a_pkg", - "period_start": "2026-11-07T00:00:00Z", - "period_end": "2026-11-08T00:00:00Z" + "offering_id": "off_e_pkg_acct_tz", + "period_start": "2026-11-05T15:00:00Z", + "period_end": "2026-11-06T15:00:00Z" }, { "subscription_version": 2, "media_buy_id": "mb_1", - "offering_id": "off_a_pkg", - "period_start": "2026-11-08T00:00:00Z", - "period_end": "2026-11-09T00:00:00Z" + "offering_id": "off_e_pkg_acct_tz", + "period_start": "2026-11-06T15:00:00Z", + "period_end": "2026-11-07T15:00:00Z" } ], "expected_obligations": [ @@ -9620,16 +10266,16 @@ }, { "subscription_version": 2, - "offering_id": "off_a_pkg", - "period_start": "2026-11-07T00:00:00Z", - "period_end": "2026-11-08T00:00:00Z", + "offering_id": "off_e_pkg_acct_tz", + "period_start": "2026-11-05T15:00:00Z", + "period_end": "2026-11-06T15:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 2, - "offering_id": "off_a_pkg", - "period_start": "2026-11-08T00:00:00Z", - "period_end": "2026-11-09T00:00:00Z", + "offering_id": "off_e_pkg_acct_tz", + "period_start": "2026-11-06T15:00:00Z", + "period_end": "2026-11-07T15:00:00Z", "media_buy_ids": ["mb_1"] } ] @@ -10890,114 +11536,372 @@ }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T12:00:00Z", - "period_end": "2026-03-08T13:00:00Z", - "media_buy_ids": ["mb_1"] + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T12:00:00Z", + "period_end": "2026-03-08T13:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T13:00:00Z", + "period_end": "2026-03-08T14:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T14:00:00Z", + "period_end": "2026-03-08T15:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T15:00:00Z", + "period_end": "2026-03-08T16:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T16:00:00Z", + "period_end": "2026-03-08T17:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T17:00:00Z", + "period_end": "2026-03-08T18:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T18:00:00Z", + "period_end": "2026-03-08T19:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T19:00:00Z", + "period_end": "2026-03-08T20:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T20:00:00Z", + "period_end": "2026-03-08T21:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T21:00:00Z", + "period_end": "2026-03-08T22:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T22:00:00Z", + "period_end": "2026-03-08T23:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-08T23:00:00Z", + "period_end": "2026-03-09T00:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-09T00:00:00Z", + "period_end": "2026-03-09T01:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-09T01:00:00Z", + "period_end": "2026-03-09T02:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-09T02:00:00Z", + "period_end": "2026-03-09T03:00:00Z", + "media_buy_ids": ["mb_1"] + }, + { + "subscription_version": 1, + "offering_id": "off_p_hourly_local", + "period_start": "2026-03-09T03:00:00Z", + "period_end": "2026-03-09T04:00:00Z", + "media_buy_ids": ["mb_1"] + } + ] + }, + { + "id": "havana-pt24h-equals-p1d-when-midnight-does-not-exist", + "name": "havana PT24H equals P1D when midnight does not exist", + "origin": "adcp", + "rule": "Each local date's day start, its first instant, is always a boundary of a sub-daily local schedule (3.3.0-beta.3). Havana springs forward at 00:00 on 2026-03-08, so March 8 starts at 01:00 CDT (05:00Z). PT24H has its boundary there, exactly like P1D: March 7 is 24 hours and March 8 is 23. Under the earlier reading the nonexistent midnight yielded no boundary and PT24H had a 47-hour period.", + "spec_refs": [ + "static/schemas/source/core/reporting-schedule.json#/x-adcp-validation/period_generation", + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": ["America/Havana"], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-03-01T00:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": { + "feed_purpose": "pacing", + "period_duration": "PT24H", + "required_finality": "snapshot", + "dimensions": ["package"], + "alignment": "account_timezone" + }, + "reconciliation_mode": "delivery_only" + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/Havana", "grants": [{"authorized_at": "2026-02-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-03-01T00:00:00Z", + "start_time": "2026-03-07T05:00:00Z", + "end_time": "2026-03-10T04:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_h24_acct_tz"]}] + } + ], + "offerings": [ + { + "offering_id": "off_h24_acct_tz", + "feed_purpose": "pacing", + "report_definition_id": "rd_off_h24_acct_tz", + "report_definition_uri": "https://seller.example/report-definitions/off_h24_acct_tz.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "PT24H", "alignment": "account_timezone", "delivery_sla": "PT1H"}, + "supported_finality": ["snapshot"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + } + ], + "now": "2026-04-01T00:00:00Z" + }, + "expected": [ + { + "subscription_version": 1, + "media_buy_id": "mb_1", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-07T05:00:00Z", + "period_end": "2026-03-08T05:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T13:00:00Z", - "period_end": "2026-03-08T14:00:00Z", - "media_buy_ids": ["mb_1"] + "media_buy_id": "mb_1", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-08T05:00:00Z", + "period_end": "2026-03-09T04:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T14:00:00Z", - "period_end": "2026-03-08T15:00:00Z", - "media_buy_ids": ["mb_1"] - }, + "media_buy_id": "mb_1", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-09T04:00:00Z", + "period_end": "2026-03-10T04:00:00Z" + } + ], + "expected_obligations": [ { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T15:00:00Z", - "period_end": "2026-03-08T16:00:00Z", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-07T05:00:00Z", + "period_end": "2026-03-08T05:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T16:00:00Z", - "period_end": "2026-03-08T17:00:00Z", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-08T05:00:00Z", + "period_end": "2026-03-09T04:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T17:00:00Z", - "period_end": "2026-03-08T18:00:00Z", + "offering_id": "off_h24_acct_tz", + "period_start": "2026-03-09T04:00:00Z", + "period_end": "2026-03-10T04:00:00Z", "media_buy_ids": ["mb_1"] - }, + } + ] + }, + { + "id": "havana-pt2h-nests-in-the-day", + "name": "havana PT2H nests in the day", + "origin": "adcp", + "rule": "The day start is a boundary of every sub-daily local schedule, so local days nest in two-hour periods even when midnight does not exist. On 2026-03-08 in Havana, 00:00 does not exist and the day starts at 01:00 CDT (05:00Z): the PT2H periods are 05:00Z-06:00Z (one hour, from the day start to 02:00 CDT) and then two-hour periods from 06:00Z. March 7 ends at 05:00Z with 22:00-24:00 CST (03:00Z-05:00Z).", + "spec_refs": [ + "static/schemas/source/core/reporting-schedule.json#/x-adcp-validation/period_generation", + "static/schemas/source/core/reporting-subscription.json#/x-adcp-validation/coverage", + "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" + ], + "timezones": ["America/Havana"], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-03-01T00:00:00Z", + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"all_authorized_accounts": true}, + "selector": { + "feed_purpose": "pacing", + "period_duration": "PT2H", + "required_finality": "snapshot", + "dimensions": ["package"], + "alignment": "account_timezone" + }, + "reconciliation_mode": "delivery_only" + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/Havana", "grants": [{"authorized_at": "2026-02-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-03-01T00:00:00Z", + "start_time": "2026-03-08T03:00:00Z", + "end_time": "2026-03-08T12:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_p2_local"]}] + } + ], + "offerings": [ + { + "offering_id": "off_p2_local", + "feed_purpose": "pacing", + "report_definition_id": "rd_off_p2_local", + "report_definition_uri": "https://seller.example/report-definitions/off_p2_local.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"] + }, + "schedule": {"period_duration": "PT2H", "alignment": "account_timezone", "delivery_sla": "PT1H"}, + "supported_finality": ["snapshot"], + "reconciliation_mode": "delivery_only", + "standard_dimensions": ["package"] + } + ], + "now": "2026-04-01T00:00:00Z" + }, + "expected": [ { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T18:00:00Z", - "period_end": "2026-03-08T19:00:00Z", - "media_buy_ids": ["mb_1"] + "media_buy_id": "mb_1", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T03:00:00Z", + "period_end": "2026-03-08T05:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T19:00:00Z", - "period_end": "2026-03-08T20:00:00Z", - "media_buy_ids": ["mb_1"] + "media_buy_id": "mb_1", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T05:00:00Z", + "period_end": "2026-03-08T06:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T20:00:00Z", - "period_end": "2026-03-08T21:00:00Z", - "media_buy_ids": ["mb_1"] + "media_buy_id": "mb_1", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T06:00:00Z", + "period_end": "2026-03-08T08:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T21:00:00Z", - "period_end": "2026-03-08T22:00:00Z", - "media_buy_ids": ["mb_1"] + "media_buy_id": "mb_1", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T08:00:00Z", + "period_end": "2026-03-08T10:00:00Z" }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T22:00:00Z", - "period_end": "2026-03-08T23:00:00Z", - "media_buy_ids": ["mb_1"] - }, + "media_buy_id": "mb_1", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T10:00:00Z", + "period_end": "2026-03-08T12:00:00Z" + } + ], + "expected_obligations": [ { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-08T23:00:00Z", - "period_end": "2026-03-09T00:00:00Z", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T03:00:00Z", + "period_end": "2026-03-08T05:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-09T00:00:00Z", - "period_end": "2026-03-09T01:00:00Z", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T05:00:00Z", + "period_end": "2026-03-08T06:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-09T01:00:00Z", - "period_end": "2026-03-09T02:00:00Z", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T06:00:00Z", + "period_end": "2026-03-08T08:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-09T02:00:00Z", - "period_end": "2026-03-09T03:00:00Z", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T08:00:00Z", + "period_end": "2026-03-08T10:00:00Z", "media_buy_ids": ["mb_1"] }, { "subscription_version": 1, - "offering_id": "off_p_hourly_local", - "period_start": "2026-03-09T03:00:00Z", - "period_end": "2026-03-09T04:00:00Z", + "offering_id": "off_p2_local", + "period_start": "2026-03-08T10:00:00Z", + "period_end": "2026-03-08T12:00:00Z", "media_buy_ids": ["mb_1"] } ] @@ -13802,6 +14706,88 @@ }, "expected_error": {"code": "COVERAGE_INPUT_INVALID", "detail": "invalid_period_duration", "wire_valid": true} }, + { + "id": "sub-daily-billing-cycle-is-refused", + "name": "sub-daily billing cycle is refused", + "origin": "adcp", + "rule": "period_generation (3.3.0-beta.3): billing_cycle alignment requires a period_duration with a date component. A sub-daily duration restarts at each local midnight, so the anchor would have no effect; PT1H under billing_cycle is refused, and the reporting-schedule schema rejects it.", + "spec_refs": ["static/schemas/source/core/reporting-schedule.json#/x-adcp-validation/period_generation"], + "timezones": [], + "input": { + "subscription_id": "analytics-daily", + "versions": [ + { + "subscription_version": 1, + "accepted_at": "2026-10-15T00:00:00Z", + "destination_method": {"pattern": "file_transfer", "transport": "s3"}, + "configuration": { + "subscription_id": "analytics-daily", + "subscription_version": 1, + "active": true, + "scope": {"account_ids": ["acct_1"]}, + "selector": {"feed_purpose": "billing", "period_duration": "PT1H", "required_finality": "official", "dimensions": ["package"]}, + "reconciliation_mode": "consumer_receipt", + "destination": {"destination_id": "billing-archive"} + } + } + ], + "account": {"account_id": "acct_1", "timezone": "America/New_York", "grants": [{"authorized_at": "2026-10-01T00:00:00Z"}]}, + "buys": [ + { + "media_buy_id": "mb_1", + "confirmed_at": "2026-10-20T00:00:00Z", + "start_time": "2026-11-10T00:00:00Z", + "end_time": "2027-01-15T00:00:00Z", + "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_m_billing_monthly"]}] + } + ], + "offerings": [ + { + "offering_id": "off_m_billing_monthly", + "feed_purpose": "billing", + "report_definition_id": "rd_off_m_billing_monthly", + "report_definition_uri": "https://seller.example/report-definitions/off_m_billing_monthly.json", + "report_definition_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "reporting_profile": { + "id": "adcp.delivery.v1", + "version": "1.0.0", + "schema_uri": "https://seller.example/schemas/delivery.json", + "schema_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "schema_dialect": "https://json-schema.org/draft/2020-12/schema", + "schema_ref_policy": "local_fragment_only", + "grain": "daily", + "primary_keys": ["account_id", "package_id"], + "canonicalization_id": "adcp_jcs_rows_v1", + "canonicalization_contract_version": "1.0", + "canonicalization_media_type": "application/vnd.adcp.reporting-canonicalization+json", + "canonicalization_uri": "https://seller.example/canonicalization/adcp_jcs_rows_v1.json", + "canonicalization_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "schedule": { + "period_duration": "PT1H", + "alignment": "billing_cycle", + "delivery_sla": "P5D", + "period_anchor_policy": "fixed", + "period_anchor": "2026-01-01T05:00:00Z", + "period_timezone": "America/New_York" + }, + "supported_finality": ["official"], + "reconciliation_mode": "consumer_receipt", + "standard_dimensions": ["package"], + "method": { + "pattern": "file_transfer", + "transport": "s3", + "orchestration": "producer_managed", + "destination_modes": ["existing"], + "provider": {"domain": "seller.example"}, + "format": "jsonl" + } + } + ], + "now": "2027-03-01T00:00:00Z" + }, + "expected_error": {"code": "COVERAGE_INPUT_INVALID", "detail": "invalid_period_duration", "wire_valid": false} + }, { "id": "fractional-seconds-and-offsets", "name": "Fractional seconds and non-Z offsets are instants", @@ -14195,7 +15181,6 @@ "docs/media-buy/task-reference/get_reporting_status.mdx#which-periods-are-owed" ], "timezones": [], - "non_wire_inputs": ["buys[].prior_flights"], "input": { "subscription_id": "analytics-daily", "versions": [ @@ -14220,7 +15205,7 @@ "start_time": "2026-11-03T00:00:00Z", "end_time": "2026-11-07T00:00:00Z", "packages": [{"package_id": "pkg_1", "reporting_delivery_offering_ids": ["off_a_pkg"]}], - "prior_flights": [{"replaced_at": "2026-11-04T12:00:00Z", "start_time": "2026-11-03T00:00:00Z", "end_time": "2026-11-03T00:00:00Z"}] + "flight_history": [{"recorded_at": "2026-11-04T12:00:00Z", "start_time": "2026-11-03T00:00:00Z", "stop_time": "2026-11-03T00:00:00Z"}] } ], "offerings": [ diff --git a/test/fixtures/reporting-subscriptions/ledger-option-off-golden.json b/test/fixtures/reporting-subscriptions/ledger-option-off-golden.json index f0867e9b6..32736844e 100644 --- a/test/fixtures/reporting-subscriptions/ledger-option-off-golden.json +++ b/test/fixtures/reporting-subscriptions/ledger-option-off-golden.json @@ -465,7 +465,7 @@ ], "summary": { "status": "completed", - "adcp_version": "3.3-beta.2", + "adcp_version": "3.3-beta.3", "adcp_major_version": 3, "view": "summary", "ledger_snapshot_id": "snapshot-0", @@ -518,7 +518,7 @@ }, "periods": { "status": "completed", - "adcp_version": "3.3-beta.2", + "adcp_version": "3.3-beta.3", "adcp_major_version": 3, "view": "periods", "ledger_snapshot_id": "snapshot-1", @@ -941,7 +941,7 @@ } }, "consumerStatus": { - "adcp_version": "3.3-beta.2", + "adcp_version": "3.3-beta.3", "adcp_major_version": 3, "status": "completed", "results": [ diff --git a/test/fixtures/request-signing-a2a/README.md b/test/fixtures/request-signing-a2a/README.md index 1933c767a..9fbba9975 100644 --- a/test/fixtures/request-signing-a2a/README.md +++ b/test/fixtures/request-signing-a2a/README.md @@ -1,8 +1,8 @@ # A2A operation-resolution vectors (vendored) -Copied verbatim from the signed AdCP `3.3.0-beta.2` protocol bundle's +Copied verbatim from the signed AdCP `3.3.0-beta.3` protocol bundle's `compliance/test-vectors/request-signing/a2a/` corpus. Bundle SHA-256: -`d75dc90192a2d13ffae2103f30bd505040a7ff0a40f8a7946d82730428dd6e8a`. +`ba61919ca0c9d67874604fbbca8945c133eaceed65da1ac962f78d94d7879f00`. These 33 vectors originated in the security erratum for GHSA-2pm6-6mc8-8xcm / adcp#7820 (adcp#7945). diff --git a/test/lib/adcp33-beta-adoption.test.js b/test/lib/adcp33-beta-adoption.test.js index 7930a51a3..7189f8f64 100644 --- a/test/lib/adcp33-beta-adoption.test.js +++ b/test/lib/adcp33-beta-adoption.test.js @@ -3,6 +3,10 @@ const assert = require('node:assert/strict'); const { Client } = require('@modelcontextprotocol/sdk/client/index.js'); const { InMemoryTransport } = require('@modelcontextprotocol/sdk/inMemory.js'); const { AgentClient, ADCP_VERSION } = require('../../dist/lib/index.js'); +const { toReleasePrecisionVersion } = require('../../dist/lib/version.js'); + +// The 3.3 preview the SDK advertises, at release precision ('3.3-beta.3'). +const WIRE = toReleasePrecisionVersion(ADCP_VERSION); const { createAdcpServer } = require('../../dist/lib/server/create-adcp-server.js'); const { InMemoryStateStore } = require('../../dist/lib/server/state-store.js'); const { convertRequest, releaseDefinesTool } = require('../../dist/lib/adapters/version/index.js'); @@ -61,9 +65,9 @@ test('the official MCP client reaches both 3.3 discovery tools without provision assert.ok(!stableCapabilities.structuredContent.media_buy?.lifecycle_tools?.includes('list_proposals')); const betaCapabilities = await seller.dispatchTestRequest({ method: 'tools/call', - params: { name: 'get_adcp_capabilities', arguments: { adcp_version: '3.3-beta.2' } }, + params: { name: 'get_adcp_capabilities', arguments: { adcp_version: WIRE } }, }); - assert.ok(betaCapabilities.structuredContent.adcp.supported_versions.includes('3.3-beta.2')); + assert.ok(betaCapabilities.structuredContent.adcp.supported_versions.includes(WIRE)); assert.ok(betaCapabilities.structuredContent.adcp.supported_versions.includes('3.2')); for (const feature of [ 'media_buy.collection_catalog', @@ -213,18 +217,18 @@ test('a preview buyer discovers a stable seller without sending an unsupported p assert.equal(requests[0].adcp_version, '3.2'); }); -test('a buyer pinned to the 3.3.0-beta.2 bundle negotiates 3.3-beta.2 and sends typed request_account changes', async t => { +test('a buyer pinned to the 3.3 beta bundle negotiates its preview and sends typed request_account changes', async t => { const { McpServer } = require('@modelcontextprotocol/sdk/server/mcp.js'); const { z } = require('zod'); - assert.equal(ADCP_VERSION, '3.3.0-beta.2'); + assert.equal(ADCP_VERSION, '3.3.0-beta.3'); const requests = []; - const seller = new McpServer({ name: 'AdCP 3.3 beta.2 seller', version: '1.0.0' }); + const seller = new McpServer({ name: 'AdCP 3.3 beta seller', version: '1.0.0' }); seller.registerTool('get_adcp_capabilities', { inputSchema: { adcp_version: z.string().optional() } }, async () => ({ content: [], structuredContent: { status: 'completed', - adcp_version: '3.3-beta.2', - adcp: { major_versions: [3], supported_versions: ['3.2', '3.3-beta.2'], idempotency: { supported: false } }, + adcp_version: WIRE, + adcp: { major_versions: [3], supported_versions: ['3.2', WIRE], idempotency: { supported: false } }, supported_protocols: ['media_buy'], experimental_features: ['account.requests'], account: { supported_billing: ['operator'] }, @@ -248,7 +252,7 @@ test('a buyer pinned to the 3.3.0-beta.2 bundle negotiates 3.3-beta.2 and sends content: [], structuredContent: { status: 'completed', - adcp_version: '3.3-beta.2', + adcp_version: WIRE, request: { request_id: 'areq_change_1', state: 'in_review', @@ -262,7 +266,7 @@ test('a buyer pinned to the 3.3.0-beta.2 bundle negotiates 3.3-beta.2 and sends } ); const [buyerTransport, sellerTransport] = InMemoryTransport.createLinkedPair(); - const mcp = new Client({ name: 'SDK 17 beta.2 buyer', version: '1.0.0' }); + const mcp = new Client({ name: 'SDK 17 beta buyer', version: '1.0.0' }); await seller.connect(sellerTransport); await mcp.connect(buyerTransport); t.after(async () => { @@ -274,16 +278,16 @@ test('a buyer pinned to the 3.3.0-beta.2 bundle negotiates 3.3-beta.2 and sends assert.equal(result.success, true, result.error); assert.equal(result.data.request.state, 'in_review'); assert.equal(requests.length, 1); - assert.equal(requests[0].adcp_version, '3.3-beta.2'); + assert.equal(requests[0].adcp_version, WIRE); assert.match(requests[0].idempotency_key, /^[A-Za-z0-9_.:-]{16,255}$/); assert.equal(requests[0].account_id, 'acct_renault_fr'); }); -test('createAdcpServer serves raw request_account and media-buy issue handlers on the 3.3-beta.2 route', async t => { +test('createAdcpServer serves raw request_account and media-buy issue handlers on the 3.3 beta route', async t => { const received = []; const seller = createAdcpServer({ stateStore: new InMemoryStateStore(), - name: 'AdCP 3.3 beta.2 account requests', + name: 'AdCP 3.3 beta account requests', version: '1.0.0', adcpVersion: ADCP_VERSION, validation: { requests: 'strict', responses: 'strict' }, @@ -298,6 +302,8 @@ test('createAdcpServer serves raw request_account and media-buy issue handlers o account_id: params.account_id, resolution: 'updated', requested: { account_id: params.account_id, payment_terms: params.payment_terms }, + // adcp#8620: a money change says when it takes effect. + effective_at: '2026-11-01T00:00:00Z', created_at: '2026-10-29T00:00:00Z', updated_at: '2026-10-29T00:00:00Z', }, @@ -308,7 +314,7 @@ test('createAdcpServer serves raw request_account and media-buy issue handlers o t.after(() => seller.close()); const listed = await seller.dispatchTestRequest({ method: 'tools/list', - params: { _meta: { adcp_version: '3.3-beta.2' } }, + params: { _meta: { adcp_version: WIRE } }, }); assert.ok(listed.tools.some(tool => tool.name === 'request_account')); const stable = await seller.dispatchTestRequest({ method: 'tools/list', params: { _meta: { adcp_version: '3.2' } } }); @@ -319,7 +325,7 @@ test('createAdcpServer serves raw request_account and media-buy issue handlers o params: { name: 'request_account', arguments: { - adcp_version: '3.3-beta.2', + adcp_version: WIRE, idempotency_key: 'request-account-change-0001', account_id: 'acct_1', revision: 2, @@ -331,15 +337,16 @@ test('createAdcpServer serves raw request_account and media-buy issue handlers o ); assert.equal(response.isError, undefined, JSON.stringify(response)); assert.equal(response.structuredContent.request.resolution, 'updated'); + assert.equal(response.structuredContent.request.effective_at, '2026-11-01T00:00:00Z'); assert.equal(received.length, 1); assert.equal(received[0].account_id, 'acct_1'); }); -test('beta.2: a change request may opt in to a separate account and resolve as created', async t => { +test('a change request may opt in to a separate account and resolve as created', async t => { const received = []; const seller = createAdcpServer({ stateStore: new InMemoryStateStore(), - name: 'AdCP 3.3 beta.2 separate account', + name: 'AdCP 3.3 beta separate account', version: '1.0.0', adcpVersion: ADCP_VERSION, validation: { requests: 'strict', responses: 'strict' }, @@ -355,6 +362,15 @@ test('beta.2: a change request may opt in to a separate account and resolve as c account_id: 'acct_2', resolution: 'created', requested: { account_id: params.account_id, payment_terms: params.payment_terms }, + // adcp#8620: a created account carries its money terms, and a change request that + // created a separate account names what did not carry over. + account: { + account_id: 'acct_2', + name: 'Acme (separate terms)', + status: 'active', + payment_terms: 'net_30', + }, + not_carried_over: ['reporting_delivery_configs'], created_at: '2026-10-30T00:00:00Z', updated_at: '2026-10-30T00:00:00Z', }, @@ -369,7 +385,7 @@ test('beta.2: a change request may opt in to a separate account and resolve as c params: { name: 'request_account', arguments: { - adcp_version: '3.3-beta.2', + adcp_version: WIRE, idempotency_key: 'request-account-change-0002', account_id: 'acct_1', revision: 2, @@ -383,16 +399,18 @@ test('beta.2: a change request may opt in to a separate account and resolve as c assert.equal(response.isError, undefined, JSON.stringify(response)); assert.equal(response.structuredContent.request.resolution, 'created'); assert.equal(response.structuredContent.request.account_id, 'acct_2'); + assert.equal(response.structuredContent.request.account.payment_terms, 'net_30'); + assert.deepEqual(response.structuredContent.request.not_carried_over, ['reporting_delivery_configs']); assert.equal(received[0].allow_separate_account, true); }); -test('beta.2: ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT is a correctable standard error code', () => { +test('ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT is a correctable standard error code', () => { const { STANDARD_ERROR_CODES } = require('../../dist/lib/index.js'); assert.equal(STANDARD_ERROR_CODES.ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT.recovery, 'correctable'); assert.equal(STANDARD_ERROR_CODES.REFERENCE_DEFINITION_CHANGED, undefined, 'withdrawn by adcp#8537'); }); -test('beta.2: a seller still on 3.3-beta.1 negotiates a stable release, not the preview', () => { +test('a seller still on an earlier 3.3 beta negotiates a stable release, not the preview', () => { const { negotiateAdcpRelease } = require('../../dist/lib/adapters/version/index.js'); const caps = supportedVersions => ({ version: 'v3', @@ -402,8 +420,10 @@ test('beta.2: a seller still on 3.3-beta.1 negotiates a stable release, not the features: {}, extensions: [], }); - assert.equal(negotiateAdcpRelease(ADCP_VERSION, caps(['3.2', '3.3-beta.2'])).version, ADCP_VERSION); - const older = negotiateAdcpRelease(ADCP_VERSION, caps(['3.2', '3.3-beta.1'])); - assert.equal(older.version, '3.2'); - assert.equal(older.downgraded, true); + assert.equal(negotiateAdcpRelease(ADCP_VERSION, caps(['3.2', WIRE])).version, ADCP_VERSION); + for (const earlier of ['3.3-beta.1', '3.3-beta.2']) { + const older = negotiateAdcpRelease(ADCP_VERSION, caps(['3.2', earlier])); + assert.equal(older.version, '3.2', earlier); + assert.equal(older.downgraded, true, earlier); + } }); diff --git a/test/lib/beta9-account-change-docs.test.js b/test/lib/beta9-account-change-docs.test.js index b53a2f84b..323640d7b 100644 --- a/test/lib/beta9-account-change-docs.test.js +++ b/test/lib/beta9-account-change-docs.test.js @@ -25,7 +25,10 @@ test('generated success-branch docs omit fields forbidden by the selected union /^\s+(reason|suggestions|purchase_continuation|task_id):/m ); assert.doesNotMatch(toolSection(docs, 'refine_proposals'), /^\s+task_id:/m); - assert.doesNotMatch(toolSection(docs, 'decline_proposals'), /^\s+(status|task_id):/m); + // AdCP 3.3.0-beta.3 composes the protocol envelope into decline_proposals, so the completed arm carries + // status: 'completed'; it still forbids task_id. + assert.doesNotMatch(toolSection(docs, 'decline_proposals'), /^\s+task_id:/m); + assert.match(toolSection(docs, 'decline_proposals'), /^\s+status: 'completed'/m); }); test('generated request docs resolve JSON Pointer field references', () => { diff --git a/test/lib/canonical-compliance-storyboard-fixtures.test.js b/test/lib/canonical-compliance-storyboard-fixtures.test.js index ad243ffd3..44a3f7723 100644 --- a/test/lib/canonical-compliance-storyboard-fixtures.test.js +++ b/test/lib/canonical-compliance-storyboard-fixtures.test.js @@ -69,9 +69,9 @@ function assertCanonicalPackagedFixture({ ADCP_VERSION, 'canonical fixture provenance must select the primary compliance cache shipped with this SDK' ); - assert.equal(fixtureSetProvenance.protocol_version, '3.3.0-beta.2'); - assert.equal(fixtureSetProvenance.source_commit, 'fa39ca874b10ab7cf17d5cfa52abdce58b2dd274'); - assert.equal(fixtureSetProvenance.bundle_sha256, 'd75dc90192a2d13ffae2103f30bd505040a7ff0a40f8a7946d82730428dd6e8a'); + assert.equal(fixtureSetProvenance.protocol_version, '3.3.0-beta.3'); + assert.equal(fixtureSetProvenance.source_commit, 'a6106149a2b5c929eec0caa0042adbae4ccf3a9c'); + assert.equal(fixtureSetProvenance.bundle_sha256, 'ba61919ca0c9d67874604fbbca8945c133eaceed65da1ac962f78d94d7879f00'); } test('packaged consumers receive the exact canonical universal/principal storyboard', () => { diff --git a/test/lib/client-core-public-export.test.js b/test/lib/client-core-public-export.test.js index 585655a58..1888612bc 100644 --- a/test/lib/client-core-public-export.test.js +++ b/test/lib/client-core-public-export.test.js @@ -63,7 +63,15 @@ function runColdProbe(moduleFormat) { const { unwrapProtocolResponse } = ${load(`./dist/lib/utils/response-unwrapper.${isEsm ? 'mjs' : 'js'}`)}; const unwrapped = unwrapProtocolResponse( - { structuredContent: { outcome: 'listed', products: [], feed_version: 'feed-v1', cache_scope: 'public' } }, + { + structuredContent: { + status: 'completed', + outcome: 'listed', + products: [], + feed_version: 'feed-v1', + cache_scope: 'public', + }, + }, 'list_products', 'mcp' ); diff --git a/test/lib/conformance-oracle.test.js b/test/lib/conformance-oracle.test.js index 4dba70443..d81ca16d6 100644 --- a/test/lib/conformance-oracle.test.js +++ b/test/lib/conformance-oracle.test.js @@ -46,15 +46,19 @@ describe('conformance: oracle', () => { }); test('synchronous decline_proposals validates without injecting task status', () => { - const payload = { results: [{ proposal_id: 'proposal-1', outcome: 'declined' }] }; + // AdCP 3.3.0-beta.3 composes the protocol envelope into every response (adcp#8547): status is required. + const payload = { status: 'completed', results: [{ proposal_id: 'proposal-1', outcome: 'declined' }] }; const before = structuredClone(payload); const out = accepted('decline_proposals', payload); assert.equal(out.verdict, 'accepted', out.invariantFailures.join('; ')); assert.deepEqual(payload, before); + const { status: _status, ...withoutStatus } = payload; + assert.equal(accepted('decline_proposals', withoutStatus).verdict, 'invalid', 'a missing status is not filled in'); }); test('closed response schemas admit canonical version metadata from SDK sellers', () => { const payload = { + status: 'completed', adcp_version: '3.2', results: [{ proposal_id: 'proposal-1', outcome: 'declined' }], }; @@ -63,7 +67,7 @@ describe('conformance: oracle', () => { }); test('decline_proposals still rejects invalid versions and forbidden sync status', () => { - const payload = { results: [{ proposal_id: 'proposal-1', outcome: 'declined' }] }; + const payload = { status: 'completed', results: [{ proposal_id: 'proposal-1', outcome: 'declined' }] }; // AdCP 3.3.0-beta.1 reopens the proposal-flow response roots (DR-0019 / DR-0036). const extended = accepted('decline_proposals', { ...payload, unexpected: true }); assert.equal(extended.verdict, 'accepted', extended.invariantFailures.join('; ')); @@ -72,9 +76,10 @@ describe('conformance: oracle', () => { { ...payload, adcp_version: '3.2.6' }, { ...payload, adcp_version: 3.2 }, { ...payload, adcp_major_version: '3' }, - { ...payload, status: 'completed' }, + { ...payload, status: 'working' }, + { ...payload, status: 'submitted' }, { ...payload, task_id: 'unexpected-task' }, - { results: [{ proposal_id: 'proposal-1' }] }, + { status: 'completed', results: [{ proposal_id: 'proposal-1' }] }, ]) { const out = accepted('decline_proposals', invalid); assert.equal(out.verdict, 'invalid', JSON.stringify(invalid)); @@ -99,11 +104,12 @@ describe('conformance: oracle', () => { }); assert.equal(out.verdict, 'accepted', out.invariantFailures.join('; ')); assert.equal(payload.status, undefined); + // 3.0 never served decline_proposals, so the shim gives it no status, and the pinned 3.3 schema requires one. const compact = accepted('decline_proposals', { adcp_version: '3.0', results: [{ proposal_id: 'proposal-1', outcome: 'declined' }], }); - assert.equal(compact.verdict, 'accepted', compact.invariantFailures.join('; ')); + assert.equal(compact.verdict, 'invalid', compact.invariantFailures.join('; ')); }); test('valid error envelope → rejected', () => { diff --git a/test/lib/media-buy-lifecycle-coordinator.test.js b/test/lib/media-buy-lifecycle-coordinator.test.js index 84a5f3f89..b8233602b 100644 --- a/test/lib/media-buy-lifecycle-coordinator.test.js +++ b/test/lib/media-buy-lifecycle-coordinator.test.js @@ -72,11 +72,19 @@ function capabilities({ version = SDK_PIN, tools, discoveredTools, replayTtlSeco }; } +// AdCP 3.3.0-beta.3 composes the protocol envelope into every task response (adcp#8547), so a 3.3 +// seller's decline_proposals completion carries status. A 3.2 seller's must not (its root is closed). +function withEnvelopeStatus(taskName, data) { + if (taskName !== 'decline_proposals' || !data || typeof data !== 'object' || 'status' in data) return data; + if (typeof data.adcp_version === 'string' && data.adcp_version.startsWith('3.2')) return data; + return { status: 'completed', ...data }; +} + function completed(taskName, data) { return { success: true, status: 'completed', - data, + data: withEnvelopeStatus(taskName, data), metadata: { taskId: `${taskName}-task`, taskName, @@ -1176,7 +1184,7 @@ describe('MediaBuyLifecycleCoordinator negotiation matrix', () => { status: 'completed', createdAt: Date.now(), updatedAt: Date.now(), - result: { results: [{ proposal_id: asyncId, outcome: 'declined' }] }, + result: { status: 'completed', results: [{ proposal_id: asyncId, outcome: 'declined' }] }, }); } assert.equal(coordinator.proposalSnapshotStore.pendingDeclines.size, 0); @@ -2493,6 +2501,7 @@ describe('MediaBuyLifecycleCoordinator negotiation matrix', () => { createdAt: Date.now(), updatedAt: Date.now(), result: { + status: 'completed', results: [{ proposal_id: proposalId, outcome: 'unable', reason: 'The proposal remains available.' }], }, }; diff --git a/test/lib/principal-reporting-subscriptions.test.js b/test/lib/principal-reporting-subscriptions.test.js index 81bd7f792..22df891a5 100644 --- a/test/lib/principal-reporting-subscriptions.test.js +++ b/test/lib/principal-reporting-subscriptions.test.js @@ -189,7 +189,7 @@ describe('sync_principal reporting_subscriptions (option on)', () => { next.prior_versions.map(({ configuration: _configuration, ...prior }) => prior), [{ subscription_version: 1, accepted_at: '2026-11-01T12:00:00.000Z', superseded_at: '2026-11-04T12:00:00.000Z' }] ); - assert.equal(next.prior_versions[0].configuration.subscription_version, 1, 'adcp#8588, served from 3.3.0-beta.2'); + assert.equal(next.prior_versions[0].configuration.subscription_version, 1, 'adcp#8588'); // Versions cannot regress. const regress = await sync(lifecycle, { reporting_subscriptions: [subscription()] }); @@ -223,8 +223,8 @@ describe('sync_principal reporting_subscriptions (option on)', () => { { from: '2026-11-04T12:00:00.000Z', until: '2026-11-06T12:00:00.000Z' }, ]); // The readback lists inactive_intervals (adcontextprotocol/adcp#8585) to callers served a - // release whose bundle defines it (3.3.0-beta.2 on), and never to a response without a - // served release; the internal state carries it. + // release whose bundle defines it, which the pinned 3.3.0-beta.3 does; a response without a + // served release is the pinned release. const { states } = await lifecycle.listReportingSubscriptions(SCOPE); assert.deepEqual(states[0].inactive_intervals, [ { deactivated_at: '2026-11-04T12:00:00.000Z', reactivated_at: '2026-11-06T12:00:00.000Z' }, @@ -235,7 +235,10 @@ describe('sync_principal reporting_subscriptions (option on)', () => { ); assertSchemaValid('sync_principal', on); const unpinned = await lifecycle.protocol.getPrincipal({}, CTX_UNPINNED); - assert.equal(unpinned.result.configuration.reporting_subscriptions[0].inactive_intervals, undefined); + assert.deepEqual( + unpinned.result.configuration.reporting_subscriptions[0].inactive_intervals, + states[0].inactive_intervals + ); time.now = new Date('2026-11-08T00:00:00.000Z'); const omitted = await sync(lifecycle, { reporting_subscriptions: [] }); @@ -665,15 +668,18 @@ describe('sync_principal reporting_subscriptions (option on)', () => { const { states } = await lifecycle.listReportingSubscriptions(SCOPE); assert.equal(states[0].prior_versions[0].configuration.subscription_version, 1); assert.equal(states[0].prior_versions[0].configuration.exclude_account_ids, undefined); - // Served at a release that defines it (adcp#8588, 3.3.0-beta.2 on), the field is emitted; - // without a served release it is not. + // Served at a release that defines it (adcp#8588), the field is emitted; without a served + // release, the pinned 3.3.0-beta.3 does. const served = await lifecycle.protocol.getPrincipal({}, CTX); assert.equal( served.result.configuration.reporting_subscriptions[0].prior_versions[0].configuration.subscription_version, 1 ); const unpinned = await lifecycle.protocol.getPrincipal({}, CTX_UNPINNED); - assert.equal(unpinned.result.configuration.reporting_subscriptions[0].prior_versions[0].configuration, undefined); + assert.equal( + unpinned.result.configuration.reporting_subscriptions[0].prior_versions[0].configuration.subscription_version, + 1 + ); assertSchemaValid('get_principal', served); }); diff --git a/test/lib/proposal-negotiation-versions.test.js b/test/lib/proposal-negotiation-versions.test.js index 286113926..3eabc3c07 100644 --- a/test/lib/proposal-negotiation-versions.test.js +++ b/test/lib/proposal-negotiation-versions.test.js @@ -11,12 +11,13 @@ const { verifyRefineProposalsResponse, } = require('../../dist/lib/index.js'); const { withExternalSchemaRoot, withIdentity33SchemaScope } = require('../../dist/lib/validation/schema-loader.js'); -const { ADCP_VERSION } = require('../../dist/lib/version.js'); +const { ADCP_VERSION, toReleasePrecisionVersion } = require('../../dist/lib/version.js'); const verify = (req, payload, options = {}) => verifyRefineProposalsResponse(req, payload, { adcpVersion: BUNDLE_VERSION, ...options }); -const VERSION = '3.3-beta.2'; -const BUNDLE_VERSION = '3.3.0-beta.2'; +const VERSION = toReleasePrecisionVersion(ADCP_VERSION); +const BUNDLE_VERSION = ADCP_VERSION; +const escapeRegExp = value => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const refinement = { proposal_id: 'source-1', action: 'revise', ask: 'Improve the terms' }; const request = (refinements = [refinement]) => buildRefineProposalsRequest({ adcp_version: VERSION, refinements }); function proposal(overrides = {}) { @@ -299,6 +300,9 @@ test('the public buyer refines and finalizes over the official MCP transport on if (args.adcp_version.startsWith('3.2')) { data.adcp_version = args.adcp_version; child.name = 'stable-only-proposal'; + } else { + // AdCP 3.3.0-beta.3 composes the protocol envelope on every response (adcp#8547): status is required. + data.status = 'completed'; } if (invalidName) child.name = 'stable-only-proposal'; if (invalidEcho !== undefined) data.adcp_version = invalidEcho; @@ -375,11 +379,11 @@ test('the public buyer refines and finalizes over the official MCP transport on invalidName = true; await assert.rejects( () => buyer.refineProposals({ refinements: [refinement] }), - /response echo 3\.2 conflicts with served version metadata 3\.3-beta\.2/ + new RegExp(`response echo 3\\.2 conflicts with served version metadata ${escapeRegExp(VERSION)}`) ); await assert.rejects( () => coordinator.refineProposals({ refinements: [{ ...refinement, proposal_id: 'hostile-source' }] }), - /response echo 3\.2 conflicts with served version metadata 3\.3-beta\.2/ + new RegExp(`response echo 3\\.2 conflicts with served version metadata ${escapeRegExp(VERSION)}`) ); // Isolate the coordinator's own verification: a completed task can // reach projection through polling/callbacks rather than this helper. @@ -396,7 +400,7 @@ test('the public buyer refines and finalizes over the official MCP transport on coordinator.refineProposals({ refinements: [{ ...refinement, proposal_id: 'projection-hostile-source' }], }), - /response echo 3\.2 conflicts with served version metadata 3\.3-beta\.2/ + new RegExp(`response echo 3\\.2 conflicts with served version metadata ${escapeRegExp(VERSION)}`) ); } finally { buyer.refineProposals = publicRefine; @@ -450,7 +454,7 @@ test('the public buyer refines and finalizes over the official MCP transport on const identityBuyer = AgentClient.fromMCPClient(mcp, { adcpVersion: '3.3', experimentalIdentity33: true }); await assert.rejects( () => identityBuyer.refineProposals({ refinements: [refinement] }), - /AdCP 3\.3 resolved to "3\.3\.0-beta\.2/ + new RegExp(`AdCP 3\\.3 resolved to "${escapeRegExp(BUNDLE_VERSION)}`) ); }); } finally { @@ -601,7 +605,7 @@ test('identity-only 3.3 aliases cannot replace a genuine proposal schema bundle' const payload = { ...response(), adcp_version: '3.3' }; const aliased = withIdentity33SchemaScope(() => verifyRefineProposalsResponse(req, payload, { adcpVersion: '3.3' })); assert.equal(aliased.ok, false); - assert.match(aliased.issues[0].message, /AdCP 3\.3 resolved to "3\.3\.0-beta\.2/); + assert.match(aliased.issues[0].message, new RegExp(`AdCP 3\\.3 resolved to "${escapeRegExp(BUNDLE_VERSION)}`)); assert.match(aliased.issues[0].message, /actual matching schema bundle/); await withCandidateSchema(() => withIdentity33SchemaScope(() => { diff --git a/test/lib/reporting-subscription-consumer.test.js b/test/lib/reporting-subscription-consumer.test.js index d04158f49..43d5c45fe 100644 --- a/test/lib/reporting-subscription-consumer.test.js +++ b/test/lib/reporting-subscription-consumer.test.js @@ -194,8 +194,15 @@ describe('buyer helpers', () => { [2, '2026-11-04T12:00:00.000Z', undefined], ] ); + // The readback carries every prior version's configuration (adcp#8588), so the buyer's own copies + // are optional; a readback without them needs the buyer to have kept every version. + assert.deepEqual(reportingSubscriptionVersionRecordsV1({ state: second.subscriptions[0] }), versions); + const withoutConfigurations = { + ...second.subscriptions[0], + prior_versions: second.subscriptions[0].prior_versions.map(({ configuration: _c, ...prior }) => prior), + }; assert.throws( - () => reportingSubscriptionVersionRecordsV1({ state: second.subscriptions[0], configurations: { 2: sent[2] } }), + () => reportingSubscriptionVersionRecordsV1({ state: withoutConfigurations, configurations: { 2: sent[2] } }), /keep every version/ ); diff --git a/test/lib/reporting-subscription-coverage.test.js b/test/lib/reporting-subscription-coverage.test.js index f984599de..439e746d0 100644 --- a/test/lib/reporting-subscription-coverage.test.js +++ b/test/lib/reporting-subscription-coverage.test.js @@ -32,6 +32,25 @@ const staleTzdata = typeof runtimeTzdata === 'string' && runtimeTzdata < TZDATA_ const UTC_ZONES = new Set(['UTC', 'Etc/UTC']); const zoneDependent = testCase => (testCase.timezones ?? []).some(zone => !UTC_ZONES.has(zone)); +// Cases at this pin (AdCP 3.3.0-beta.3) that the coverage function does not satisfy yet, each with the spec +// rule it needs. They still run: each must FAIL, so one that starts passing fails the suite until its entry +// is removed. The engine follow-up (bokelley/reporting-subscription-beta3-engine) implements the rules and +// empties this map. Never skip a case silently. +const EXPECTED_FAILURES = new Map([ + [ + 'cancellation-notice-period-is-owed-through-the-delivery-stop', + 'adcp#8617: cancellation_effective_at stops delivery', + ], + ['billing-cutover-owes-a-stub', 'adcp#8617: a billing cutover owes the [E, first incoming boundary) stub'], + ['flight-extension-adds-only-unresolved-periods', 'adcp#8618: flight_history replaces prior_flights'], + ['reinstatement-after-cancellation', 'adcp#8618: flight_history replaces prior_flights'], + ['extension-of-an-empty-flight', 'adcp#8618: flight_history replaces prior_flights'], + ['a-newly-available-offering-never-re-resolves', 'adcp#8619: resolution is sticky per (buy, version)'], + ['reactivation-after-a-schedule-change-never-owes-twice', 'adcp#8622: reactivation never owes a period twice'], + ['havana-pt24h-equals-p1d-when-midnight-does-not-exist', 'adcp#8622: each local date starts with a boundary'], + ['havana-pt2h-nests-in-the-day', 'adcp#8622: each local date starts with a boundary'], +]); + const instant = value => Date.parse(value); const iso = value => new Date(value).toISOString(); @@ -65,7 +84,7 @@ describe('canonical coverage vectors (adcp#8616)', () => { }); test('the vectors are non-trivial, uniquely identified and pinned to a tzdata release', () => { - assert.ok(table.cases.length >= 113); + assert.ok(table.cases.length >= 120); assert.equal(new Set(table.cases.map(c => c.id)).size, table.cases.length); assert.equal(new Set(table.cases.map(c => c.name)).size, table.cases.length); assert.match(table.tzdata.version, /^\d{4}[a-z]$/); @@ -83,7 +102,23 @@ describe('canonical coverage vectors (adcp#8616)', () => { } }); - for (const testCase of table.cases) { + test('every expected failure names a case at this pin', () => { + const ids = new Set(table.cases.map(c => c.id)); + for (const id of EXPECTED_FAILURES.keys()) assert.ok(ids.has(id), `${id} is not in the pinned vectors`); + }); + + for (const testCase of table.cases.filter(c => EXPECTED_FAILURES.has(c.id))) { + const rule = EXPECTED_FAILURES.get(testCase.id); + test(`${testCase.id} (expected failure: ${rule})`, () => { + assert.throws( + () => runCase(testCase), + error => error instanceof assert.AssertionError, + `${testCase.id} now passes: remove it from EXPECTED_FAILURES` + ); + }); + } + + for (const testCase of table.cases.filter(c => !EXPECTED_FAILURES.has(c.id))) { test(testCase.id, t => { try { runCase(testCase); diff --git a/test/lib/reporting-subscription-engine.test.js b/test/lib/reporting-subscription-engine.test.js index f4e88ff8e..9e199cba3 100644 --- a/test/lib/reporting-subscription-engine.test.js +++ b/test/lib/reporting-subscription-engine.test.js @@ -604,19 +604,23 @@ describe('reporting subscription engine conformance (buyer periods equal seller reportingSubscriptionCoverageForReleaseV1, reportingSubscriptionReleaseFieldsV1, } = require('../../dist/lib/server/reporting-subscription-release.js'); - const beta1 = reportingSubscriptionCoverageForReleaseV1( - entry, - reportingSubscriptionReleaseFieldsV1('3.3.0-beta.2') - ); - assert.equal(beta1.status, 'active', 'a release without the inactive value sees the account-level state'); - assert.equal('deactivated_at' in beta1, false); - assert.equal( - reportingSubscriptionCoverageForReleaseV1(entry, { - ...reportingSubscriptionReleaseFieldsV1(undefined), - inactiveCoverageStatus: true, - }).status, - 'inactive' - ); + const { ADCP_VERSION } = require('../../dist/lib/version.js'); + // The SDK's own pin (3.3.0-beta.3) defines inactive, and an absent served release is the pin. + for (const served of [ADCP_VERSION, undefined]) { + const fields = reportingSubscriptionReleaseFieldsV1(served); + assert.deepEqual( + Object.entries(fields).filter(([, defined]) => !defined), + [], + `${served}: every settled field` + ); + const projected = reportingSubscriptionCoverageForReleaseV1(entry, fields); + assert.equal(projected.status, 'inactive', String(served)); + assert.equal(projected.deactivated_at, '2026-11-04T12:00:00.000Z'); + } + // A caller served an older release (3.2.7 has no inactive value) sees the account-level state. + const older = reportingSubscriptionCoverageForReleaseV1(entry, reportingSubscriptionReleaseFieldsV1('3.2.7')); + assert.equal(older.status, 'active', 'a release without the inactive value sees the account-level state'); + assert.equal('deactivated_at' in older, false); // The 11-04 period started before the deactivation and is retained for 30 days after it ends. w.clock.now = new Date('2026-12-04T23:00:00.000Z'); assert.equal((await w.engine.subscriptionCoverage(SCOPE, 'acct_1')).length, 1); diff --git a/test/lib/response-envelope-status-gating.test.js b/test/lib/response-envelope-status-gating.test.js index 0cbf389b7..790b1f43a 100644 --- a/test/lib/response-envelope-status-gating.test.js +++ b/test/lib/response-envelope-status-gating.test.js @@ -91,13 +91,16 @@ describe('a release that composes the envelope: status is required and preserved context_id: 'ctx-1', timestamp: '2026-11-03T12:00:00Z', replayed: false, - message: 'x'.repeat(2500), + // AdCP 3.3.0-beta.3 bounds a task-level message at 2000 characters (core/task-message.json). + message: 'x'.repeat(2000), adcp_version: '3.3', context: { trace: 'abc' }, }, CURRENT ); assert.strictEqual(result.valid, true, messages(result)); + const tooLong = validateResponse(tool, { ...body, status: 'completed', message: 'x'.repeat(2001) }, CURRENT); + assert.strictEqual(tooLong.valid, false, 'a message longer than 2000 characters is refused'); }); }); diff --git a/test/lib/response-unwrapper.test.js b/test/lib/response-unwrapper.test.js index ca0b9a657..31e78a0c3 100644 --- a/test/lib/response-unwrapper.test.js +++ b/test/lib/response-unwrapper.test.js @@ -56,27 +56,40 @@ describe('Response Unwrapper', () => { assert.strictEqual(isAdcpSuccess(result, 'get_products'), true); }); - test('preserves the status-free list_products success arm', () => { + // AdCP 3.2.x publishes these success arms without status; 3.3.0-beta.3 composes the protocol + // envelope into them (adcp#8547), so status is required. Neither is stripped nor filled in. + test('preserves the status-free list_products success arm of a 3.2 response', () => { const payload = { outcome: 'listed', products: [], feed_version: 'feed-v1', cache_scope: 'public', }; - const result = unwrapProtocolResponse({ structuredContent: payload }, 'list_products', 'mcp'); + const result = unwrapProtocolResponse({ structuredContent: payload }, 'list_products', 'mcp', { + responseAdcpVersion: '3.2.7', + }); assert.deepStrictEqual(result, payload); assert.strictEqual(result.status, undefined); + const current = { status: 'completed', ...payload }; + assert.deepStrictEqual(unwrapProtocolResponse({ structuredContent: current }, 'list_products', 'mcp'), current); }); - test('preserves the status-free decline_proposals success arm', () => { + test('preserves the status-free decline_proposals success arm of a 3.2 response', () => { const payload = { results: [{ proposal_id: 'proposal-1', outcome: 'declined' }], }; - const result = unwrapProtocolResponse({ structuredContent: payload }, 'decline_proposals', 'mcp'); + const result = unwrapProtocolResponse({ structuredContent: payload }, 'decline_proposals', 'mcp', { + responseAdcpVersion: '3.2.7', + }); assert.deepStrictEqual(result, payload); assert.strictEqual(result.status, undefined); + const current = { status: 'completed', ...payload }; + assert.deepStrictEqual( + unwrapProtocolResponse({ structuredContent: current }, 'decline_proposals', 'mcp'), + current + ); }); test('rejects decline results without the required proposal_id', () => { diff --git a/test/lib/schema-loader-per-version.test.js b/test/lib/schema-loader-per-version.test.js index eab49e00a..c36ad1e78 100644 --- a/test/lib/schema-loader-per-version.test.js +++ b/test/lib/schema-loader-per-version.test.js @@ -460,10 +460,13 @@ describe('schema-loader per-version state', () => { task_type: 'create_media_buy', status: 'completed', timestamp: '2026-05-26T09:00:44.582Z', + // AdCP 3.3.0-beta.3: a completed create_media_buy carries confirmed_at and revision. result: { status: 'completed', media_buy_id: 'mb_1', packages: [], + confirmed_at: '2026-05-26T09:00:44.000Z', + revision: 1, }, }); assert.strictEqual(ok, true, JSON.stringify(validate.errors)); @@ -473,7 +476,13 @@ describe('schema-loader per-version state', () => { task_id: 'task_schema_ref', task_type: 'create_media_buy', status: 'completed', - result: { status: 'completed', media_buy_id: 'mb_1', packages: [] }, + result: { + status: 'completed', + media_buy_id: 'mb_1', + packages: [], + confirmed_at: '2026-05-26T09:00:44.000Z', + revision: 1, + }, }); assert.strictEqual(missingEnvelopeFields, false, 'schema should reject missing operation_id and timestamp'); assert.strictEqual(validate.errors.length, 1, 'the default remote-payload validator must remain fail-fast'); @@ -484,7 +493,13 @@ describe('schema-loader per-version state', () => { task_id: 'task_schema_ref', task_type: 'create_media_buy', status: 'completed', - result: { status: 'completed', media_buy_id: 'mb_1', packages: [] }, + result: { + status: 'completed', + media_buy_id: 'mb_1', + packages: [], + confirmed_at: '2026-05-26T09:00:44.000Z', + revision: 1, + }, }), false ); diff --git a/test/lib/sdk17-adoption-regressions.test.js b/test/lib/sdk17-adoption-regressions.test.js index fe1fafd62..ea5ebc459 100644 --- a/test/lib/sdk17-adoption-regressions.test.js +++ b/test/lib/sdk17-adoption-regressions.test.js @@ -24,7 +24,7 @@ for (const tool of ['create_media_buy', 'update_media_buy']) { const server = createAdcpServer({ name: 'adoption-seller', version: '1.0.0', - adcpVersion: '3.3.0-beta.2', + adcpVersion: sdk.ADCP_VERSION, defaultAdcpVersion: '3.1', idempotency: 'disabled', capabilities: { supported_versions: ['3.0', '3.1', '3.2'] }, @@ -163,7 +163,7 @@ test('stable 3.3 pin gives a concise exact-beta suggestion', () => { () => sdk.resolveAdcpVersion('3.3.0'), error => { assert.ok(error.message.length < 600, error.message); - assert.match(error.message, /3\.3\.0-beta\.2/); + assert.ok(error.message.includes(sdk.ADCP_VERSION), error.message); assert.match(error.message, /stable version does not select a prerelease/); return true; } diff --git a/test/lib/storyboard-canonical-selector-metadata.test.js b/test/lib/storyboard-canonical-selector-metadata.test.js index 77fbf2582..a25e8cb2b 100644 --- a/test/lib/storyboard-canonical-selector-metadata.test.js +++ b/test/lib/storyboard-canonical-selector-metadata.test.js @@ -28,7 +28,15 @@ const authoredStep = published.phases .flatMap(phase => phase.steps) .find(step => step.id === 'create_media_buy_with_direct_canonical_selector'); const selector = authoredStep.sample_request.packages[0]; -const product = published.fixtures.products.find(entry => entry.product_id === selector.product_id); +// AdCP 3.3.0-beta.3 seeds the product through a comply_test_controller seed_product step after native discovery +// (adcp#8599) instead of listing it under fixtures.products; read it from wherever the storyboard declares it. +const seededProducts = published.phases + .flatMap(phase => phase.steps) + .filter(step => step.task === 'comply_test_controller' && step.sample_request?.scenario === 'seed_product') + .map(step => ({ product_id: step.sample_request.params.product_id, ...step.sample_request.params.fixture })); +const product = [...(published.fixtures?.products ?? []), ...seededProducts].find( + entry => entry.product_id === selector.product_id +); const validation = authoredStep.validations.find(entry => entry.check === 'canonical_format_satisfaction'); const metadata = ['ssl_required', 'asset_source', 'buyer_asset_acceptance', 'composition_model', 'slots']; diff --git a/test/lib/storyboard-drift.test.js b/test/lib/storyboard-drift.test.js index 7641a3c1c..58df60624 100644 --- a/test/lib/storyboard-drift.test.js +++ b/test/lib/storyboard-drift.test.js @@ -26,6 +26,8 @@ const EnvelopeSchema = ProtocolEnvelopeSchema.merge(AdCPVersionEnvelopeSchema); // Runner-internal tasks with no agent-facing schema. const HARNESS_TASKS = new Set([ + // The loader's pseudo-task for validation-only steps (AdCP 3.3.0-beta.3 storyboards use them). + '__validation_only__', 'comply_test_controller', 'protected_resource_metadata', 'oauth_auth_server_metadata', diff --git a/test/lib/storyboard-webhook-receiver.test.js b/test/lib/storyboard-webhook-receiver.test.js index 27bc7886d..f9e3b6871 100644 --- a/test/lib/storyboard-webhook-receiver.test.js +++ b/test/lib/storyboard-webhook-receiver.test.js @@ -635,10 +635,13 @@ async function startFakePublisher(config = {}) { task_type: 'create_media_buy', status: 'completed', timestamp: '2026-05-26T09:00:44.582Z', + // AdCP 3.3.0-beta.3: a completed create_media_buy carries confirmed_at and revision. result: { status: 'completed', media_buy_id: 'mb_1', packages: [], + confirmed_at: '2026-05-26T09:00:44.000Z', + revision: 1, }, }), }); @@ -653,7 +656,13 @@ async function startFakePublisher(config = {}) { task_id: taskId, task_type: 'create_media_buy', status: 'completed', - result: { status: 'completed', media_buy_id: 'mb_1', packages: [] }, + result: { + status: 'completed', + media_buy_id: 'mb_1', + packages: [], + confirmed_at: '2026-05-26T09:00:44.000Z', + revision: 1, + }, }), }); } catch {} diff --git a/test/lib/strict-account-references.test.js b/test/lib/strict-account-references.test.js index f970046ac..27730f623 100644 --- a/test/lib/strict-account-references.test.js +++ b/test/lib/strict-account-references.test.js @@ -8,6 +8,7 @@ const { createAdcpServer } = require('../../dist/lib/server/create-adcp-server.j const { createAdcpServerFromPlatform } = require('../../dist/lib/server/decisioning/runtime/from-platform.js'); const { InMemoryStateStore } = require('../../dist/lib/server/state-store.js'); const { _resetAccountReferenceWarnings } = require('../../dist/lib/server/account-reference-warnings.js'); +const { ADCP_VERSION, toReleasePrecisionVersion } = require('../../dist/lib/version.js'); const a = { brand: { domain: 'a.example' }, operator: 'agency.example' }; const b = { brand: { domain: 'b.example' }, operator: 'agency.example' }; @@ -464,9 +465,13 @@ test('implicit identity mismatch on comply_test_controller: default warns and di test('3.3 implicit identity mismatches fail closed while an explicit 3.2 route retains compatibility', async t => { const w = captureWarnings(t); - const server = implicitServer(w.logger, { opts: { adcpVersion: '3.3.0-beta.2' } }); + const server = implicitServer(w.logger, { opts: { adcpVersion: ADCP_VERSION } }); try { - const refused = await call(server, 'get_products', { account: a, brief: 'catalog', adcp_version: '3.3-beta.2' }); + const refused = await call(server, 'get_products', { + account: a, + brief: 'catalog', + adcp_version: toReleasePrecisionVersion(ADCP_VERSION), + }); assert.equal(refused.structuredContent.adcp_error.code, 'ACCOUNT_NOT_FOUND'); assertNoAccountIdLeak(refused); const legacy = await call(server, 'get_products', { account: a, brief: 'catalog', adcp_version: '3.2' }); diff --git a/test/lib/supply-path-types.test.js b/test/lib/supply-path-types.test.js index 6e25bf9d3..85fadce5c 100644 --- a/test/lib/supply-path-types.test.js +++ b/test/lib/supply-path-types.test.js @@ -41,7 +41,9 @@ listed.products.map(product => product.product_id); unchanged.products?.map(product => product.product_id); // @ts-expect-error An unchanged feed legitimately omits products. unchanged.products.map(product => product.product_id); +// AdCP 3.3.0-beta.3 composes the protocol envelope into every response: status is required. const unchangedResponse: ListProductsResponseWithSupplyPath = { + status: 'completed', outcome: 'unchanged', feed_version: 'v1', cache_scope: 'public', diff --git a/test/lib/version-sync.test.js b/test/lib/version-sync.test.js index 2caab0209..f7b69a758 100644 --- a/test/lib/version-sync.test.js +++ b/test/lib/version-sync.test.js @@ -25,8 +25,8 @@ test('AdCP semver pins normalize to release-precision wire values', () => { }); test('3.3 beta pin retains stable 3.2 aliases and advertises only its exact preview', () => { - assert.equal(ADCP_VERSION, '3.3.0-beta.2'); - assert.equal(toReleasePrecisionVersion(ADCP_VERSION), '3.3-beta.2'); + assert.equal(ADCP_VERSION, '3.3.0-beta.3'); + assert.equal(toReleasePrecisionVersion(ADCP_VERSION), '3.3-beta.3'); assert.ok(COMPATIBLE_ADCP_VERSIONS.includes('3.0.25')); assert.ok(COMPATIBLE_ADCP_VERSIONS.includes('3.1.18')); assert.ok(COMPATIBLE_ADCP_VERSIONS.includes('3.1.24')); @@ -47,7 +47,7 @@ test('3.3 beta pin retains stable 3.2 aliases and advertises only its exact prev assert.ok(!COMPATIBLE_ADCP_VERSIONS.includes('3.2-beta')); assert.deepEqual( COMPATIBLE_ADCP_VERSIONS.filter(version => /-(?:beta|rc)/.test(version)), - ['3.3.0-beta.2', '3.3-beta.2'] + ['3.3.0-beta.3', '3.3-beta.3'] ); assert.ok(!COMPATIBLE_ADCP_VERSIONS.includes('3.3-beta')); assert.ok(!COMPATIBLE_ADCP_VERSIONS.includes('3.3')); diff --git a/test/lib/version-translation.test.js b/test/lib/version-translation.test.js index 78022e1e8..ad43d8ac0 100644 --- a/test/lib/version-translation.test.js +++ b/test/lib/version-translation.test.js @@ -27,6 +27,9 @@ const { } = require('../../dist/lib/adapters/version/index.js'); const CLIENT_VERSION = '3.2.5'; +// The SDK's own 3.3 preview pin, as a bundle version and at release precision. +const { ADCP_VERSION: BETA_PIN, toReleasePrecisionVersion } = require('../../dist/lib/version.js'); +const BETA_WIRE = toReleasePrecisionVersion(BETA_PIN); function caps(supportedVersions, overrides = {}) { return { @@ -425,14 +428,14 @@ describe('SingleAgentClient against an older seller', () => { const calls = captureDispatch(t); for (const evidence of [ caps(['3.3-beta.1']), - caps(undefined, { servedVersion: '3.3-beta.2' }), - caps(['3.3-beta.2'], { _synthetic: true }), + caps(undefined, { servedVersion: BETA_WIRE }), + caps([BETA_WIRE], { _synthetic: true }), ]) { for (const useWrapper of [false, true]) { - const client = makeClient(evidence, { adcpVersion: '3.3.0-beta.2' }); + const client = makeClient(evidence, { adcpVersion: BETA_PIN }); let buyer = client; if (useWrapper) { - buyer = new AgentClient(client.agent, { adcpVersion: '3.3.0-beta.2' }); + buyer = new AgentClient(client.agent, { adcpVersion: BETA_PIN }); buyer.client = client; } await assert.rejects(() => buyer.listCollections(), ProtocolFeatureUnsupportedError); @@ -443,7 +446,7 @@ describe('SingleAgentClient against an older seller', () => { test('a beta buyer retains the 3.0 downgrade for real metadata-free v3 discovery', async t => { const calls = captureDispatch(t); - const client = makeClient(caps(undefined), { adcpVersion: '3.3.0-beta.2' }); + const client = makeClient(caps(undefined), { adcpVersion: BETA_PIN }); await assert.rejects(() => client.listCollections(), ProtocolFeatureUnsupportedError); assert.deepEqual(calls, []); const negotiated = client.negotiateCallRelease(caps(undefined), undefined); @@ -637,7 +640,7 @@ describe('sized inline-markup creatives to a seller before AdCP 3.3 (adcp-client ]) { test(`${label}: the size selects the legacy ref and is not sent as 3.3 asset fields`, async t => { const calls = captureDispatch(t, { structuredContent: { adcp_version: wire, creatives: [] } }); - const client = makeClient(sellerCaps, { adcpVersion: '3.3.0-beta.2' }); + const client = makeClient(sellerCaps, { adcpVersion: BETA_PIN }); const synced = await client.syncCreatives( { account: ACCOUNT, idempotency_key: 'markup-sync-000001', creatives: [creative()] }, @@ -677,7 +680,7 @@ describe('sized inline-markup creatives to a seller before AdCP 3.3 (adcp-client test('a 3.3 seller receives the canonical display_tag with its rendered size', async t => { const calls = captureDispatch(t, { structuredContent: { creatives: [] } }); - const client = makeClient(caps(['3.2', '3.3.0-beta.2']), { adcpVersion: '3.3.0-beta.2' }); + const client = makeClient(caps(['3.2', BETA_PIN]), { adcpVersion: BETA_PIN }); await client.syncCreatives( { account: ACCOUNT, idempotency_key: 'markup-sync-000002', creatives: [creative()] }, undefined, diff --git a/test/server-decisioning-from-platform.test.js b/test/server-decisioning-from-platform.test.js index 683cb666e..eb8d57d5f 100644 --- a/test/server-decisioning-from-platform.test.js +++ b/test/server-decisioning-from-platform.test.js @@ -33,6 +33,24 @@ const PRODUCTS_ONLY_BRIEF_VECTORS = JSON.parse( const validateMcpWebhookPayload = getSchemaValidatorByRef('core/mcp-webhook-payload.json'); assert.ok(validateMcpWebhookPayload, 'MCP webhook payload schema must compile'); +// Schema-complete discovery fixtures: AdCP 3.3.0-beta.3 webhook results are validated as full task +// responses (adcp#8547), so the async product and signal must be valid ones. +const ASYNC_POLLABLE_PRODUCT = (() => { + const { format_ids: _formatIds, ...product } = require('./lib/test-fixtures').createTestProduct({ + product_id: 'p_async_pollable', + name: 'pollable product', + }); + return { ...product, format_options: [{ format_kind: 'image', params: {} }] }; +})(); +const ASYNC_POLLABLE_SIGNAL = { + signal_agent_segment_id: 'sig_pollable', + name: 'Pollable signal', + signal_id: { source: 'agent', agent_url: 'https://signals.example', id: 'sig_pollable' }, + description: 'Pollable signal', + signal_type: 'marketplace', + deployments: [], +}; + function assertMcpWebhookPayloadValid(payload) { assert.strictEqual(validateMcpWebhookPayload(payload), true, JSON.stringify(validateMcpWebhookPayload.errors)); } @@ -4962,13 +4980,7 @@ describe('HITL dual-method dispatch — *Task variants', () => { ctx.handoffToTask(async () => { await unblockTask; return { - products: [ - { - product_id: 'p_async_pollable', - name: 'pollable product', - format_options: [{ format_kind: 'image', params: {} }], - }, - ], + products: [ASYNC_POLLABLE_PRODUCT], cache_scope: 'account', }; }), @@ -5044,13 +5056,7 @@ describe('HITL dual-method dispatch — *Task variants', () => { }); assert.strictEqual(completed.structuredContent.status, 'completed'); assert.deepStrictEqual(completed.structuredContent.result, { - products: [ - { - product_id: 'p_async_pollable', - name: 'pollable product', - format_options: [{ format_kind: 'image', params: {} }], - }, - ], + products: [ASYNC_POLLABLE_PRODUCT], cache_scope: 'account', }); assert.strictEqual(emits.length, 1, 'one get_products webhook emitted on terminal completion'); @@ -5061,14 +5067,10 @@ describe('HITL dual-method dispatch — *Task variants', () => { assert.strictEqual(emits[0].payload.operation_id, 'op_products_async'); assert.strictEqual(emits[0].payload.token, 'webhook-token-1234'); assert.deepStrictEqual(emits[0].payload.result, { - products: [ - { - product_id: 'p_async_pollable', - name: 'pollable product', - format_options: [{ format_kind: 'image', params: {} }], - }, - ], + products: [ASYNC_POLLABLE_PRODUCT], cache_scope: 'account', + // The terminal result is the task's full response, so it carries the task status (adcp#8547). + status: 'completed', }); assertMcpWebhookPayloadValid(emits[0].payload); }); @@ -5091,7 +5093,8 @@ describe('HITL dual-method dispatch — *Task variants', () => { ctx.handoffToTask(async () => { await unblockTask; return { - signals: [{ signal_agent_segment_id: 'sig_pollable', name: 'Pollable signal' }], + signals: [ASYNC_POLLABLE_SIGNAL], + cache_scope: 'public', }; }), activateSignal: async () => ({ deployments: [] }), @@ -5170,7 +5173,8 @@ describe('HITL dual-method dispatch — *Task variants', () => { assert.strictEqual(completed.structuredContent.protocol, 'signals'); assert.strictEqual(completed.structuredContent.status, 'completed'); assert.deepStrictEqual(completed.structuredContent.result, { - signals: [{ signal_agent_segment_id: 'sig_pollable', name: 'Pollable signal' }], + signals: [ASYNC_POLLABLE_SIGNAL], + cache_scope: 'public', }); assert.strictEqual(emits.length, 1, 'one get_signals webhook emitted on terminal completion'); assert.strictEqual(emits[0].payload.task_type, 'get_signals'); @@ -5180,7 +5184,9 @@ describe('HITL dual-method dispatch — *Task variants', () => { assert.strictEqual(emits[0].payload.operation_id, 'op_signals_async'); assert.strictEqual(emits[0].payload.token, 'signals-webhook-token-1234'); assert.deepStrictEqual(emits[0].payload.result, { - signals: [{ signal_agent_segment_id: 'sig_pollable', name: 'Pollable signal' }], + signals: [ASYNC_POLLABLE_SIGNAL], + cache_scope: 'public', + status: 'completed', }); assertMcpWebhookPayloadValid(emits[0].payload); }); @@ -8283,7 +8289,13 @@ describe('HITL push notification webhook on terminal state', () => { }, }; - const platform = buildHitlPlatform(async () => ({ media_buy_id: 'mb_42', status: 'active' })); + const platform = buildHitlPlatform(async () => ({ + media_buy_id: 'mb_42', + status: 'active', + confirmed_at: '2026-04-30T12:00:00Z', + revision: 1, + packages: [], + })); const server = createAdcpServerFromPlatform(platform, { name: 'webhook', version: '0.0.1', @@ -8328,7 +8340,16 @@ describe('HITL push notification webhook on terminal state', () => { assert.strictEqual(emit.payload.protocol, 'media-buy'); assert.ok(typeof emit.payload.idempotency_key === 'string' && emit.payload.idempotency_key.length >= 16); assert.ok(typeof emit.payload.timestamp === 'string'); - assert.deepStrictEqual(emit.payload.result, { media_buy_id: 'mb_42', status: 'active' }); + // As on the synchronous path, the buy's lifecycle value moves to media_buy_status and the result + // carries the task status (adcp#8547). + assert.deepStrictEqual(emit.payload.result, { + media_buy_id: 'mb_42', + media_buy_status: 'active', + confirmed_at: '2026-04-30T12:00:00Z', + revision: 1, + packages: [], + status: 'completed', + }); assert.strictEqual(emit.payload.token, 'webhook-token-1234'); assert.match(emit.delivery_id, new RegExp(`^task-webhook:acc_1:create_media_buy:${taskId}$`)); assert.notStrictEqual(emit.delivery_id, 'op_webhook_test'); @@ -8475,7 +8496,11 @@ describe('HITL push notification webhook on terminal state', () => { assert.strictEqual(record.error, undefined); assert.strictEqual(emits.length, 1); assert.strictEqual(emits[0].payload.status, 'rejected'); - assert.deepStrictEqual(emits[0].payload.result, { media_buy_id: 'mb_declined', decision: 'declined' }); + assert.deepStrictEqual(emits[0].payload.result, { + media_buy_id: 'mb_declined', + decision: 'declined', + status: 'rejected', + }); assert.strictEqual(emits[0].payload.message, 'Inventory is no longer available'); assert.strictEqual(emits[0].payload.error, undefined); }); diff --git a/test/type-generator-required-fields.test.js b/test/type-generator-required-fields.test.js index 9a070691f..27b25f16d 100644 --- a/test/type-generator-required-fields.test.js +++ b/test/type-generator-required-fields.test.js @@ -141,6 +141,7 @@ export const GetProductsRequestSchema = z.object({ }).passthrough(); export const GetProductsResponseSchema = z.object({ + message: z.string().optional(), timestamp: z.string().optional(), governance_context: z.string().optional(), adcp_version: z.string().optional(), @@ -478,8 +479,12 @@ const source = JSON.parse( readFileSync(path.join(root, 'schemas/cache/latest/media-buy/refine-proposals-response.json'), 'utf8') ); const transformed = enforceStrictSchema(applyCodegenSchemaWorkarounds(source, 'RefineProposalsResponse')); -const completed = transformed.oneOf.filter((branch: any) => branch.properties?.status?.const === 'completed'); -const submitted = transformed.oneOf.filter((branch: any) => branch.properties?.status?.const === 'submitted'); +// AdCP 3.3.0-beta.3 composes the protocol envelope at the root, so each materialized +// branch is { allOf: [envelope, branch] }; read the branch itself. +const unwrap = (branch: any) => (Array.isArray(branch?.allOf) ? branch.allOf.find((member: any) => member?.properties) ?? branch : branch); +const arms = transformed.oneOf.map(unwrap); +const completed = arms.filter((branch: any) => branch.properties?.status?.const === 'completed'); +const submitted = arms.filter((branch: any) => branch.properties?.status?.const === 'submitted'); const branches = completed.flatMap((branch: any) => branch.properties.results.items.oneOf); function inspectIntersection(schema: any) { @@ -582,10 +587,14 @@ const source = JSON.parse( readFileSync(path.join(__REPO_ROOT__, 'schemas/cache/latest/media-buy/request-proposals-response.json'), 'utf8') ); const transformed = enforceStrictSchema(applyCodegenSchemaWorkarounds(source, 'RequestProposalsResponse')); -const proposed = transformed.oneOf.find( +// AdCP 3.3.0-beta.3 composes the protocol envelope at the root, so each materialized +// branch is { allOf: [envelope, branch] }; read the branch itself. +const unwrap = (branch: any) => (Array.isArray(branch?.allOf) ? branch.allOf.find((member: any) => member?.properties) ?? branch : branch); +const arms = transformed.oneOf.map(unwrap); +const proposed = arms.find( (branch: any) => branch.properties?.outcome?.const === 'proposed' ); -const productsAvailable = transformed.oneOf.find( +const productsAvailable = arms.find( (branch: any) => branch.properties?.outcome?.const === 'products_available' ); const legacyCreate = productsAvailable.properties.purchase_continuation.oneOf.find( @@ -625,7 +634,10 @@ const source = JSON.parse( readFileSync(path.join(__REPO_ROOT__, 'schemas/cache/latest/media-buy/decline-proposals-response.json'), 'utf8') ); const transformed = enforceStrictSchema(applyCodegenSchemaWorkarounds(source, 'DeclineProposalsResponse')); -const branches = transformed.oneOf.map((response: any) => response.properties.results.items.oneOf); +// AdCP 3.3.0-beta.3 composes the protocol envelope at the root, so each materialized +// branch is { allOf: [envelope, branch] }; read the branch itself. +const unwrap = (branch: any) => (Array.isArray(branch?.allOf) ? branch.allOf.find((member: any) => member?.properties) ?? branch : branch); +const branches = transformed.oneOf.map(unwrap).map((response: any) => response.properties.results.items.oneOf); writeFileSync(__OUTPUT__, JSON.stringify({ branches: branches.map((arms: any[]) => arms.map((arm: any) => ({ outcome: arm.properties.outcome.const,