@adcp/sdk 8.1.0-beta.7 → 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.
- package/README.md +12 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/types/activate-signal.d.ts +647 -0
- package/dist/lib/types/build-creative.d.ts +2105 -0
- package/dist/lib/types/calibrate-content.d.ts +675 -0
- package/dist/lib/types/check-governance.d.ts +619 -0
- package/dist/lib/types/comply-test-controller.d.ts +8428 -0
- package/dist/lib/types/create-collection-list.d.ts +693 -0
- package/dist/lib/types/create-content-standards.d.ts +830 -0
- package/dist/lib/types/create-media-buy.d.ts +3374 -0
- package/dist/lib/types/create-property-list.d.ts +836 -0
- package/dist/lib/types/delete-collection-list.d.ts +497 -0
- package/dist/lib/types/delete-property-list.d.ts +497 -0
- package/dist/lib/types/get-account-financials.d.ts +624 -0
- package/dist/lib/types/get-adcp-capabilities.d.ts +2863 -0
- package/dist/lib/types/get-collection-list.d.ts +763 -0
- package/dist/lib/types/get-content-standards.d.ts +919 -0
- package/dist/lib/types/get-creative-delivery.d.ts +2219 -0
- package/dist/lib/types/get-creative-features.d.ts +1736 -0
- package/dist/lib/types/get-media-buy-artifacts.d.ts +864 -0
- package/dist/lib/types/get-media-buys.d.ts +1670 -0
- package/dist/lib/types/get-plan-audit-logs.d.ts +455 -0
- package/dist/lib/types/get-products.d.ts +4935 -0
- package/dist/lib/types/get-property-list.d.ts +874 -0
- package/dist/lib/types/get-signals.d.ts +986 -0
- package/dist/lib/types/list-accounts.d.ts +851 -0
- package/dist/lib/types/list-content-standards.d.ts +975 -0
- package/dist/lib/types/list-creative-formats.d.ts +3132 -0
- package/dist/lib/types/list-creatives.d.ts +2390 -0
- package/dist/lib/types/list-property-lists.d.ts +855 -0
- package/dist/lib/types/log-event.d.ts +373 -0
- package/dist/lib/types/per-tool-index.json +391 -0
- package/dist/lib/types/preview-creative.d.ts +1981 -0
- package/dist/lib/types/provide-performance-feedback.d.ts +218 -0
- package/dist/lib/types/report-plan-outcome.d.ts +433 -0
- package/dist/lib/types/report-usage.d.ts +579 -0
- package/dist/lib/types/si-get-offering.d.ts +259 -0
- package/dist/lib/types/si-initiate-session.d.ts +372 -0
- package/dist/lib/types/si-send-message.d.ts +300 -0
- package/dist/lib/types/si-terminate-session.d.ts +213 -0
- package/dist/lib/types/sync-accounts.d.ts +856 -0
- package/dist/lib/types/sync-audiences.d.ts +707 -0
- package/dist/lib/types/sync-catalogs.d.ts +766 -0
- package/dist/lib/types/sync-creatives.d.ts +2134 -0
- package/dist/lib/types/sync-event-sources.d.ts +665 -0
- package/dist/lib/types/sync-governance.d.ts +558 -0
- package/dist/lib/types/sync-plans.d.ts +979 -0
- package/dist/lib/types/update-collection-list.d.ts +697 -0
- package/dist/lib/types/update-content-standards.d.ts +847 -0
- package/dist/lib/types/update-media-buy.d.ts +3047 -0
- package/dist/lib/types/update-property-list.d.ts +840 -0
- package/dist/lib/types/validate-content-delivery.d.ts +722 -0
- package/dist/lib/types/validate-input.d.ts +1683 -0
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +9 -2
|
@@ -0,0 +1,847 @@
|
|
|
1
|
+
// AUTO-GENERATED — DO NOT EDIT.
|
|
2
|
+
// Per-tool .d.ts slice for `update_content_standards`. 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 updating an existing content standards configuration. Creates a new version.
|
|
13
|
+
*/
|
|
14
|
+
export interface UpdateContentStandardsRequest {
|
|
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
|
+
* ID of the standards configuration to update
|
|
25
|
+
*/
|
|
26
|
+
standards_id: string;
|
|
27
|
+
/**
|
|
28
|
+
* Updated scope for where this standards configuration applies
|
|
29
|
+
*/
|
|
30
|
+
scope?: {
|
|
31
|
+
/**
|
|
32
|
+
* ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic).
|
|
33
|
+
*/
|
|
34
|
+
countries_all?: string[];
|
|
35
|
+
/**
|
|
36
|
+
* Advertising channels. Standards apply to ANY of the listed channels (OR logic).
|
|
37
|
+
*/
|
|
38
|
+
channels_any?: MediaChannel[];
|
|
39
|
+
/**
|
|
40
|
+
* BCP 47 language tags (e.g., 'en', 'de', 'fr'). Standards apply to content in ANY of these languages (OR logic). Content in unlisted languages is not covered by these standards.
|
|
41
|
+
*/
|
|
42
|
+
languages_any?: string[];
|
|
43
|
+
/**
|
|
44
|
+
* Human-readable description of this scope
|
|
45
|
+
*/
|
|
46
|
+
description?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Registry policy IDs to use as the evaluation basis. When provided, the agent resolves policies from the registry and uses their policy text and exemplars as the evaluation criteria.
|
|
50
|
+
*/
|
|
51
|
+
registry_policy_ids?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Updated bespoke policies for this content-standards configuration, using the same shape as registry entries. Replaces the existing policies array; use stable policy_ids to track policies across versions. Combines with registry_policy_ids. Bespoke policy_ids MUST be flat (no colons/slashes).
|
|
54
|
+
*/
|
|
55
|
+
policies?: PolicyEntry[];
|
|
56
|
+
/**
|
|
57
|
+
* Updated training/test set to calibrate policy interpretation. Use URL references for pages to be fetched and analyzed, or full artifacts for pre-extracted content.
|
|
58
|
+
*/
|
|
59
|
+
calibration_exemplars?: {
|
|
60
|
+
/**
|
|
61
|
+
* Content that passes the standards
|
|
62
|
+
*/
|
|
63
|
+
pass?: ({
|
|
64
|
+
/**
|
|
65
|
+
* Indicates this is a URL reference
|
|
66
|
+
*/
|
|
67
|
+
type: 'url';
|
|
68
|
+
/**
|
|
69
|
+
* Full URL to a specific page (e.g., 'https://espn.com/nba/story/_/id/12345/lakers-win')
|
|
70
|
+
*/
|
|
71
|
+
value: string;
|
|
72
|
+
/**
|
|
73
|
+
* BCP 47 language tag for content at this URL
|
|
74
|
+
*/
|
|
75
|
+
language?: string;
|
|
76
|
+
} | Artifact)[];
|
|
77
|
+
/**
|
|
78
|
+
* Content that fails the standards
|
|
79
|
+
*/
|
|
80
|
+
fail?: ({
|
|
81
|
+
/**
|
|
82
|
+
* Indicates this is a URL reference
|
|
83
|
+
*/
|
|
84
|
+
type: 'url';
|
|
85
|
+
/**
|
|
86
|
+
* Full URL to a specific page (e.g., 'https://news.example.com/controversial-article')
|
|
87
|
+
*/
|
|
88
|
+
value: string;
|
|
89
|
+
/**
|
|
90
|
+
* BCP 47 language tag for content at this URL
|
|
91
|
+
*/
|
|
92
|
+
language?: string;
|
|
93
|
+
} | Artifact)[];
|
|
94
|
+
};
|
|
95
|
+
context?: ContextObject;
|
|
96
|
+
ext?: ExtensionObject;
|
|
97
|
+
/**
|
|
98
|
+
* 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.
|
|
99
|
+
* @minLength 16
|
|
100
|
+
* @maxLength 255
|
|
101
|
+
* @pattern ^[A-Za-z0-9_.:-]{16,255}$
|
|
102
|
+
*/
|
|
103
|
+
idempotency_key: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Response from updating a content standards configuration
|
|
108
|
+
*/
|
|
109
|
+
export type UpdateContentStandardsResponse = {
|
|
110
|
+
/**
|
|
111
|
+
* 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).
|
|
112
|
+
*/
|
|
113
|
+
context_id?: string;
|
|
114
|
+
context?: ContextObject;
|
|
115
|
+
/**
|
|
116
|
+
* Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.
|
|
117
|
+
*/
|
|
118
|
+
task_id?: string;
|
|
119
|
+
status: TaskStatus;
|
|
120
|
+
/**
|
|
121
|
+
* 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.
|
|
122
|
+
*/
|
|
123
|
+
message?: string;
|
|
124
|
+
/**
|
|
125
|
+
* ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.
|
|
126
|
+
*/
|
|
127
|
+
timestamp?: string;
|
|
128
|
+
/**
|
|
129
|
+
* 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.
|
|
130
|
+
*/
|
|
131
|
+
replayed?: boolean;
|
|
132
|
+
adcp_error?: Error;
|
|
133
|
+
push_notification_config?: PushNotificationConfig;
|
|
134
|
+
/**
|
|
135
|
+
* 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.
|
|
136
|
+
*
|
|
137
|
+
* 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.
|
|
138
|
+
*
|
|
139
|
+
* This is the primary correlation key for audit and reporting across the governance lifecycle.
|
|
140
|
+
*/
|
|
141
|
+
governance_context?: string;
|
|
142
|
+
/**
|
|
143
|
+
* 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.
|
|
144
|
+
*/
|
|
145
|
+
payload?: {};
|
|
146
|
+
/**
|
|
147
|
+
* 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.
|
|
148
|
+
*/
|
|
149
|
+
adcp_version?: string;
|
|
150
|
+
/**
|
|
151
|
+
* 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.
|
|
152
|
+
*/
|
|
153
|
+
adcp_major_version?: number;
|
|
154
|
+
} & (UpdateContentStandardsSuccess | UpdateContentStandardsError);
|
|
155
|
+
|
|
156
|
+
export interface UpdateContentStandardsSuccess {
|
|
157
|
+
/**
|
|
158
|
+
* Indicates the update was applied successfully
|
|
159
|
+
*/
|
|
160
|
+
success: true;
|
|
161
|
+
/**
|
|
162
|
+
* ID of the updated standards configuration
|
|
163
|
+
*/
|
|
164
|
+
standards_id: string;
|
|
165
|
+
context?: ContextObject;
|
|
166
|
+
ext?: ExtensionObject;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface UpdateContentStandardsError {
|
|
170
|
+
/**
|
|
171
|
+
* Indicates the update failed
|
|
172
|
+
*/
|
|
173
|
+
success: false;
|
|
174
|
+
/**
|
|
175
|
+
* Errors that occurred during the update
|
|
176
|
+
*/
|
|
177
|
+
errors: Error[];
|
|
178
|
+
/**
|
|
179
|
+
* If scope change conflicts with another configuration, the ID of the conflicting standards
|
|
180
|
+
*/
|
|
181
|
+
conflicting_standards_id?: string;
|
|
182
|
+
context?: ContextObject;
|
|
183
|
+
ext?: ExtensionObject;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Content artifact for safety and suitability evaluation. An artifact represents content adjacent to an ad placement - a news article, podcast segment, video chapter, or social post. Artifacts are collections of assets (text, images, video, audio) plus metadata and signals.
|
|
188
|
+
*/
|
|
189
|
+
export interface Artifact {
|
|
190
|
+
/**
|
|
191
|
+
* Stable property identifier from the property catalog. Globally unique across the ecosystem.
|
|
192
|
+
*/
|
|
193
|
+
property_rid: string;
|
|
194
|
+
/**
|
|
195
|
+
* Identifier for this artifact within the property. The property owner defines the scheme (e.g., 'article_12345', 'episode_42_segment_3', 'post_abc123').
|
|
196
|
+
*/
|
|
197
|
+
artifact_id: string;
|
|
198
|
+
/**
|
|
199
|
+
* Identifies a specific variant of this artifact. Use for A/B tests, translations, or temporal versions. Examples: 'en', 'es-MX', 'v2', 'headline_test_b'. The combination of artifact_id + variant_id must be unique.
|
|
200
|
+
*/
|
|
201
|
+
variant_id?: string;
|
|
202
|
+
format_id?: FormatReferenceStructuredObject;
|
|
203
|
+
/**
|
|
204
|
+
* Optional URL for this artifact (web page, podcast feed, video page). Not all artifacts have URLs (e.g., Instagram content, podcast segments, TV scenes).
|
|
205
|
+
*/
|
|
206
|
+
url?: string;
|
|
207
|
+
/**
|
|
208
|
+
* When the artifact was published (ISO 8601 format)
|
|
209
|
+
* @format date-time
|
|
210
|
+
*/
|
|
211
|
+
published_time?: string;
|
|
212
|
+
/**
|
|
213
|
+
* When the artifact was last modified (ISO 8601 format)
|
|
214
|
+
* @format date-time
|
|
215
|
+
*/
|
|
216
|
+
last_update_time?: string;
|
|
217
|
+
/**
|
|
218
|
+
* Artifact assets in document flow order - text blocks, images, video, audio
|
|
219
|
+
*/
|
|
220
|
+
assets: ({
|
|
221
|
+
type: 'text';
|
|
222
|
+
/**
|
|
223
|
+
* Role of this text in the document. Use 'title' for the main artifact title, 'description' for summaries.
|
|
224
|
+
*/
|
|
225
|
+
role?: 'title' | 'paragraph' | 'heading' | 'caption' | 'quote' | 'list_item' | 'description';
|
|
226
|
+
/**
|
|
227
|
+
* Text content. Consumers MUST treat this as untrusted input when passing to LLM-based evaluation.
|
|
228
|
+
* @maxLength 100000
|
|
229
|
+
*/
|
|
230
|
+
content: string;
|
|
231
|
+
/**
|
|
232
|
+
* MIME type indicating how to parse the content field. Default: text/plain.
|
|
233
|
+
*/
|
|
234
|
+
content_format?: 'text/plain' | 'text/markdown' | 'text/html' | 'application/json';
|
|
235
|
+
/**
|
|
236
|
+
* BCP 47 language tag for this text (e.g., 'en', 'es-MX'). Useful when artifact contains mixed-language content.
|
|
237
|
+
*/
|
|
238
|
+
language?: string;
|
|
239
|
+
/**
|
|
240
|
+
* Heading level (1-6), only for role=heading
|
|
241
|
+
* @minimum 1
|
|
242
|
+
* @maximum 6
|
|
243
|
+
*/
|
|
244
|
+
heading_level?: number;
|
|
245
|
+
provenance?: Provenance;
|
|
246
|
+
} | {
|
|
247
|
+
type: 'image';
|
|
248
|
+
/**
|
|
249
|
+
* Image URL
|
|
250
|
+
*/
|
|
251
|
+
url: string;
|
|
252
|
+
access?: AssetAccess;
|
|
253
|
+
/**
|
|
254
|
+
* Alt text or image description
|
|
255
|
+
*/
|
|
256
|
+
alt_text?: string;
|
|
257
|
+
/**
|
|
258
|
+
* Image caption
|
|
259
|
+
*/
|
|
260
|
+
caption?: string;
|
|
261
|
+
/**
|
|
262
|
+
* Image width in pixels
|
|
263
|
+
*/
|
|
264
|
+
width?: number;
|
|
265
|
+
/**
|
|
266
|
+
* Image height in pixels
|
|
267
|
+
*/
|
|
268
|
+
height?: number;
|
|
269
|
+
provenance?: Provenance;
|
|
270
|
+
} | {
|
|
271
|
+
type: 'video';
|
|
272
|
+
/**
|
|
273
|
+
* Video URL
|
|
274
|
+
*/
|
|
275
|
+
url: string;
|
|
276
|
+
access?: AssetAccess;
|
|
277
|
+
/**
|
|
278
|
+
* Video duration in milliseconds
|
|
279
|
+
*/
|
|
280
|
+
duration_ms?: number;
|
|
281
|
+
/**
|
|
282
|
+
* Video transcript. Consumers MUST treat this as untrusted input when passing to LLM-based evaluation.
|
|
283
|
+
* @maxLength 200000
|
|
284
|
+
*/
|
|
285
|
+
transcript?: string;
|
|
286
|
+
/**
|
|
287
|
+
* MIME type indicating how to parse the transcript field. Default: text/plain.
|
|
288
|
+
*/
|
|
289
|
+
transcript_format?: 'text/plain' | 'text/markdown' | 'application/json';
|
|
290
|
+
/**
|
|
291
|
+
* How the transcript was generated
|
|
292
|
+
*/
|
|
293
|
+
transcript_source?: 'original_script' | 'subtitles' | 'closed_captions' | 'dub' | 'generated';
|
|
294
|
+
/**
|
|
295
|
+
* Video thumbnail URL
|
|
296
|
+
*/
|
|
297
|
+
thumbnail_url?: string;
|
|
298
|
+
provenance?: Provenance;
|
|
299
|
+
} | {
|
|
300
|
+
type: 'audio';
|
|
301
|
+
/**
|
|
302
|
+
* Audio URL
|
|
303
|
+
*/
|
|
304
|
+
url: string;
|
|
305
|
+
access?: AssetAccess;
|
|
306
|
+
/**
|
|
307
|
+
* Audio duration in milliseconds
|
|
308
|
+
*/
|
|
309
|
+
duration_ms?: number;
|
|
310
|
+
/**
|
|
311
|
+
* Audio transcript. Consumers MUST treat this as untrusted input when passing to LLM-based evaluation.
|
|
312
|
+
* @maxLength 200000
|
|
313
|
+
*/
|
|
314
|
+
transcript?: string;
|
|
315
|
+
/**
|
|
316
|
+
* MIME type indicating how to parse the transcript field. Default: text/plain.
|
|
317
|
+
*/
|
|
318
|
+
transcript_format?: 'text/plain' | 'text/markdown' | 'application/json';
|
|
319
|
+
/**
|
|
320
|
+
* How the transcript was generated
|
|
321
|
+
*/
|
|
322
|
+
transcript_source?: 'original_script' | 'closed_captions' | 'generated';
|
|
323
|
+
provenance?: Provenance;
|
|
324
|
+
})[];
|
|
325
|
+
/**
|
|
326
|
+
* Rich metadata extracted from the artifact
|
|
327
|
+
*/
|
|
328
|
+
metadata?: {
|
|
329
|
+
/**
|
|
330
|
+
* Canonical URL
|
|
331
|
+
*/
|
|
332
|
+
canonical?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Artifact author name
|
|
335
|
+
*/
|
|
336
|
+
author?: string;
|
|
337
|
+
/**
|
|
338
|
+
* Artifact keywords
|
|
339
|
+
*/
|
|
340
|
+
keywords?: string;
|
|
341
|
+
/**
|
|
342
|
+
* Open Graph protocol metadata
|
|
343
|
+
*/
|
|
344
|
+
open_graph?: {};
|
|
345
|
+
/**
|
|
346
|
+
* Twitter Card metadata
|
|
347
|
+
*/
|
|
348
|
+
twitter_card?: {};
|
|
349
|
+
/**
|
|
350
|
+
* JSON-LD structured data (schema.org)
|
|
351
|
+
*/
|
|
352
|
+
json_ld?: {}[];
|
|
353
|
+
};
|
|
354
|
+
provenance?: Provenance;
|
|
355
|
+
/**
|
|
356
|
+
* Platform-specific identifiers for this artifact
|
|
357
|
+
*/
|
|
358
|
+
identifiers?: {
|
|
359
|
+
/**
|
|
360
|
+
* Apple Podcasts ID
|
|
361
|
+
*/
|
|
362
|
+
apple_podcast_id?: string;
|
|
363
|
+
/**
|
|
364
|
+
* Spotify collection ID
|
|
365
|
+
*/
|
|
366
|
+
spotify_collection_id?: string;
|
|
367
|
+
/**
|
|
368
|
+
* Podcast GUID (from RSS feed)
|
|
369
|
+
*/
|
|
370
|
+
podcast_guid?: string;
|
|
371
|
+
/**
|
|
372
|
+
* YouTube video ID
|
|
373
|
+
*/
|
|
374
|
+
youtube_video_id?: string;
|
|
375
|
+
/**
|
|
376
|
+
* RSS feed URL
|
|
377
|
+
*/
|
|
378
|
+
rss_url?: string;
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Authentication for secured URLs
|
|
384
|
+
*/
|
|
385
|
+
export type AssetAccess = {
|
|
386
|
+
method: 'bearer_token';
|
|
387
|
+
/**
|
|
388
|
+
* OAuth2 bearer token for Authorization header
|
|
389
|
+
*/
|
|
390
|
+
token: string;
|
|
391
|
+
} | {
|
|
392
|
+
method: 'service_account';
|
|
393
|
+
/**
|
|
394
|
+
* Cloud provider
|
|
395
|
+
*/
|
|
396
|
+
provider: 'gcp' | 'aws';
|
|
397
|
+
/**
|
|
398
|
+
* Service account credentials
|
|
399
|
+
*/
|
|
400
|
+
credentials?: {};
|
|
401
|
+
} | {
|
|
402
|
+
method: 'signed_url';
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* 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.
|
|
407
|
+
*/
|
|
408
|
+
export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* C2PA action classification for this watermark
|
|
412
|
+
*/
|
|
413
|
+
export type C2PAWatermarkAction = 'c2pa.watermarked.bound' | 'c2pa.watermarked.unbound';
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* 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.
|
|
417
|
+
*/
|
|
418
|
+
export interface ContextObject {
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* IPTC-aligned classification of AI involvement in producing this content
|
|
423
|
+
*/
|
|
424
|
+
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';
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* How long the disclosure must persist during content playback or display
|
|
428
|
+
*/
|
|
429
|
+
export type DisclosurePersistence = 'continuous' | 'initial' | 'flexible';
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* 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.
|
|
433
|
+
*/
|
|
434
|
+
export type DisclosurePosition = 'prominent' | 'footer' | 'audio' | 'subtitle' | 'overlay' | 'end_card' | 'pre_roll' | 'companion';
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* How provenance data is carried within the content
|
|
438
|
+
*/
|
|
439
|
+
export type EmbeddedProvenanceMethod = 'manifest_wrapper' | 'provenance_markers';
|
|
440
|
+
|
|
441
|
+
export interface Exemplar {
|
|
442
|
+
/**
|
|
443
|
+
* A concrete scenario describing an advertising action or configuration.
|
|
444
|
+
*/
|
|
445
|
+
scenario: string;
|
|
446
|
+
/**
|
|
447
|
+
* Why this scenario passes or fails the policy.
|
|
448
|
+
*/
|
|
449
|
+
explanation: string;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* 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.
|
|
454
|
+
*/
|
|
455
|
+
export interface ExtensionObject {
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* A JSON object — never a plain string — that identifies a creative format by its declaring agent and local slug. Required properties: agent_url (URI of the agent that owns the format) and id (slug matching [a-zA-Z0-9_-]+). Example: {"agent_url": "https://creative.adcontextprotocol.org", "id": "display_300x250"}. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants. Using a plain string here is a schema violation.
|
|
460
|
+
*/
|
|
461
|
+
export interface FormatReferenceStructuredObject {
|
|
462
|
+
/**
|
|
463
|
+
* URL of the agent that defines this format (e.g., 'https://creative.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats). Callers comparing two `format-id` values MUST canonicalize `agent_url` per the AdCP URL canonicalization rules before treating two formats as the same. See docs/reference/url-canonicalization.
|
|
464
|
+
*/
|
|
465
|
+
agent_url: string;
|
|
466
|
+
/**
|
|
467
|
+
* Format identifier within the agent's namespace (e.g., 'display_static', 'video_hosted', 'audio_standard'). When used alone, references a template format. When combined with dimension/duration fields, creates a parameterized format ID for a specific variant.
|
|
468
|
+
* @pattern ^[a-zA-Z0-9_-]+$
|
|
469
|
+
*/
|
|
470
|
+
id: string;
|
|
471
|
+
/**
|
|
472
|
+
* Width in pixels for visual formats. When specified, height must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.
|
|
473
|
+
* @minimum 1
|
|
474
|
+
*/
|
|
475
|
+
width?: number;
|
|
476
|
+
/**
|
|
477
|
+
* Height in pixels for visual formats. When specified, width must also be specified. Both fields together create a parameterized format ID for dimension-specific variants.
|
|
478
|
+
* @minimum 1
|
|
479
|
+
*/
|
|
480
|
+
height?: number;
|
|
481
|
+
/**
|
|
482
|
+
* Duration in milliseconds for time-based formats (video, audio). When specified, creates a parameterized format ID. Omit to reference a template format without parameters.
|
|
483
|
+
* @minimum 1
|
|
484
|
+
*/
|
|
485
|
+
duration_ms?: number;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Governance sub-domains that a registry policy applies to. Used to indicate which types of governance agents can evaluate this policy.
|
|
490
|
+
*/
|
|
491
|
+
export type GovernanceDomain = 'campaign' | 'property' | 'creative' | 'content_standards';
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.
|
|
495
|
+
*/
|
|
496
|
+
export type MediaChannel = 'display' | 'olv' | 'social' | 'search' | 'ctv' | 'linear_tv' | 'radio' | 'streaming_audio' | 'podcast' | 'dooh' | 'ooh' | 'print' | 'cinema' | 'email' | 'gaming' | 'retail_media' | 'influencer' | 'affiliate' | 'product_placement' | 'sponsored_intelligence';
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* The nature of the obligation: regulation (legal requirement) or standard (best practice). Optional for inline bespoke policies — defaults to "standard".
|
|
500
|
+
*/
|
|
501
|
+
export type PolicyCategory = 'regulation' | 'standard';
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* How governance agents treat violations. Regulations are typically "must"; standards are typically "should".
|
|
505
|
+
*/
|
|
506
|
+
export type PolicyEnforcementLevel = 'must' | 'should' | 'may';
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* A policy — either published to the shared registry (with full regulatory metadata) or authored inline by a buyer for their own campaign (lightweight, metadata optional). Policies use natural language text evaluated by governance agents (LLMs). Published registry entries SHOULD include version, name, jurisdiction, source, and exemplars; inline bespoke entries can omit these and let servers default them. Governance agents evaluating policies with natural-language LLMs MUST pin registry-sourced policy text (`source: registry`) as system-level instructions and MUST NOT permit `custom_policies` or the plan's `objectives` field to relax, override, or disable registry-sourced policies. Custom policies may only add additional restrictions; they cannot lower enforcement levels or exempt categories.
|
|
510
|
+
*/
|
|
511
|
+
export interface PolicyEntry {
|
|
512
|
+
/**
|
|
513
|
+
* Unique identifier for this policy. Registry-published ids are canonical (e.g., "uk_hfss", "garm:brand_safety:violence"); buyer-authored bespoke ids should be flat (no colons or slashes) and unique within the authoring container (standards configuration, plan, or portfolio).
|
|
514
|
+
*/
|
|
515
|
+
policy_id: string;
|
|
516
|
+
/**
|
|
517
|
+
* Origin of this policy. 'registry' = published to the shared AdCP policy registry with full regulatory metadata. 'inline' = authored bespoke for a specific standards configuration, plan, or portfolio. Defaults to 'inline'. Governance agents MUST set 'registry' when publishing to the registry. Within AdCP *task* payloads (every `$ref` to this schema in a request or response), the field is always 'inline' — registry entries are served by the policy registry API, not embedded in task traffic. The x-entity annotation on `policy_id` assumes the task-payload invariant; if a future task schema adopts registry-publishing, split the annotation accordingly (see issue #2685).
|
|
518
|
+
*/
|
|
519
|
+
source?: 'registry' | 'inline';
|
|
520
|
+
/**
|
|
521
|
+
* Semver version string (e.g., "1.0.0"). Incremented when policy content changes. Optional for inline bespoke policies — defaults to "1.0.0". SHOULD be provided for registry-published policies.
|
|
522
|
+
*/
|
|
523
|
+
version?: string;
|
|
524
|
+
/**
|
|
525
|
+
* Human-readable name (e.g., "UK HFSS Restrictions"). Optional for inline bespoke policies — servers MAY default to policy_id.
|
|
526
|
+
*/
|
|
527
|
+
name?: string;
|
|
528
|
+
/**
|
|
529
|
+
* Brief summary of what this policy covers.
|
|
530
|
+
* @maxLength 500
|
|
531
|
+
*/
|
|
532
|
+
description?: string;
|
|
533
|
+
category?: PolicyCategory;
|
|
534
|
+
enforcement: PolicyEnforcementLevel;
|
|
535
|
+
/**
|
|
536
|
+
* When true, plans subject to this policy MUST set plan.human_review_required = true. Use for policies that mandate human oversight of decisions affecting data subjects — e.g., GDPR Article 22 (solely automated decisions with legal or similarly significant effects) and EU AI Act Annex III high-risk categories (credit, insurance pricing, recruitment, housing allocation). Governance agents MUST escalate any plan action whose resolved policies include requires_human_review: true. Unlike `enforcement`, this flag applies as soon as the policy is resolved — it is NOT gated by `effective_date`. Art 22 GDPR and similar foundational obligations may predate an AI-Act-specific effective date; the human-review requirement fires regardless.
|
|
537
|
+
*/
|
|
538
|
+
requires_human_review?: boolean;
|
|
539
|
+
/**
|
|
540
|
+
* ISO 3166-1 alpha-2 country codes where this policy applies. Empty array means the policy is not jurisdiction-specific.
|
|
541
|
+
*/
|
|
542
|
+
jurisdictions?: string[];
|
|
543
|
+
/**
|
|
544
|
+
* Named groups of jurisdictions for convenience (e.g., {"EU": ["AT","BE","BG",...]}). Governance agents expand aliases when matching against a plan's target jurisdictions.
|
|
545
|
+
*/
|
|
546
|
+
region_aliases?: {
|
|
547
|
+
[k: string]: string[] | undefined;
|
|
548
|
+
};
|
|
549
|
+
/**
|
|
550
|
+
* Regulatory categories this policy belongs to (e.g., ["children_directed", "age_restricted"]). Used for automatic matching against a campaign plan's declared policy_categories. A single policy can belong to multiple categories.
|
|
551
|
+
*/
|
|
552
|
+
policy_categories?: string[];
|
|
553
|
+
/**
|
|
554
|
+
* Advertising channels this policy applies to. If omitted or null, the policy applies to all channels.
|
|
555
|
+
*/
|
|
556
|
+
channels?: MediaChannel[];
|
|
557
|
+
/**
|
|
558
|
+
* Governance sub-domains this policy applies to. Determines which types of governance agents can declare registry:{policy_id} features. For example, a policy with domains ["creative", "property"] can be declared as a feature by both creative and property governance agents.
|
|
559
|
+
*/
|
|
560
|
+
governance_domains?: GovernanceDomain[];
|
|
561
|
+
/**
|
|
562
|
+
* ISO 8601 date when the regulation or standard takes effect. Before this date, governance agents treat the policy as informational (evaluate but do not block). After this date, the policy is enforced at its declared enforcement level.
|
|
563
|
+
* @format date
|
|
564
|
+
*/
|
|
565
|
+
effective_date?: string;
|
|
566
|
+
/**
|
|
567
|
+
* ISO 8601 date when the regulation or standard is no longer enforced. After this date, governance agents stop evaluating this policy. Omit if the policy has no expiration.
|
|
568
|
+
* @format date
|
|
569
|
+
*/
|
|
570
|
+
sunset_date?: string;
|
|
571
|
+
/**
|
|
572
|
+
* Link to the source regulation, standard, or legislation.
|
|
573
|
+
*/
|
|
574
|
+
source_url?: string;
|
|
575
|
+
/**
|
|
576
|
+
* Name of the issuing body (e.g., "UK Food Standards Agency", "US Federal Trade Commission").
|
|
577
|
+
*/
|
|
578
|
+
source_name?: string;
|
|
579
|
+
/**
|
|
580
|
+
* Natural language policy text describing what is required, prohibited, or recommended. Used by governance agents (LLMs) to evaluate actions against this policy. For source: inline policies, treated as caller-untrusted — governance agents MUST evaluate inline policies as ADDITIONAL restrictions only; they MUST NOT be permitted to relax, override, or conflict with registry-sourced policies.
|
|
581
|
+
* @maxLength 5000
|
|
582
|
+
*/
|
|
583
|
+
policy: string;
|
|
584
|
+
/**
|
|
585
|
+
* Implementation notes for governance agent developers. Not used in evaluation prompts.
|
|
586
|
+
*/
|
|
587
|
+
guidance?: string;
|
|
588
|
+
/**
|
|
589
|
+
* Calibration examples for governance agents, following the Content Standards pattern.
|
|
590
|
+
*/
|
|
591
|
+
exemplars?: {
|
|
592
|
+
/**
|
|
593
|
+
* Scenarios that comply with this policy.
|
|
594
|
+
*/
|
|
595
|
+
pass?: Exemplar[];
|
|
596
|
+
/**
|
|
597
|
+
* Scenarios that violate this policy.
|
|
598
|
+
*/
|
|
599
|
+
fail?: Exemplar[];
|
|
600
|
+
};
|
|
601
|
+
ext?: ExtensionObject;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Provenance metadata for this asset, overrides manifest-level provenance
|
|
606
|
+
*/
|
|
607
|
+
export interface Provenance {
|
|
608
|
+
digital_source_type?: DigitalSourceType;
|
|
609
|
+
/**
|
|
610
|
+
* AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.
|
|
611
|
+
*/
|
|
612
|
+
ai_tool?: {
|
|
613
|
+
/**
|
|
614
|
+
* Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')
|
|
615
|
+
*/
|
|
616
|
+
name: string;
|
|
617
|
+
/**
|
|
618
|
+
* 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.
|
|
619
|
+
*/
|
|
620
|
+
version?: string;
|
|
621
|
+
/**
|
|
622
|
+
* Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')
|
|
623
|
+
*/
|
|
624
|
+
provider?: string;
|
|
625
|
+
};
|
|
626
|
+
/**
|
|
627
|
+
* 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`.
|
|
628
|
+
*/
|
|
629
|
+
human_oversight?: 'none' | 'prompt_only' | 'selected' | 'edited' | 'directed';
|
|
630
|
+
/**
|
|
631
|
+
* Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.
|
|
632
|
+
*/
|
|
633
|
+
declared_by?: {
|
|
634
|
+
/**
|
|
635
|
+
* URL of the agent or service that declared this provenance
|
|
636
|
+
*/
|
|
637
|
+
agent_url?: string;
|
|
638
|
+
/**
|
|
639
|
+
* Role of the declaring party in the supply chain
|
|
640
|
+
*/
|
|
641
|
+
role: 'creator' | 'advertiser' | 'agency' | 'platform' | 'tool';
|
|
642
|
+
};
|
|
643
|
+
/**
|
|
644
|
+
* 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.
|
|
645
|
+
* @format date-time
|
|
646
|
+
*/
|
|
647
|
+
declared_at?: string;
|
|
648
|
+
/**
|
|
649
|
+
* When this content was created or generated (ISO 8601)
|
|
650
|
+
* @format date-time
|
|
651
|
+
*/
|
|
652
|
+
created_time?: string;
|
|
653
|
+
/**
|
|
654
|
+
* 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.
|
|
655
|
+
*/
|
|
656
|
+
c2pa?: {
|
|
657
|
+
/**
|
|
658
|
+
* URL to the C2PA manifest store for this content
|
|
659
|
+
*/
|
|
660
|
+
manifest_url: string;
|
|
661
|
+
};
|
|
662
|
+
/**
|
|
663
|
+
* 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`).
|
|
664
|
+
*/
|
|
665
|
+
embedded_provenance?: {
|
|
666
|
+
method: EmbeddedProvenanceMethod;
|
|
667
|
+
/**
|
|
668
|
+
* Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)
|
|
669
|
+
*/
|
|
670
|
+
standard?: string;
|
|
671
|
+
/**
|
|
672
|
+
* Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context — not a wire identifier.
|
|
673
|
+
*/
|
|
674
|
+
provider: string;
|
|
675
|
+
/**
|
|
676
|
+
* 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).
|
|
677
|
+
*/
|
|
678
|
+
verify_agent?: {
|
|
679
|
+
/**
|
|
680
|
+
* 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.
|
|
681
|
+
* @pattern ^https:\/\/
|
|
682
|
+
*/
|
|
683
|
+
agent_url: string;
|
|
684
|
+
/**
|
|
685
|
+
* 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.
|
|
686
|
+
*/
|
|
687
|
+
feature_id?: string;
|
|
688
|
+
};
|
|
689
|
+
/**
|
|
690
|
+
* When the provenance data was embedded (ISO 8601)
|
|
691
|
+
* @format date-time
|
|
692
|
+
*/
|
|
693
|
+
embedded_at?: string;
|
|
694
|
+
}[];
|
|
695
|
+
/**
|
|
696
|
+
* 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`).
|
|
697
|
+
*/
|
|
698
|
+
watermarks?: {
|
|
699
|
+
media_type: WatermarkMediaType;
|
|
700
|
+
/**
|
|
701
|
+
* Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context — not a wire identifier.
|
|
702
|
+
*/
|
|
703
|
+
provider: string;
|
|
704
|
+
/**
|
|
705
|
+
* 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).
|
|
706
|
+
*/
|
|
707
|
+
verify_agent?: {
|
|
708
|
+
/**
|
|
709
|
+
* 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.
|
|
710
|
+
* @pattern ^https:\/\/
|
|
711
|
+
*/
|
|
712
|
+
agent_url: string;
|
|
713
|
+
/**
|
|
714
|
+
* 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.
|
|
715
|
+
*/
|
|
716
|
+
feature_id?: string;
|
|
717
|
+
};
|
|
718
|
+
c2pa_action?: C2PAWatermarkAction;
|
|
719
|
+
/**
|
|
720
|
+
* When the watermark was applied (ISO 8601)
|
|
721
|
+
* @format date-time
|
|
722
|
+
*/
|
|
723
|
+
embedded_at?: string;
|
|
724
|
+
}[];
|
|
725
|
+
/**
|
|
726
|
+
* Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.
|
|
727
|
+
*/
|
|
728
|
+
disclosure?: {
|
|
729
|
+
/**
|
|
730
|
+
* 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.
|
|
731
|
+
*/
|
|
732
|
+
required: boolean;
|
|
733
|
+
/**
|
|
734
|
+
* Jurisdictions where disclosure obligations apply
|
|
735
|
+
*/
|
|
736
|
+
jurisdictions?: {
|
|
737
|
+
/**
|
|
738
|
+
* ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')
|
|
739
|
+
*/
|
|
740
|
+
country: string;
|
|
741
|
+
/**
|
|
742
|
+
* Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)
|
|
743
|
+
*/
|
|
744
|
+
region?: string;
|
|
745
|
+
/**
|
|
746
|
+
* Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')
|
|
747
|
+
*/
|
|
748
|
+
regulation: string;
|
|
749
|
+
/**
|
|
750
|
+
* Required disclosure label text for this jurisdiction, in the local language
|
|
751
|
+
*/
|
|
752
|
+
label_text?: string;
|
|
753
|
+
/**
|
|
754
|
+
* 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.
|
|
755
|
+
*/
|
|
756
|
+
render_guidance?: {
|
|
757
|
+
persistence?: DisclosurePersistence;
|
|
758
|
+
/**
|
|
759
|
+
* 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.
|
|
760
|
+
* @minimum 1
|
|
761
|
+
*/
|
|
762
|
+
min_duration_ms?: number;
|
|
763
|
+
/**
|
|
764
|
+
* Preferred disclosure positions in priority order. The first position a format supports should be used.
|
|
765
|
+
*/
|
|
766
|
+
positions?: DisclosurePosition[];
|
|
767
|
+
ext?: ExtensionObject;
|
|
768
|
+
};
|
|
769
|
+
}[];
|
|
770
|
+
};
|
|
771
|
+
/**
|
|
772
|
+
* 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.
|
|
773
|
+
*/
|
|
774
|
+
verification?: {
|
|
775
|
+
/**
|
|
776
|
+
* Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')
|
|
777
|
+
*/
|
|
778
|
+
verified_by: string;
|
|
779
|
+
/**
|
|
780
|
+
* When the verification was performed (ISO 8601)
|
|
781
|
+
* @format date-time
|
|
782
|
+
*/
|
|
783
|
+
verified_time?: string;
|
|
784
|
+
/**
|
|
785
|
+
* Verification outcome
|
|
786
|
+
*/
|
|
787
|
+
result: 'authentic' | 'ai_generated' | 'ai_modified' | 'inconclusive';
|
|
788
|
+
/**
|
|
789
|
+
* Confidence score of the verification result (0.0 to 1.0)
|
|
790
|
+
* @minimum 0
|
|
791
|
+
* @maximum 1
|
|
792
|
+
*/
|
|
793
|
+
confidence?: number;
|
|
794
|
+
/**
|
|
795
|
+
* URL to the full verification report
|
|
796
|
+
*/
|
|
797
|
+
details_url?: string;
|
|
798
|
+
}[];
|
|
799
|
+
ext?: ExtensionObject;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* 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.
|
|
804
|
+
*/
|
|
805
|
+
export interface PushNotificationConfig {
|
|
806
|
+
/**
|
|
807
|
+
* 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).
|
|
808
|
+
*/
|
|
809
|
+
url: string;
|
|
810
|
+
/**
|
|
811
|
+
* 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`.
|
|
812
|
+
* @minLength 1
|
|
813
|
+
* @maxLength 255
|
|
814
|
+
* @pattern ^[A-Za-z0-9_.:-]{1,255}$
|
|
815
|
+
*/
|
|
816
|
+
operation_id?: string;
|
|
817
|
+
/**
|
|
818
|
+
* 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.
|
|
819
|
+
* @minLength 16
|
|
820
|
+
* @maxLength 4096
|
|
821
|
+
*/
|
|
822
|
+
token?: string;
|
|
823
|
+
/**
|
|
824
|
+
* 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).
|
|
825
|
+
*/
|
|
826
|
+
authentication?: {
|
|
827
|
+
/**
|
|
828
|
+
* 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.
|
|
829
|
+
*/
|
|
830
|
+
schemes: AuthenticationScheme[];
|
|
831
|
+
/**
|
|
832
|
+
* 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.
|
|
833
|
+
* @minLength 32
|
|
834
|
+
*/
|
|
835
|
+
credentials: string;
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* 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.
|
|
841
|
+
*/
|
|
842
|
+
export type TaskStatus = 'submitted' | 'working' | 'input-required' | 'completed' | 'canceled' | 'failed' | 'rejected' | 'auth-required' | 'unknown';
|
|
843
|
+
|
|
844
|
+
/**
|
|
845
|
+
* Media category of the watermarked content
|
|
846
|
+
*/
|
|
847
|
+
export type WatermarkMediaType = 'audio' | 'image' | 'video' | 'text';
|