@adcp/sdk 8.1.0-beta.6 → 8.1.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +12 -0
  2. package/dist/lib/conformance/oracle.d.ts.map +1 -1
  3. package/dist/lib/conformance/oracle.js +8 -1
  4. package/dist/lib/conformance/oracle.js.map +1 -1
  5. package/dist/lib/conformance/schemaArbitrary.js +135 -9
  6. package/dist/lib/conformance/schemaArbitrary.js.map +1 -1
  7. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  8. package/dist/lib/server/create-adcp-server.d.ts +5 -0
  9. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  10. package/dist/lib/server/create-adcp-server.js +41 -3
  11. package/dist/lib/server/create-adcp-server.js.map +1 -1
  12. package/dist/lib/server/decisioning/capabilities.d.ts +8 -0
  13. package/dist/lib/server/decisioning/capabilities.d.ts.map +1 -1
  14. package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
  15. package/dist/lib/server/decisioning/proposal/dispatch.js +2 -0
  16. package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
  17. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  18. package/dist/lib/server/decisioning/runtime/from-platform.js +14 -1
  19. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  20. package/dist/lib/server/responses.d.ts +1 -1
  21. package/dist/lib/server/responses.d.ts.map +1 -1
  22. package/dist/lib/server/responses.js +5 -2
  23. package/dist/lib/server/responses.js.map +1 -1
  24. package/dist/lib/signing/types.d.ts +6 -0
  25. package/dist/lib/signing/types.d.ts.map +1 -1
  26. package/dist/lib/signing/types.js.map +1 -1
  27. package/dist/lib/signing/verifier.d.ts.map +1 -1
  28. package/dist/lib/signing/verifier.js +33 -4
  29. package/dist/lib/signing/verifier.js.map +1 -1
  30. package/dist/lib/testing/storyboard/compliance.d.ts +1 -0
  31. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  32. package/dist/lib/testing/storyboard/compliance.js +8 -2
  33. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  34. package/dist/lib/testing/storyboard/index.d.ts +1 -1
  35. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  36. package/dist/lib/testing/storyboard/index.js +3 -2
  37. package/dist/lib/testing/storyboard/index.js.map +1 -1
  38. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  39. package/dist/lib/testing/storyboard/probes.js +3 -0
  40. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  41. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  42. package/dist/lib/testing/storyboard/runner.js +294 -29
  43. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  44. package/dist/lib/testing/storyboard/types.d.ts +59 -0
  45. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  46. package/dist/lib/testing/storyboard/types.js.map +1 -1
  47. package/dist/lib/testing/storyboard/validations.d.ts +4 -3
  48. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  49. package/dist/lib/testing/storyboard/validations.js +26 -2
  50. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  51. package/dist/lib/types/activate-signal.d.ts +647 -0
  52. package/dist/lib/types/build-creative.d.ts +2105 -0
  53. package/dist/lib/types/calibrate-content.d.ts +675 -0
  54. package/dist/lib/types/check-governance.d.ts +619 -0
  55. package/dist/lib/types/comply-test-controller.d.ts +8428 -0
  56. package/dist/lib/types/core.generated.d.ts +180 -252
  57. package/dist/lib/types/core.generated.d.ts.map +1 -1
  58. package/dist/lib/types/core.generated.js +1 -1
  59. package/dist/lib/types/create-collection-list.d.ts +693 -0
  60. package/dist/lib/types/create-content-standards.d.ts +830 -0
  61. package/dist/lib/types/create-media-buy.d.ts +3374 -0
  62. package/dist/lib/types/create-property-list.d.ts +836 -0
  63. package/dist/lib/types/delete-collection-list.d.ts +497 -0
  64. package/dist/lib/types/delete-property-list.d.ts +497 -0
  65. package/dist/lib/types/get-account-financials.d.ts +624 -0
  66. package/dist/lib/types/get-adcp-capabilities.d.ts +2863 -0
  67. package/dist/lib/types/get-collection-list.d.ts +763 -0
  68. package/dist/lib/types/get-content-standards.d.ts +919 -0
  69. package/dist/lib/types/get-creative-delivery.d.ts +2219 -0
  70. package/dist/lib/types/get-creative-features.d.ts +1736 -0
  71. package/dist/lib/types/get-media-buy-artifacts.d.ts +864 -0
  72. package/dist/lib/types/get-media-buys.d.ts +1670 -0
  73. package/dist/lib/types/get-plan-audit-logs.d.ts +455 -0
  74. package/dist/lib/types/get-products.d.ts +4935 -0
  75. package/dist/lib/types/get-property-list.d.ts +874 -0
  76. package/dist/lib/types/get-signals.d.ts +986 -0
  77. package/dist/lib/types/list-accounts.d.ts +851 -0
  78. package/dist/lib/types/list-content-standards.d.ts +975 -0
  79. package/dist/lib/types/list-creative-formats.d.ts +3132 -0
  80. package/dist/lib/types/list-creatives.d.ts +2390 -0
  81. package/dist/lib/types/list-property-lists.d.ts +855 -0
  82. package/dist/lib/types/log-event.d.ts +373 -0
  83. package/dist/lib/types/per-tool-index.json +391 -0
  84. package/dist/lib/types/preview-creative.d.ts +1981 -0
  85. package/dist/lib/types/provide-performance-feedback.d.ts +218 -0
  86. package/dist/lib/types/report-plan-outcome.d.ts +433 -0
  87. package/dist/lib/types/report-usage.d.ts +579 -0
  88. package/dist/lib/types/schemas.generated.d.ts +127279 -125067
  89. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  90. package/dist/lib/types/schemas.generated.js +221 -293
  91. package/dist/lib/types/schemas.generated.js.map +1 -1
  92. package/dist/lib/types/si-get-offering.d.ts +259 -0
  93. package/dist/lib/types/si-initiate-session.d.ts +372 -0
  94. package/dist/lib/types/si-send-message.d.ts +300 -0
  95. package/dist/lib/types/si-terminate-session.d.ts +213 -0
  96. package/dist/lib/types/sync-accounts.d.ts +856 -0
  97. package/dist/lib/types/sync-audiences.d.ts +707 -0
  98. package/dist/lib/types/sync-catalogs.d.ts +766 -0
  99. package/dist/lib/types/sync-creatives.d.ts +2134 -0
  100. package/dist/lib/types/sync-event-sources.d.ts +665 -0
  101. package/dist/lib/types/sync-governance.d.ts +558 -0
  102. package/dist/lib/types/sync-plans.d.ts +979 -0
  103. package/dist/lib/types/update-collection-list.d.ts +697 -0
  104. package/dist/lib/types/update-content-standards.d.ts +847 -0
  105. package/dist/lib/types/update-media-buy.d.ts +3047 -0
  106. package/dist/lib/types/update-property-list.d.ts +840 -0
  107. package/dist/lib/types/validate-content-delivery.d.ts +722 -0
  108. package/dist/lib/types/validate-input.d.ts +1683 -0
  109. package/dist/lib/utils/response-schemas.js +1 -1
  110. package/dist/lib/utils/response-schemas.js.map +1 -1
  111. package/dist/lib/utils/response-unwrapper.d.ts.map +1 -1
  112. package/dist/lib/utils/response-unwrapper.js +18 -3
  113. package/dist/lib/utils/response-unwrapper.js.map +1 -1
  114. package/dist/lib/version.d.ts +3 -3
  115. package/dist/lib/version.js +3 -3
  116. package/examples/error-compliant-server.ts +1 -1
  117. package/examples/hello_seller_adapter_guaranteed.ts +8 -3
  118. package/examples/hello_seller_adapter_multi_tenant.ts +27 -23
  119. package/examples/hello_seller_adapter_non_guaranteed.ts +7 -3
  120. package/examples/hello_seller_adapter_proposal_mode.ts +22 -6
  121. package/examples/hello_signals_adapter_marketplace.ts +34 -3
  122. package/package.json +9 -2
@@ -0,0 +1,766 @@
1
+ // AUTO-GENERATED — DO NOT EDIT.
2
+ // Per-tool .d.ts slice for `sync_catalogs`. Built from the published
3
+ // `tools.generated.d.ts` + `core.generated.d.ts` + `enums.generated.d.ts`
4
+ // by `scripts/generate-per-tool-types.ts`.
5
+ //
6
+ // Self-contained: imports nothing from the broader SDK. Adopters who
7
+ // import only this slice pay a fraction of the tsc cost of pulling in
8
+ // `@adcp/sdk` root — useful when strict + skipLibCheck:false adopters
9
+ // hit memory pressure on the full surface.
10
+
11
+ /**
12
+ * Request parameters for syncing catalog feeds with upsert semantics. Supports bulk operations across multiple catalog types (products, inventory, stores, promotions, offerings). Existing catalogs matched by catalog_id are updated, new ones are created. When catalogs is omitted, the call is discovery-only: returns all catalogs on the account without modification.
13
+ */
14
+ export interface SyncCatalogsRequest {
15
+ /**
16
+ * 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.
17
+ */
18
+ adcp_version?: string;
19
+ /**
20
+ * 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.
21
+ */
22
+ adcp_major_version?: number;
23
+ /**
24
+ * Client-generated unique key for at-most-once execution. `catalog_id` gives resource-level dedup per catalog, but the sync envelope emits audit events and triggers platform review for large feeds — this key prevents those side effects from firing twice on retry. Also serves as a request ID on discovery-only calls (when `catalogs` is omitted). MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.
25
+ * @minLength 16
26
+ * @maxLength 255
27
+ * @pattern ^[A-Za-z0-9_.:-]{16,255}$
28
+ */
29
+ idempotency_key: string;
30
+ account: AccountReference;
31
+ /**
32
+ * Array of catalog feeds to sync (create or update). When omitted, the call is discovery-only and returns all existing catalogs on the account without modification.
33
+ */
34
+ catalogs?: Catalog[];
35
+ /**
36
+ * Optional filter to limit sync scope to specific catalog IDs. When provided, only these catalogs will be created/updated. Other catalogs on the account are unaffected.
37
+ */
38
+ catalog_ids?: string[];
39
+ /**
40
+ * When true, buyer-managed catalogs on the account not included in this sync will be removed. Does not affect seller-managed catalogs. Do not combine with an omitted catalogs array or all buyer-managed catalogs will be deleted.
41
+ */
42
+ delete_missing?: boolean;
43
+ /**
44
+ * When true, preview changes without applying them. Returns what would be created/updated/deleted.
45
+ */
46
+ dry_run?: boolean;
47
+ validation_mode?: ValidationMode;
48
+ push_notification_config?: PushNotificationConfig;
49
+ context?: ContextObject;
50
+ ext?: ExtensionObject;
51
+ }
52
+
53
+ /**
54
+ * Response from catalog sync operation. Exactly one of three shapes: (1) synchronous success — per-catalog results in the catalogs array (best-effort processing, may include per-catalog failures); (2) terminal failure — errors array with no catalogs processed; (3) submitted task envelope — status 'submitted' with task_id when the whole operation is queued (e.g., batch catalog ingestion and deduplication). The submitted branch MAY carry advisory errors for non-blocking warnings; terminal failures belong in the error branch. These three shapes are mutually exclusive — a response has exactly one. Platforms may approve, reject, or flag individual items within each catalog (similar to Google Merchant Center product review).
55
+ */
56
+ export type SyncCatalogsResponse = {
57
+ /**
58
+ * Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context. Distinct from `context` (per-request opaque echo, see below).
59
+ */
60
+ context_id?: string;
61
+ context?: ContextObject;
62
+ /**
63
+ * Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.
64
+ */
65
+ task_id?: string;
66
+ status: TaskStatus;
67
+ /**
68
+ * 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.
69
+ */
70
+ message?: string;
71
+ /**
72
+ * ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.
73
+ */
74
+ timestamp?: string;
75
+ /**
76
+ * 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. From 3.1 onward, `replayed` MAY appear on responses to any request that resolved via the idempotency cache, including read tools — universal `idempotency_key` (see security.mdx §Idempotency) means the cache holds read responses too.
77
+ */
78
+ replayed?: boolean;
79
+ adcp_error?: Error;
80
+ push_notification_config?: PushNotificationConfig;
81
+ /**
82
+ * Governance context token issued by the account's governance agent during check_governance. Buyers attach it to governed purchase requests (media buys, rights acquisitions, signal activations, creative services); sellers persist it and include it on all subsequent governance calls for that action's lifecycle. An account binds to one governance agent (see sync_governance); governance is phased across `purchase` / `modification` / `delivery`, not partitioned across specialist agents, so the envelope carries a single token for the full lifecycle.
83
+ *
84
+ * Value format: governance agents MUST emit a compact JWS per the AdCP JWS profile (see Security — Signed Governance Context). Sellers MAY verify; sellers that do not verify MUST persist and forward the token unchanged. In 3.1 all sellers MUST verify. Non-JWS values from pre-3.0 governance agents are deprecated.
85
+ *
86
+ * This is the primary correlation key for audit and reporting across the governance lifecycle.
87
+ */
88
+ governance_context?: string;
89
+ /**
90
+ * 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.
91
+ */
92
+ payload?: {};
93
+ /**
94
+ * 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.
95
+ */
96
+ adcp_version?: string;
97
+ /**
98
+ * 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.
99
+ */
100
+ adcp_major_version?: number;
101
+ } & (SyncCatalogsSuccess | SyncCatalogsError | SyncCatalogsSubmitted);
102
+
103
+ /**
104
+ * Success response - sync operation processed catalogs (may include per-catalog failures)
105
+ */
106
+ export interface SyncCatalogsSuccess {
107
+ /**
108
+ * Whether this was a dry run (no actual changes made)
109
+ */
110
+ dry_run?: boolean;
111
+ /**
112
+ * Results for each catalog processed. Items with action='failed' indicate per-catalog validation/processing failures, not operation-level failures.
113
+ */
114
+ catalogs: {
115
+ /**
116
+ * Catalog ID from the request
117
+ */
118
+ catalog_id: string;
119
+ action: CatalogAction;
120
+ /**
121
+ * Platform-specific ID assigned to the catalog
122
+ */
123
+ platform_id?: string;
124
+ /**
125
+ * Total number of items in the catalog after sync. Required when action is 'created', 'updated', or 'unchanged'. Omitted on 'failed' and 'deleted'.
126
+ * @minimum 0
127
+ */
128
+ item_count?: number;
129
+ /**
130
+ * Number of items approved by the platform. Populated when the platform performs item-level review.
131
+ * @minimum 0
132
+ */
133
+ items_approved?: number;
134
+ /**
135
+ * Number of items pending platform review. Common for product catalogs where items must pass content policy checks.
136
+ * @minimum 0
137
+ */
138
+ items_pending?: number;
139
+ /**
140
+ * Number of items rejected by the platform. Check item_issues for rejection reasons.
141
+ * @minimum 0
142
+ */
143
+ items_rejected?: number;
144
+ /**
145
+ * Per-item issues reported by the platform (rejections, warnings). Only present when the platform performs item-level review.
146
+ */
147
+ item_issues?: {
148
+ /**
149
+ * ID of the catalog item with an issue
150
+ */
151
+ item_id: string;
152
+ status: CatalogItemStatus;
153
+ /**
154
+ * Reasons for rejection or warning
155
+ */
156
+ reasons?: string[];
157
+ }[];
158
+ /**
159
+ * ISO 8601 timestamp of when the most recent sync was accepted by the platform
160
+ * @format date-time
161
+ */
162
+ last_synced_at?: string;
163
+ /**
164
+ * ISO 8601 timestamp of when the platform will next fetch the feed URL. Only present for URL-based catalogs with update_frequency.
165
+ * @format date-time
166
+ */
167
+ next_fetch_at?: string;
168
+ /**
169
+ * Field names that were modified (only present when action='updated')
170
+ */
171
+ changes?: string[];
172
+ /**
173
+ * Validation or processing errors (only present when action='failed')
174
+ */
175
+ errors?: Error[];
176
+ /**
177
+ * Non-fatal warnings about this catalog
178
+ */
179
+ warnings?: string[];
180
+ }[];
181
+ /**
182
+ * When true, this response contains simulated data from sandbox mode.
183
+ */
184
+ sandbox?: boolean;
185
+ context?: ContextObject;
186
+ ext?: ExtensionObject;
187
+ }
188
+
189
+ /**
190
+ * Error response - operation failed completely, no catalogs were processed
191
+ */
192
+ export interface SyncCatalogsError {
193
+ /**
194
+ * Operation-level errors that prevented processing any catalogs (e.g., authentication failure, service unavailable, invalid request format)
195
+ */
196
+ errors: Error[];
197
+ context?: ContextObject;
198
+ ext?: ExtensionObject;
199
+ }
200
+
201
+ /**
202
+ * Async task envelope returned when sync_catalogs cannot be confirmed before the response — for example, when catalog ingestion and deduplication are queued for batch processing. The buyer polls tasks/get with task_id or receives a webhook when the task completes; the per-catalog results land on the completion artifact, not this envelope.
203
+ */
204
+ export interface SyncCatalogsSubmitted {
205
+ /**
206
+ * 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.
207
+ */
208
+ status: 'submitted';
209
+ /**
210
+ * Task handle the buyer uses with tasks/get, and that the seller references on push-notification callbacks. Per AdCP wire conventions this is snake_case; A2A adapters MAY surface it as taskId, but the payload field emitted by the agent is task_id.
211
+ */
212
+ task_id: string;
213
+ /**
214
+ * 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.
215
+ * @maxLength 2000
216
+ */
217
+ message?: string;
218
+ /**
219
+ * 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.
220
+ */
221
+ errors?: Error[];
222
+ context?: ContextObject;
223
+ ext?: ExtensionObject;
224
+ }
225
+
226
+ /**
227
+ * Account for product lookup. Returns products with pricing specific to this account's rate card.
228
+ */
229
+ export type AccountReference = {
230
+ /**
231
+ * Seller-assigned account identifier (from sync_accounts or list_accounts)
232
+ */
233
+ account_id: string;
234
+ } | {
235
+ brand: BrandReference;
236
+ /**
237
+ * Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.
238
+ * @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
239
+ */
240
+ operator: string;
241
+ /**
242
+ * When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).
243
+ */
244
+ sandbox?: boolean;
245
+ };
246
+
247
+ /**
248
+ * Legacy authentication schemes for the webhook auth block. Bearer: token sent in Authorization header. HMAC-SHA256: legacy shared-secret signing. Both are deprecated; new integrations SHOULD omit the authentication block and use the RFC 9421 webhook signing profile (applicable on schemas where authentication is optional). Removed in AdCP 4.0.
249
+ */
250
+ export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
251
+
252
+ /**
253
+ * Brand identifier within the house portfolio. Optional for single-brand domains.
254
+ */
255
+ export type BrandID = string;
256
+
257
+ /**
258
+ * Brand reference for product discovery context. Resolved to full brand identity at execution time.
259
+ */
260
+ export interface BrandReference {
261
+ /**
262
+ * Domain where /.well-known/brand.json is hosted, or the brand's operating domain
263
+ * @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
264
+ */
265
+ domain: string;
266
+ brand_id?: BrandID;
267
+ /**
268
+ * Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.
269
+ */
270
+ industries?: string[];
271
+ /**
272
+ * Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand → house → missing.
273
+ */
274
+ data_subject_contestation?: {
275
+ [k: string]: unknown | undefined;
276
+ };
277
+ /**
278
+ * Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call — e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` — the inline override is intentionally narrow to a small high-traffic subset.
279
+ *
280
+ * **Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently — when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently — a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.
281
+ */
282
+ brand_kit_override?: {
283
+ logo?: ImageAsset;
284
+ /**
285
+ * Override brand colors (hex strings).
286
+ */
287
+ colors?: {
288
+ /**
289
+ * @pattern ^#[0-9a-fA-F]{6}$
290
+ */
291
+ primary?: string;
292
+ /**
293
+ * @pattern ^#[0-9a-fA-F]{6}$
294
+ */
295
+ secondary?: string;
296
+ /**
297
+ * @pattern ^#[0-9a-fA-F]{6}$
298
+ */
299
+ accent?: string;
300
+ };
301
+ /**
302
+ * Override brand-voice description for surface-composed text/audio output.
303
+ */
304
+ voice?: string;
305
+ /**
306
+ * Override tagline.
307
+ */
308
+ tagline?: string;
309
+ };
310
+ }
311
+
312
+ /**
313
+ * C2PA action classification for this watermark
314
+ */
315
+ export type C2PAWatermarkAction = 'c2pa.watermarked.bound' | 'c2pa.watermarked.unbound';
316
+
317
+ /**
318
+ * Catalog of items the buyer wants to promote. The seller matches catalog items against its inventory and returns products where matches exist. Supports all catalog types: a job catalog finds job ad products, a product catalog finds sponsored product slots. Reference a synced catalog by catalog_id, or provide inline items.
319
+ */
320
+ export interface Catalog {
321
+ /**
322
+ * Buyer's identifier for this catalog. Required when syncing via sync_catalogs. When used in creatives, references a previously synced catalog on the account.
323
+ */
324
+ catalog_id?: string;
325
+ /**
326
+ * Human-readable name for this catalog (e.g., 'Summer Products 2025', 'Amsterdam Store Locations').
327
+ */
328
+ name?: string;
329
+ type: CatalogType;
330
+ /**
331
+ * URL to an external catalog feed. The platform fetches and resolves items from this URL. For offering-type catalogs, the feed contains an array of Offering objects. For other types, the feed format is determined by feed_format. When omitted with type 'product', the platform uses its synced copy of the brand's product catalog.
332
+ */
333
+ url?: string;
334
+ feed_format?: FeedFormat;
335
+ update_frequency?: UpdateFrequency;
336
+ /**
337
+ * Inline catalog data. The item schema depends on the catalog type: Offering objects for 'offering', StoreItem for 'store', HotelItem for 'hotel', FlightItem for 'flight', JobItem for 'job', VehicleItem for 'vehicle', RealEstateItem for 'real_estate', EducationItem for 'education', DestinationItem for 'destination', AppItem for 'app', or freeform objects for 'product', 'inventory', and 'promotion'. Mutually exclusive with url — provide one or the other, not both. Implementations should validate items against the type-specific schema.
338
+ */
339
+ items?: {}[];
340
+ /**
341
+ * Filter catalog to specific item IDs. For offering-type catalogs, these are offering_id values. For product-type catalogs, these are SKU identifiers.
342
+ */
343
+ ids?: string[];
344
+ /**
345
+ * Filter product-type catalogs by GTIN identifiers for cross-retailer catalog matching. Accepts standard GTIN formats (GTIN-8, UPC-A/GTIN-12, EAN-13/GTIN-13, GTIN-14). Only applicable when type is 'product'.
346
+ */
347
+ gtins?: string[];
348
+ /**
349
+ * Filter catalog to items with these tags. Tags are matched using OR logic — items matching any tag are included.
350
+ */
351
+ tags?: string[];
352
+ /**
353
+ * Filter catalog to items in this category (e.g., 'beverages/soft-drinks', 'chef-positions').
354
+ */
355
+ category?: string;
356
+ /**
357
+ * Natural language filter for catalog items (e.g., 'all pasta sauces under $5', 'amsterdam vacancies').
358
+ */
359
+ query?: string;
360
+ /**
361
+ * Event types that represent conversions for items in this catalog. Declares what events the platform should attribute to catalog items — e.g., a job catalog converts via submit_application, a product catalog via purchase. The event's content_ids field carries the item IDs that connect back to catalog items. Use content_id_type to declare what identifier type content_ids values represent.
362
+ */
363
+ conversion_events?: EventType[];
364
+ content_id_type?: ContentIDType;
365
+ /**
366
+ * Declarative normalization rules for external feeds. Maps non-standard feed field names, date formats, price encodings, and image URLs to the AdCP catalog item schema. Applied during sync_catalogs ingestion. Supports field renames, named transforms (date, divide, boolean, split), static literal injection, and assignment of image URLs to typed asset pools.
367
+ */
368
+ feed_field_mappings?: CatalogFieldMapping[];
369
+ }
370
+
371
+ /**
372
+ * Action taken for this catalog
373
+ */
374
+ export type CatalogAction = 'created' | 'updated' | 'unchanged' | 'failed' | 'deleted';
375
+
376
+ /**
377
+ * Declares how a field in an external feed maps to the AdCP catalog item schema. Used in sync_catalogs feed_field_mappings to normalize non-AdCP feeds (Google Merchant Center, LinkedIn Jobs XML, hotel XML, etc.) to the standard catalog item schema without requiring the buyer to preprocess every feed. Multiple mappings can assemble a nested object via dot notation (e.g., separate mappings for price.amount and price.currency).
378
+ */
379
+ export interface CatalogFieldMapping {
380
+ /**
381
+ * Field name in the external feed record. Omit when injecting a static literal value (use the value property instead).
382
+ */
383
+ feed_field?: string;
384
+ /**
385
+ * Target field on the catalog item schema, using dot notation for nested fields (e.g., 'name', 'price.amount', 'location.city'). Mutually exclusive with asset_group_id.
386
+ */
387
+ catalog_field?: string;
388
+ /**
389
+ * Places the feed field value (a URL) into a typed asset pool on the catalog item's assets array. The value is wrapped as an image or video asset in a group with this ID. Use standard group IDs: 'images_landscape', 'images_vertical', 'images_square', 'logo', 'video'. Mutually exclusive with catalog_field.
390
+ */
391
+ asset_group_id?: string;
392
+ /**
393
+ * Static literal value to inject into catalog_field for every item, regardless of what the feed contains. Mutually exclusive with feed_field. Useful for fields the feed omits (e.g., currency when price is always USD, or a constant category value).
394
+ */
395
+ value?: unknown;
396
+ /**
397
+ * Named transform to apply to the feed field value before writing to the catalog schema. See transform-specific parameters (format, timezone, by, separator).
398
+ */
399
+ transform?: 'date' | 'divide' | 'boolean' | 'split';
400
+ /**
401
+ * For transform 'date': the input date format string (e.g., 'YYYYMMDD', 'MM/DD/YYYY', 'DD-MM-YYYY'). Output is always ISO 8601 (e.g., '2025-03-01'). Uses Unicode date pattern tokens.
402
+ */
403
+ format?: string;
404
+ /**
405
+ * For transform 'date': the timezone of the input value. IANA timezone identifier (e.g., 'UTC', 'America/New_York', 'Europe/Amsterdam'). Defaults to UTC when omitted.
406
+ */
407
+ timezone?: string;
408
+ /**
409
+ * For transform 'divide': the divisor to apply (e.g., 100 to convert integer cents to decimal dollars).
410
+ */
411
+ by?: number;
412
+ /**
413
+ * For transform 'split': the separator character or string to split on. Defaults to ','.
414
+ */
415
+ separator?: string;
416
+ /**
417
+ * Fallback value to use when feed_field is absent, null, or empty. Applied after any transform would have been applied. Allows optional feed fields to have a guaranteed baseline value.
418
+ */
419
+ default?: unknown;
420
+ ext?: ExtensionObject;
421
+ }
422
+
423
+ /**
424
+ * Item review status
425
+ */
426
+ export type CatalogItemStatus = 'approved' | 'pending' | 'rejected' | 'warning' | 'withdrawn';
427
+
428
+ /**
429
+ * Catalog type. Structural types: 'offering' (AdCP Offering objects), 'product' (ecommerce entries), 'inventory' (stock per location), 'store' (physical locations), 'promotion' (deals and pricing). Vertical types: 'hotel', 'flight', 'job', 'vehicle', 'real_estate', 'education', 'destination', 'app' — each with an industry-specific item schema.
430
+ */
431
+ export type CatalogType = 'offering' | 'product' | 'inventory' | 'store' | 'promotion' | 'hotel' | 'flight' | 'job' | 'vehicle' | 'real_estate' | 'education' | 'destination' | 'app';
432
+
433
+ /**
434
+ * Identifier type that the event's content_ids field should be matched against for items in this catalog. For example, 'gtin' means content_ids values are Global Trade Item Numbers, 'sku' means retailer SKUs. Omit when using a custom identifier scheme not listed in the enum.
435
+ */
436
+ export type ContentIDType = 'sku' | 'gtin' | 'offering_id' | 'job_id' | 'hotel_id' | 'flight_id' | 'vehicle_id' | 'listing_id' | 'store_id' | 'program_id' | 'destination_id' | 'app_id';
437
+
438
+ /**
439
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
440
+ */
441
+ export interface ContextObject {
442
+ }
443
+
444
+ /**
445
+ * IPTC-aligned classification of AI involvement in producing this content
446
+ */
447
+ export type DigitalSourceType = 'digital_capture' | 'digital_creation' | 'trained_algorithmic_media' | 'composite_with_trained_algorithmic_media' | 'algorithmic_media' | 'composite_capture' | 'composite_synthetic' | 'human_edits' | 'data_driven_media';
448
+
449
+ /**
450
+ * How long the disclosure must persist during content playback or display
451
+ */
452
+ export type DisclosurePersistence = 'continuous' | 'initial' | 'flexible';
453
+
454
+ /**
455
+ * Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.
456
+ */
457
+ export type DisclosurePosition = 'prominent' | 'footer' | 'audio' | 'subtitle' | 'overlay' | 'end_card' | 'pre_roll' | 'companion';
458
+
459
+ /**
460
+ * How provenance data is carried within the content
461
+ */
462
+ export type EmbeddedProvenanceMethod = 'manifest_wrapper' | 'provenance_markers';
463
+
464
+ /**
465
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
466
+ */
467
+ export type EventType = 'page_view' | 'view_content' | 'select_content' | 'select_item' | 'search' | 'share' | 'add_to_cart' | 'remove_from_cart' | 'viewed_cart' | 'add_to_wishlist' | 'initiate_checkout' | 'add_payment_info' | 'purchase' | 'refund' | 'lead' | 'qualify_lead' | 'close_convert_lead' | 'disqualify_lead' | 'complete_registration' | 'subscribe' | 'start_trial' | 'app_install' | 'app_launch' | 'contact' | 'schedule' | 'donate' | 'submit_application' | 'custom';
468
+
469
+ /**
470
+ * Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.
471
+ */
472
+ export interface ExtensionObject {
473
+ }
474
+
475
+ /**
476
+ * Format of the external feed at url. Required when url points to a non-AdCP feed (e.g., Google Merchant Center XML, Meta Product Catalog). Omit for offering-type catalogs where the feed is native AdCP JSON.
477
+ */
478
+ export type FeedFormat = 'google_merchant_center' | 'facebook_catalog' | 'shopify' | 'linkedin_jobs' | 'custom';
479
+
480
+ /**
481
+ * Override logo asset.
482
+ */
483
+ export interface ImageAsset {
484
+ /**
485
+ * Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry.
486
+ */
487
+ asset_type: 'image';
488
+ /**
489
+ * URL to the image asset
490
+ */
491
+ url: string;
492
+ /**
493
+ * Width in pixels
494
+ * @minimum 1
495
+ */
496
+ width: number;
497
+ /**
498
+ * Height in pixels
499
+ * @minimum 1
500
+ */
501
+ height: number;
502
+ /**
503
+ * Image file format (jpg, png, gif, webp, etc.)
504
+ */
505
+ format?: string;
506
+ /**
507
+ * Alternative text for accessibility
508
+ */
509
+ alt_text?: string;
510
+ provenance?: Provenance;
511
+ }
512
+
513
+ /**
514
+ * Provenance metadata for this asset, overrides manifest-level provenance
515
+ */
516
+ export interface Provenance {
517
+ digital_source_type?: DigitalSourceType;
518
+ /**
519
+ * AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.
520
+ */
521
+ ai_tool?: {
522
+ /**
523
+ * Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')
524
+ */
525
+ name: string;
526
+ /**
527
+ * Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.
528
+ */
529
+ version?: string;
530
+ /**
531
+ * Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')
532
+ */
533
+ provider?: string;
534
+ };
535
+ /**
536
+ * Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` — the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.
537
+ */
538
+ human_oversight?: 'none' | 'prompt_only' | 'selected' | 'edited' | 'directed';
539
+ /**
540
+ * Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.
541
+ */
542
+ declared_by?: {
543
+ /**
544
+ * URL of the agent or service that declared this provenance
545
+ */
546
+ agent_url?: string;
547
+ /**
548
+ * Role of the declaring party in the supply chain
549
+ */
550
+ role: 'creator' | 'advertiser' | 'agency' | 'platform' | 'tool';
551
+ };
552
+ /**
553
+ * When this provenance claim was made (ISO 8601). Distinct from created_time, which records when the content itself was produced. A provenance claim may be attached well after content creation, for example when retroactively declaring AI involvement for regulatory compliance.
554
+ * @format date-time
555
+ */
556
+ declared_at?: string;
557
+ /**
558
+ * When this content was created or generated (ISO 8601)
559
+ * @format date-time
560
+ */
561
+ created_time?: string;
562
+ /**
563
+ * C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.
564
+ */
565
+ c2pa?: {
566
+ /**
567
+ * URL to the C2PA manifest store for this content
568
+ */
569
+ manifest_url: string;
570
+ };
571
+ /**
572
+ * Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).
573
+ */
574
+ embedded_provenance?: {
575
+ method: EmbeddedProvenanceMethod;
576
+ /**
577
+ * Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)
578
+ */
579
+ standard?: string;
580
+ /**
581
+ * Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context — not a wire identifier.
582
+ */
583
+ provider: string;
584
+ /**
585
+ * Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing — the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).
586
+ */
587
+ verify_agent?: {
588
+ /**
589
+ * URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed.
590
+ * @pattern ^https:\/\/
591
+ */
592
+ agent_url: string;
593
+ /**
594
+ * Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.
595
+ */
596
+ feature_id?: string;
597
+ };
598
+ /**
599
+ * When the provenance data was embedded (ISO 8601)
600
+ * @format date-time
601
+ */
602
+ embedded_at?: string;
603
+ }[];
604
+ /**
605
+ * Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).
606
+ */
607
+ watermarks?: {
608
+ media_type: WatermarkMediaType;
609
+ /**
610
+ * Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context — not a wire identifier.
611
+ */
612
+ provider: string;
613
+ /**
614
+ * Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing — the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).
615
+ */
616
+ verify_agent?: {
617
+ /**
618
+ * URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed.
619
+ * @pattern ^https:\/\/
620
+ */
621
+ agent_url: string;
622
+ /**
623
+ * Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.
624
+ */
625
+ feature_id?: string;
626
+ };
627
+ c2pa_action?: C2PAWatermarkAction;
628
+ /**
629
+ * When the watermark was applied (ISO 8601)
630
+ * @format date-time
631
+ */
632
+ embedded_at?: string;
633
+ }[];
634
+ /**
635
+ * Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.
636
+ */
637
+ disclosure?: {
638
+ /**
639
+ * The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain — useful as a routing and audit input — not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover.
640
+ */
641
+ required: boolean;
642
+ /**
643
+ * Jurisdictions where disclosure obligations apply
644
+ */
645
+ jurisdictions?: {
646
+ /**
647
+ * ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')
648
+ */
649
+ country: string;
650
+ /**
651
+ * Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)
652
+ */
653
+ region?: string;
654
+ /**
655
+ * Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')
656
+ */
657
+ regulation: string;
658
+ /**
659
+ * Required disclosure label text for this jurisdiction, in the local language
660
+ */
661
+ label_text?: string;
662
+ /**
663
+ * How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.
664
+ */
665
+ render_guidance?: {
666
+ persistence?: DisclosurePersistence;
667
+ /**
668
+ * Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial — without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.
669
+ * @minimum 1
670
+ */
671
+ min_duration_ms?: number;
672
+ /**
673
+ * Preferred disclosure positions in priority order. The first position a format supports should be used.
674
+ */
675
+ positions?: DisclosurePosition[];
676
+ ext?: ExtensionObject;
677
+ };
678
+ }[];
679
+ };
680
+ /**
681
+ * Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.
682
+ */
683
+ verification?: {
684
+ /**
685
+ * Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')
686
+ */
687
+ verified_by: string;
688
+ /**
689
+ * When the verification was performed (ISO 8601)
690
+ * @format date-time
691
+ */
692
+ verified_time?: string;
693
+ /**
694
+ * Verification outcome
695
+ */
696
+ result: 'authentic' | 'ai_generated' | 'ai_modified' | 'inconclusive';
697
+ /**
698
+ * Confidence score of the verification result (0.0 to 1.0)
699
+ * @minimum 0
700
+ * @maximum 1
701
+ */
702
+ confidence?: number;
703
+ /**
704
+ * URL to the full verification report
705
+ */
706
+ details_url?: string;
707
+ }[];
708
+ ext?: ExtensionObject;
709
+ }
710
+
711
+ /**
712
+ * Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks.
713
+ */
714
+ export interface PushNotificationConfig {
715
+ /**
716
+ * Webhook endpoint URL for task status notifications. The wire contract is unconstrained beyond `format: "uri"` — in particular, publishers SHOULD NOT enforce a destination-port allowlist by default, since buyers legitimately host receivers on non-standard TLS ports (`:9443`, `:4443`, path-routed multi-tenant gateways). The SSRF guard the protocol relies on is the IP-range check + DNS-rebinding-resistant connect pin defined in [Webhook URL validation (SSRF)](/docs/building/by-layer/L1/security#webhook-url-validation-ssrf), not port filtering. Operators who want a hardened destination-port allowlist as defense-in-depth (e.g., locked-down enterprise egress) opt in explicitly — see [Destination port: permissive by default](/docs/building/by-layer/L1/security#destination-port-permissive-by-default).
717
+ */
718
+ url: string;
719
+ /**
720
+ * Buyer-supplied correlation identifier for the operation that will produce webhooks against this registration. The seller MUST echo this value verbatim into every webhook payload's `operation_id` field (see [`mcp-webhook-payload.json`](/schemas/core/mcp-webhook-payload.json) and [Webhooks — Operation IDs](/docs/building/by-layer/L3/webhooks#operation-ids-and-url-templates)). Buyers SHOULD generate a unique value per task invocation (UUID recommended). This field is the canonical registration channel for `operation_id`; buyers MAY additionally embed the same value in the URL path or query as a routing aid for their own HTTP server, but the URL is opaque to the seller and the wire-level source of truth is this field. Sellers MUST NOT parse the URL to recover `operation_id`. Sellers that receive a webhook registration without `operation_id` MAY reject the task with `INVALID_REQUEST`.
721
+ * @minLength 1
722
+ * @maxLength 255
723
+ * @pattern ^[A-Za-z0-9_.:-]{1,255}$
724
+ */
725
+ operation_id?: string;
726
+ /**
727
+ * Optional client-provided token for webhook validation. The seller MUST echo this value verbatim in every webhook payload's `token` field (see [`mcp-webhook-payload.json`](/schemas/core/mcp-webhook-payload.json) for the receiver-side validation obligation). Length bounds give receivers a defensive range check on the echoed value; senders SHOULD generate tokens with at least 128 bits of entropy (≥22 base64url characters). This is a complementary authenticity mechanism that can layer on top of the RFC 9421 webhook signature — unlike the `authentication` block below, it is not on the 4.0 removal track. Receivers that registered both a signing key (RFC 9421) and a `token` MUST NOT treat a valid token echo as authorization to skip signature verification; both checks remain independent obligations.
728
+ * @minLength 16
729
+ * @maxLength 4096
730
+ */
731
+ token?: string;
732
+ /**
733
+ * Legacy authentication configuration (A2A-compatible). Opts the seller into Bearer or HMAC-SHA256 signing instead of the default RFC 9421 webhook profile. Deprecated; removed in AdCP 4.0. **Precedence is a switch, not a fallback:** presence of this block selects the legacy scheme; absence selects 9421. A seller MUST NOT sign the same webhook both ways, and a buyer MUST NOT attempt 'try 9421 first, fall back to HMAC' verification — signature mode is determined solely by whether this block was present at registration time. The seller's baseline 9421 webhook-signing key published at its brand.json `agents[]` `jwks_uri` does not override this selector; it is always discoverable but only used when `authentication` is omitted. See docs/building/implementation/security.mdx#webhook-callbacks for the full precedence and downgrade-resistance rules (including the `webhook_mode_mismatch` rejection a buyer MUST apply when a received webhook's signing mode does not match the registered mode).
734
+ */
735
+ authentication?: {
736
+ /**
737
+ * Array of authentication schemes. Supported: ['Bearer'] for simple token auth, ['HMAC-SHA256'] for legacy shared-secret signing. Both are deprecated; new integrations SHOULD omit `authentication` and use the RFC 9421 webhook profile.
738
+ */
739
+ schemes: AuthenticationScheme[];
740
+ /**
741
+ * Credentials for the legacy scheme. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.
742
+ * @minLength 32
743
+ */
744
+ credentials: string;
745
+ };
746
+ }
747
+
748
+ /**
749
+ * Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. REQUIRED on every task response envelope. Synchronous tasks (including read-only metadata calls like `get_adcp_capabilities`) MUST emit `status: "completed"`; async tasks emit `submitted`, `working`, `input-required`, etc. per their lifecycle. Agents MUST NOT emit the legacy task_status or response_status fields alongside this field — the status field is the single authoritative task state.
750
+ */
751
+ export type TaskStatus = 'submitted' | 'working' | 'input-required' | 'completed' | 'canceled' | 'failed' | 'rejected' | 'auth-required' | 'unknown';
752
+
753
+ /**
754
+ * How often the platform should re-fetch the feed from url. Only applicable when url is provided. Platforms may use this as a hint for polling schedules.
755
+ */
756
+ export type UpdateFrequency = 'realtime' | 'hourly' | 'daily' | 'weekly';
757
+
758
+ /**
759
+ * Validation strictness. 'strict' fails entire sync on any validation error. 'lenient' processes valid catalogs and reports errors.
760
+ */
761
+ export type ValidationMode = 'strict' | 'lenient';
762
+
763
+ /**
764
+ * Media category of the watermarked content
765
+ */
766
+ export type WatermarkMediaType = 'audio' | 'image' | 'video' | 'text';