@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,986 @@
|
|
|
1
|
+
// AUTO-GENERATED — DO NOT EDIT.
|
|
2
|
+
// Per-tool .d.ts slice for `get_signals`. 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 discovering and refining signals. Use signal_spec for natural language discovery, signal_ids for exact lookups, both together to refine previous results, or discovery_mode: 'wholesale' to enumerate the agent's full priced signals feed (symmetric with get_products buying_mode: 'wholesale').
|
|
13
|
+
*/
|
|
14
|
+
export type GetSignalsRequest = {
|
|
15
|
+
[k: string]: unknown | undefined;
|
|
16
|
+
} & {
|
|
17
|
+
/**
|
|
18
|
+
* 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.
|
|
19
|
+
*/
|
|
20
|
+
adcp_version?: string;
|
|
21
|
+
/**
|
|
22
|
+
* 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.
|
|
23
|
+
*/
|
|
24
|
+
adcp_major_version?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Declares caller intent for this request. 'brief' (default): semantic discovery — signal_spec or signal_ids is required and the agent performs inference/RAG. 'wholesale': raw wholesale signals feed enumeration — signal_spec and signal_ids MUST NOT be provided and the agent returns its full priced signals feed, paginated, scoped by filters/account/destinations/countries when present. Sellers receiving requests from pre-v3.1 clients without discovery_mode MUST default to 'brief'. Timing semantics: 'wholesale' is a wholesale signals feed read — agents SHOULD respond synchronously and MUST NOT route a 'wholesale' request through the async/Submitted arm; partial completion is signalled via the response's incomplete[] field, not via a task-handoff envelope. Agents that do not implement wholesale enumeration MAY return INVALID_REQUEST for wholesale calls; callers SHOULD probe via get_adcp_capabilities (signals.discovery_modes) first.
|
|
27
|
+
*/
|
|
28
|
+
discovery_mode?: 'brief' | 'wholesale';
|
|
29
|
+
account?: AccountReference;
|
|
30
|
+
/**
|
|
31
|
+
* Natural language description of the desired signals. When used alone, enables semantic discovery. When combined with signal_ids, provides context for the agent but signal_ids matches are returned first. MUST NOT be provided when discovery_mode is 'wholesale'.
|
|
32
|
+
*/
|
|
33
|
+
signal_spec?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Specific signals to look up by data provider and ID. Returns exact matches from the data provider's published signal definitions. When combined with signal_spec, these signals anchor the starting set and signal_spec guides adjustments. MUST NOT be provided when discovery_mode is 'wholesale'.
|
|
36
|
+
*/
|
|
37
|
+
signal_ids?: SignalID[];
|
|
38
|
+
/**
|
|
39
|
+
* Filter signals to those activatable on specific agents/platforms. When omitted, returns all signals available on the current agent. If the authenticated caller matches one of these destinations, activation keys will be included in the response.
|
|
40
|
+
*/
|
|
41
|
+
destinations?: Destination[];
|
|
42
|
+
/**
|
|
43
|
+
* Countries where signals will be used (ISO 3166-1 alpha-2 codes). When omitted, no geographic filter is applied.
|
|
44
|
+
*/
|
|
45
|
+
countries?: string[];
|
|
46
|
+
filters?: SignalFilters;
|
|
47
|
+
/**
|
|
48
|
+
* @deprecated
|
|
49
|
+
* DEPRECATED: Use pagination.max_results instead. When both fields are present, agents MUST honor pagination.max_results. When only this field is present without a pagination envelope, agents SHOULD treat it as the page size subject to a maximum of 100 results. This field will be removed in AdCP 4.0.
|
|
50
|
+
* @minimum 1
|
|
51
|
+
*/
|
|
52
|
+
max_results?: number;
|
|
53
|
+
pagination?: PaginationRequest;
|
|
54
|
+
/**
|
|
55
|
+
* Opaque wholesale_feed_version token returned by a prior wholesale-mode get_signals response from this agent. Only valid when discovery_mode is wholesale. When provided, the agent compares against its current wholesale signals feed version for the caller's cache_scope and MAY return an unchanged: true response (with signals omitted) if nothing has changed. The token is scope-keyed: callers cache `(cache_scope, wholesale_feed_version)` pairs. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full sync pattern.
|
|
56
|
+
*/
|
|
57
|
+
if_wholesale_feed_version?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Opaque pricing_version token from a prior get_signals response. MUST only be sent together with if_wholesale_feed_version — pricing version has no structural baseline to compare against on its own. Evaluation order: (1) if_wholesale_feed_version mismatch → agent returns the full payload; (2) if_wholesale_feed_version matches but if_pricing_version mismatches → agent returns the full payload so the caller sees updated pricing_options; (3) both match → agent MAY return unchanged: true. Agents that don't track pricing separately ignore this and fall back to if_wholesale_feed_version semantics.
|
|
60
|
+
*/
|
|
61
|
+
if_pricing_version?: string;
|
|
62
|
+
context?: ContextObject;
|
|
63
|
+
ext?: ExtensionObject;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Response payload for get_signals task
|
|
68
|
+
*/
|
|
69
|
+
export interface GetSignalsResponse {
|
|
70
|
+
/**
|
|
71
|
+
* 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).
|
|
72
|
+
*/
|
|
73
|
+
context_id?: string;
|
|
74
|
+
context?: ContextObject;
|
|
75
|
+
/**
|
|
76
|
+
* Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.
|
|
77
|
+
*/
|
|
78
|
+
task_id?: string;
|
|
79
|
+
status: TaskStatus;
|
|
80
|
+
/**
|
|
81
|
+
* 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.
|
|
82
|
+
*/
|
|
83
|
+
message?: string;
|
|
84
|
+
/**
|
|
85
|
+
* ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.
|
|
86
|
+
*/
|
|
87
|
+
timestamp?: string;
|
|
88
|
+
/**
|
|
89
|
+
* 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.
|
|
90
|
+
*/
|
|
91
|
+
replayed?: boolean;
|
|
92
|
+
adcp_error?: Error;
|
|
93
|
+
push_notification_config?: PushNotificationConfig;
|
|
94
|
+
/**
|
|
95
|
+
* 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.
|
|
96
|
+
*
|
|
97
|
+
* 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.
|
|
98
|
+
*
|
|
99
|
+
* This is the primary correlation key for audit and reporting across the governance lifecycle.
|
|
100
|
+
*/
|
|
101
|
+
governance_context?: string;
|
|
102
|
+
/**
|
|
103
|
+
* 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.
|
|
104
|
+
*/
|
|
105
|
+
payload?: {};
|
|
106
|
+
/**
|
|
107
|
+
* 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.
|
|
108
|
+
*/
|
|
109
|
+
adcp_version?: string;
|
|
110
|
+
/**
|
|
111
|
+
* 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.
|
|
112
|
+
*/
|
|
113
|
+
adcp_major_version?: number;
|
|
114
|
+
/**
|
|
115
|
+
* Array of matching signals
|
|
116
|
+
*/
|
|
117
|
+
signals?: {
|
|
118
|
+
signal_id: SignalID;
|
|
119
|
+
/**
|
|
120
|
+
* Opaque activation handle. Pass this string verbatim to activate_signal.signal_agent_segment_id — do not pass the signal_id object.
|
|
121
|
+
*/
|
|
122
|
+
signal_agent_segment_id: string;
|
|
123
|
+
/**
|
|
124
|
+
* Human-readable signal name
|
|
125
|
+
*/
|
|
126
|
+
name: string;
|
|
127
|
+
/**
|
|
128
|
+
* Detailed signal description
|
|
129
|
+
*/
|
|
130
|
+
description: string;
|
|
131
|
+
value_type?: SignalValueType;
|
|
132
|
+
/**
|
|
133
|
+
* Valid values for categorical signals. Present when value_type is 'categorical'. Buyers must use one of these values in SignalTargeting.values.
|
|
134
|
+
*/
|
|
135
|
+
categories?: string[];
|
|
136
|
+
/**
|
|
137
|
+
* Valid range for numeric signals. Present when value_type is 'numeric'.
|
|
138
|
+
*/
|
|
139
|
+
range?: {
|
|
140
|
+
/**
|
|
141
|
+
* Minimum value (inclusive)
|
|
142
|
+
*/
|
|
143
|
+
min: number;
|
|
144
|
+
/**
|
|
145
|
+
* Maximum value (inclusive)
|
|
146
|
+
*/
|
|
147
|
+
max: number;
|
|
148
|
+
};
|
|
149
|
+
signal_type: SignalCatalogType;
|
|
150
|
+
/**
|
|
151
|
+
* Human-readable name of the data provider
|
|
152
|
+
*/
|
|
153
|
+
data_provider: string;
|
|
154
|
+
/**
|
|
155
|
+
* Percentage of audience coverage
|
|
156
|
+
* @minimum 0
|
|
157
|
+
* @maximum 100
|
|
158
|
+
*/
|
|
159
|
+
coverage_percentage: number;
|
|
160
|
+
/**
|
|
161
|
+
* Array of deployment targets
|
|
162
|
+
*/
|
|
163
|
+
deployments: Deployment[];
|
|
164
|
+
/**
|
|
165
|
+
* Pricing options available for this signal. The buyer selects one and passes its pricing_option_id in report_usage for billing verification.
|
|
166
|
+
*/
|
|
167
|
+
pricing_options: VendorPricingOption[];
|
|
168
|
+
}[];
|
|
169
|
+
/**
|
|
170
|
+
* Task-specific errors and warnings (e.g., signal discovery or pricing issues)
|
|
171
|
+
*/
|
|
172
|
+
errors?: Error[];
|
|
173
|
+
/**
|
|
174
|
+
* Declares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete.
|
|
175
|
+
*/
|
|
176
|
+
incomplete?: {
|
|
177
|
+
/**
|
|
178
|
+
* 'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget.
|
|
179
|
+
*/
|
|
180
|
+
scope: 'signals' | 'pricing' | 'wholesale_feed';
|
|
181
|
+
/**
|
|
182
|
+
* Human-readable explanation of what is missing and why.
|
|
183
|
+
*/
|
|
184
|
+
description: string;
|
|
185
|
+
/**
|
|
186
|
+
* How much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget.
|
|
187
|
+
*/
|
|
188
|
+
estimated_wait?: Duration;
|
|
189
|
+
}[];
|
|
190
|
+
/**
|
|
191
|
+
* Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches `(cache_scope, wholesale_feed_version)` pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model.
|
|
192
|
+
*/
|
|
193
|
+
wholesale_feed_version?: string;
|
|
194
|
+
/**
|
|
195
|
+
* Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both.
|
|
196
|
+
*/
|
|
197
|
+
pricing_version?: string;
|
|
198
|
+
/**
|
|
199
|
+
* Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include `account`, the agent MUST return `cache_scope: 'public'`. When the request included `account`, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. **Backward-compatibility note for 3.1 validators:** SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared `adcp_version`. For responses with `adcp_version` starting `3.0`, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break.
|
|
200
|
+
*/
|
|
201
|
+
cache_scope?: 'public' | 'account';
|
|
202
|
+
/**
|
|
203
|
+
* Present and `true` ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. **One shape per state:** agents MUST NOT emit `unchanged: false` — the absence of the field IS the signal that the response carries signals.
|
|
204
|
+
*/
|
|
205
|
+
unchanged?: true;
|
|
206
|
+
pagination?: PaginationResponse;
|
|
207
|
+
/**
|
|
208
|
+
* When true, this response contains simulated data from sandbox mode.
|
|
209
|
+
*/
|
|
210
|
+
sandbox?: boolean;
|
|
211
|
+
ext?: ExtensionObject;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Account for product lookup. Returns products with pricing specific to this account's rate card.
|
|
216
|
+
*/
|
|
217
|
+
export type AccountReference = {
|
|
218
|
+
/**
|
|
219
|
+
* Seller-assigned account identifier (from sync_accounts or list_accounts)
|
|
220
|
+
*/
|
|
221
|
+
account_id: string;
|
|
222
|
+
} | {
|
|
223
|
+
brand: BrandReference;
|
|
224
|
+
/**
|
|
225
|
+
* Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.
|
|
226
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
227
|
+
*/
|
|
228
|
+
operator: string;
|
|
229
|
+
/**
|
|
230
|
+
* When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).
|
|
231
|
+
*/
|
|
232
|
+
sandbox?: boolean;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* The key to use for targeting. Only present if is_live=true AND requester has access to this deployment.
|
|
237
|
+
*/
|
|
238
|
+
export type ActivationKey = {
|
|
239
|
+
/**
|
|
240
|
+
* Segment ID based targeting
|
|
241
|
+
*/
|
|
242
|
+
type: 'segment_id';
|
|
243
|
+
/**
|
|
244
|
+
* The platform-specific segment identifier to use in campaign targeting
|
|
245
|
+
*/
|
|
246
|
+
segment_id: string;
|
|
247
|
+
} | {
|
|
248
|
+
/**
|
|
249
|
+
* Key-value pair based targeting
|
|
250
|
+
*/
|
|
251
|
+
type: 'key_value';
|
|
252
|
+
/**
|
|
253
|
+
* The targeting parameter key
|
|
254
|
+
*/
|
|
255
|
+
key: string;
|
|
256
|
+
/**
|
|
257
|
+
* The targeting parameter value
|
|
258
|
+
*/
|
|
259
|
+
value: string;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 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.
|
|
264
|
+
*/
|
|
265
|
+
export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Brand identifier within the house portfolio. Optional for single-brand domains.
|
|
269
|
+
*/
|
|
270
|
+
export type BrandID = string;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Brand reference for product discovery context. Resolved to full brand identity at execution time.
|
|
274
|
+
*/
|
|
275
|
+
export interface BrandReference {
|
|
276
|
+
/**
|
|
277
|
+
* Domain where /.well-known/brand.json is hosted, or the brand's operating domain
|
|
278
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
279
|
+
*/
|
|
280
|
+
domain: string;
|
|
281
|
+
brand_id?: BrandID;
|
|
282
|
+
/**
|
|
283
|
+
* 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.
|
|
284
|
+
*/
|
|
285
|
+
industries?: string[];
|
|
286
|
+
/**
|
|
287
|
+
* 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.
|
|
288
|
+
*/
|
|
289
|
+
data_subject_contestation?: {
|
|
290
|
+
[k: string]: unknown | undefined;
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* 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.
|
|
294
|
+
*
|
|
295
|
+
* **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.
|
|
296
|
+
*/
|
|
297
|
+
brand_kit_override?: {
|
|
298
|
+
logo?: ImageAsset;
|
|
299
|
+
/**
|
|
300
|
+
* Override brand colors (hex strings).
|
|
301
|
+
*/
|
|
302
|
+
colors?: {
|
|
303
|
+
/**
|
|
304
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
305
|
+
*/
|
|
306
|
+
primary?: string;
|
|
307
|
+
/**
|
|
308
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
309
|
+
*/
|
|
310
|
+
secondary?: string;
|
|
311
|
+
/**
|
|
312
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
313
|
+
*/
|
|
314
|
+
accent?: string;
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* Override brand-voice description for surface-composed text/audio output.
|
|
318
|
+
*/
|
|
319
|
+
voice?: string;
|
|
320
|
+
/**
|
|
321
|
+
* Override tagline.
|
|
322
|
+
*/
|
|
323
|
+
tagline?: string;
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* C2PA action classification for this watermark
|
|
329
|
+
*/
|
|
330
|
+
export type C2PAWatermarkAction = 'c2pa.watermarked.bound' | 'c2pa.watermarked.unbound';
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* 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.
|
|
334
|
+
*/
|
|
335
|
+
export interface ContextObject {
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Fixed cost per thousand impressions
|
|
340
|
+
*/
|
|
341
|
+
export interface CpmPricing {
|
|
342
|
+
model: 'cpm';
|
|
343
|
+
/**
|
|
344
|
+
* Cost per thousand impressions
|
|
345
|
+
* @minimum 0
|
|
346
|
+
*/
|
|
347
|
+
cpm: number;
|
|
348
|
+
/**
|
|
349
|
+
* ISO 4217 currency code
|
|
350
|
+
* @pattern ^[A-Z]{3}$
|
|
351
|
+
*/
|
|
352
|
+
currency: string;
|
|
353
|
+
ext?: ExtensionObject;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Escape hatch for pricing constructs that do not fit cpm, percent_of_media, flat_fee, or per_unit. Use when a vendor prices via performance kickers, tiered volume, hybrid formulas, outcome-sharing, or any other model the standard forms cannot express. Requires a human-readable description and a structured metadata object that captures the parameters a buyer needs to reason about the charge. Buyers SHOULD route custom pricing through operator review before commitment — automatic selection is not recommended.
|
|
358
|
+
*/
|
|
359
|
+
export interface CustomPricing {
|
|
360
|
+
model: 'custom';
|
|
361
|
+
/**
|
|
362
|
+
* Human-readable description of the custom pricing model. Buyers display this to the operator when requesting approval.
|
|
363
|
+
* @minLength 1
|
|
364
|
+
*/
|
|
365
|
+
description: string;
|
|
366
|
+
/**
|
|
367
|
+
* Structured parameters for the custom model. Keys follow lowercase_snake_case. Values may be primitives, arrays, or nested objects. Must be sufficient for a human to understand the pricing basis and for a downstream system to reconstruct the charge. Vendors SHOULD include a `summary_for_operator` string (one or two sentences, suitable for display in a buyer's operator-review UI) so reviewers across vendors see a consistent prompt. Required operator-review fields (approver role, dollar threshold for automatic approval, escalation contact) MAY be surfaced via additional keys the buyer's review surface recognizes.
|
|
368
|
+
*/
|
|
369
|
+
metadata: {
|
|
370
|
+
/**
|
|
371
|
+
* One or two sentences describing the pricing construct in plain language, displayed to the buyer's operator when requesting approval. Should not repeat the top-level `description` verbatim — summarize the charge mechanic instead (e.g., 'Base $12 CPM plus $0.50 per qualifying post-view conversion, capped at $45 CPM').
|
|
372
|
+
* @minLength 1
|
|
373
|
+
*/
|
|
374
|
+
summary_for_operator?: string;
|
|
375
|
+
};
|
|
376
|
+
/**
|
|
377
|
+
* ISO 4217 currency code. Present when the pricing resolves to a monetary charge in a specific currency.
|
|
378
|
+
* @pattern ^[A-Z]{3}$
|
|
379
|
+
*/
|
|
380
|
+
currency?: string;
|
|
381
|
+
ext?: ExtensionObject;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* A signal deployment to a specific deployment target with activation status and key
|
|
386
|
+
*/
|
|
387
|
+
export type Deployment = {
|
|
388
|
+
/**
|
|
389
|
+
* Discriminator indicating this is a platform-based deployment
|
|
390
|
+
*/
|
|
391
|
+
type: 'platform';
|
|
392
|
+
/**
|
|
393
|
+
* Platform identifier for DSPs
|
|
394
|
+
*/
|
|
395
|
+
platform: string;
|
|
396
|
+
/**
|
|
397
|
+
* Account identifier if applicable
|
|
398
|
+
*/
|
|
399
|
+
account?: string;
|
|
400
|
+
/**
|
|
401
|
+
* Whether signal is currently active on this deployment
|
|
402
|
+
*/
|
|
403
|
+
is_live: boolean;
|
|
404
|
+
activation_key?: ActivationKey;
|
|
405
|
+
/**
|
|
406
|
+
* Estimated time to activate if not live, or to complete activation if in progress
|
|
407
|
+
* @minimum 0
|
|
408
|
+
*/
|
|
409
|
+
estimated_activation_duration_minutes?: number;
|
|
410
|
+
/**
|
|
411
|
+
* Timestamp when activation completed (if is_live=true)
|
|
412
|
+
* @format date-time
|
|
413
|
+
*/
|
|
414
|
+
deployed_at?: string;
|
|
415
|
+
} | {
|
|
416
|
+
/**
|
|
417
|
+
* Discriminator indicating this is an agent URL-based deployment
|
|
418
|
+
*/
|
|
419
|
+
type: 'agent';
|
|
420
|
+
/**
|
|
421
|
+
* URL identifying the deployment agent
|
|
422
|
+
*/
|
|
423
|
+
agent_url: string;
|
|
424
|
+
/**
|
|
425
|
+
* Account identifier if applicable
|
|
426
|
+
*/
|
|
427
|
+
account?: string;
|
|
428
|
+
/**
|
|
429
|
+
* Whether signal is currently active on this deployment
|
|
430
|
+
*/
|
|
431
|
+
is_live: boolean;
|
|
432
|
+
activation_key?: ActivationKey;
|
|
433
|
+
/**
|
|
434
|
+
* Estimated time to activate if not live, or to complete activation if in progress
|
|
435
|
+
* @minimum 0
|
|
436
|
+
*/
|
|
437
|
+
estimated_activation_duration_minutes?: number;
|
|
438
|
+
/**
|
|
439
|
+
* Timestamp when activation completed (if is_live=true)
|
|
440
|
+
* @format date-time
|
|
441
|
+
*/
|
|
442
|
+
deployed_at?: string;
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* A deployment target where signals can be activated (DSP, sales agent, etc.)
|
|
447
|
+
*/
|
|
448
|
+
export type Destination = {
|
|
449
|
+
/**
|
|
450
|
+
* Discriminator indicating this is a platform-based deployment
|
|
451
|
+
*/
|
|
452
|
+
type: 'platform';
|
|
453
|
+
/**
|
|
454
|
+
* Platform identifier for DSPs (e.g., 'the-trade-desk', 'amazon-dsp')
|
|
455
|
+
*/
|
|
456
|
+
platform: string;
|
|
457
|
+
/**
|
|
458
|
+
* Optional account identifier on the platform
|
|
459
|
+
*/
|
|
460
|
+
account?: string;
|
|
461
|
+
} | {
|
|
462
|
+
/**
|
|
463
|
+
* Discriminator indicating this is an agent URL-based deployment
|
|
464
|
+
*/
|
|
465
|
+
type: 'agent';
|
|
466
|
+
/**
|
|
467
|
+
* URL identifying the deployment agent (for sales agents, etc.)
|
|
468
|
+
*/
|
|
469
|
+
agent_url: string;
|
|
470
|
+
/**
|
|
471
|
+
* Optional account identifier on the agent
|
|
472
|
+
*/
|
|
473
|
+
account?: string;
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* IPTC-aligned classification of AI involvement in producing this content
|
|
478
|
+
*/
|
|
479
|
+
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';
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* How long the disclosure must persist during content playback or display
|
|
483
|
+
*/
|
|
484
|
+
export type DisclosurePersistence = 'continuous' | 'initial' | 'flexible';
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* 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.
|
|
488
|
+
*/
|
|
489
|
+
export type DisclosurePosition = 'prominent' | 'footer' | 'audio' | 'subtitle' | 'overlay' | 'end_card' | 'pre_roll' | 'companion';
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.
|
|
493
|
+
*/
|
|
494
|
+
export interface Duration {
|
|
495
|
+
/**
|
|
496
|
+
* Number of time units. Must be 1 when unit is 'campaign'.
|
|
497
|
+
* @minimum 1
|
|
498
|
+
*/
|
|
499
|
+
interval: number;
|
|
500
|
+
/**
|
|
501
|
+
* Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.
|
|
502
|
+
*/
|
|
503
|
+
unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'campaign';
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* How provenance data is carried within the content
|
|
508
|
+
*/
|
|
509
|
+
export type EmbeddedProvenanceMethod = 'manifest_wrapper' | 'provenance_markers';
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* 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.
|
|
513
|
+
*/
|
|
514
|
+
export interface ExtensionObject {
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Fixed charge per billing period, regardless of impressions or spend. Used for licensed data bundles and audience subscriptions.
|
|
519
|
+
*/
|
|
520
|
+
export interface FlatFeePricing {
|
|
521
|
+
model: 'flat_fee';
|
|
522
|
+
/**
|
|
523
|
+
* Fixed charge for the billing period
|
|
524
|
+
* @minimum 0
|
|
525
|
+
*/
|
|
526
|
+
amount: number;
|
|
527
|
+
/**
|
|
528
|
+
* Billing period for the flat fee.
|
|
529
|
+
*/
|
|
530
|
+
period: 'monthly' | 'quarterly' | 'annual' | 'campaign';
|
|
531
|
+
/**
|
|
532
|
+
* ISO 4217 currency code
|
|
533
|
+
* @pattern ^[A-Z]{3}$
|
|
534
|
+
*/
|
|
535
|
+
currency: string;
|
|
536
|
+
ext?: ExtensionObject;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Override logo asset.
|
|
541
|
+
*/
|
|
542
|
+
export interface ImageAsset {
|
|
543
|
+
/**
|
|
544
|
+
* Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry.
|
|
545
|
+
*/
|
|
546
|
+
asset_type: 'image';
|
|
547
|
+
/**
|
|
548
|
+
* URL to the image asset
|
|
549
|
+
*/
|
|
550
|
+
url: string;
|
|
551
|
+
/**
|
|
552
|
+
* Width in pixels
|
|
553
|
+
* @minimum 1
|
|
554
|
+
*/
|
|
555
|
+
width: number;
|
|
556
|
+
/**
|
|
557
|
+
* Height in pixels
|
|
558
|
+
* @minimum 1
|
|
559
|
+
*/
|
|
560
|
+
height: number;
|
|
561
|
+
/**
|
|
562
|
+
* Image file format (jpg, png, gif, webp, etc.)
|
|
563
|
+
*/
|
|
564
|
+
format?: string;
|
|
565
|
+
/**
|
|
566
|
+
* Alternative text for accessibility
|
|
567
|
+
*/
|
|
568
|
+
alt_text?: string;
|
|
569
|
+
provenance?: Provenance;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Standard cursor-based pagination parameters for list operations
|
|
574
|
+
*/
|
|
575
|
+
export interface PaginationRequest {
|
|
576
|
+
/**
|
|
577
|
+
* Maximum number of items to return per page
|
|
578
|
+
* @minimum 1
|
|
579
|
+
* @maximum 100
|
|
580
|
+
*/
|
|
581
|
+
max_results?: number;
|
|
582
|
+
/**
|
|
583
|
+
* Opaque cursor from a previous response to fetch the next page
|
|
584
|
+
*/
|
|
585
|
+
cursor?: string;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Standard cursor-based pagination metadata for list responses
|
|
590
|
+
*/
|
|
591
|
+
export interface PaginationResponse {
|
|
592
|
+
/**
|
|
593
|
+
* Whether more results are available beyond this page
|
|
594
|
+
*/
|
|
595
|
+
has_more: boolean;
|
|
596
|
+
/**
|
|
597
|
+
* Opaque cursor to pass in the next request to fetch the next page. Only present when has_more is true.
|
|
598
|
+
*/
|
|
599
|
+
cursor?: string;
|
|
600
|
+
/**
|
|
601
|
+
* Total number of items matching the query across all pages. Optional because not all backends can efficiently compute this.
|
|
602
|
+
* @minimum 0
|
|
603
|
+
*/
|
|
604
|
+
total_count?: number;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Fixed price per unit of work. Used for creative transformation (per format), AI generation (per image, per token), and rendering (per variant). The unit field describes what is counted; unit_price is the cost per one unit.
|
|
609
|
+
*/
|
|
610
|
+
export interface PerUnitPricing {
|
|
611
|
+
model: 'per_unit';
|
|
612
|
+
/**
|
|
613
|
+
* What is counted — e.g. 'format', 'image', 'token', 'variant', 'render', 'evaluation'.
|
|
614
|
+
*/
|
|
615
|
+
unit: string;
|
|
616
|
+
/**
|
|
617
|
+
* Cost per one unit
|
|
618
|
+
* @minimum 0
|
|
619
|
+
*/
|
|
620
|
+
unit_price: number;
|
|
621
|
+
/**
|
|
622
|
+
* ISO 4217 currency code
|
|
623
|
+
* @pattern ^[A-Z]{3}$
|
|
624
|
+
*/
|
|
625
|
+
currency: string;
|
|
626
|
+
ext?: ExtensionObject;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.
|
|
631
|
+
*/
|
|
632
|
+
export interface PercentOfMediaPricing {
|
|
633
|
+
model: 'percent_of_media';
|
|
634
|
+
/**
|
|
635
|
+
* Percentage of media spend, e.g. 15 = 15%
|
|
636
|
+
* @minimum 0
|
|
637
|
+
* @maximum 100
|
|
638
|
+
*/
|
|
639
|
+
percent: number;
|
|
640
|
+
/**
|
|
641
|
+
* Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).
|
|
642
|
+
* @minimum 0
|
|
643
|
+
*/
|
|
644
|
+
max_cpm?: number;
|
|
645
|
+
/**
|
|
646
|
+
* ISO 4217 currency code for the resulting charge
|
|
647
|
+
* @pattern ^[A-Z]{3}$
|
|
648
|
+
*/
|
|
649
|
+
currency: string;
|
|
650
|
+
ext?: ExtensionObject;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* Provenance metadata for this asset, overrides manifest-level provenance
|
|
655
|
+
*/
|
|
656
|
+
export interface Provenance {
|
|
657
|
+
digital_source_type?: DigitalSourceType;
|
|
658
|
+
/**
|
|
659
|
+
* AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.
|
|
660
|
+
*/
|
|
661
|
+
ai_tool?: {
|
|
662
|
+
/**
|
|
663
|
+
* Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')
|
|
664
|
+
*/
|
|
665
|
+
name: string;
|
|
666
|
+
/**
|
|
667
|
+
* 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.
|
|
668
|
+
*/
|
|
669
|
+
version?: string;
|
|
670
|
+
/**
|
|
671
|
+
* Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')
|
|
672
|
+
*/
|
|
673
|
+
provider?: string;
|
|
674
|
+
};
|
|
675
|
+
/**
|
|
676
|
+
* 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`.
|
|
677
|
+
*/
|
|
678
|
+
human_oversight?: 'none' | 'prompt_only' | 'selected' | 'edited' | 'directed';
|
|
679
|
+
/**
|
|
680
|
+
* Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.
|
|
681
|
+
*/
|
|
682
|
+
declared_by?: {
|
|
683
|
+
/**
|
|
684
|
+
* URL of the agent or service that declared this provenance
|
|
685
|
+
*/
|
|
686
|
+
agent_url?: string;
|
|
687
|
+
/**
|
|
688
|
+
* Role of the declaring party in the supply chain
|
|
689
|
+
*/
|
|
690
|
+
role: 'creator' | 'advertiser' | 'agency' | 'platform' | 'tool';
|
|
691
|
+
};
|
|
692
|
+
/**
|
|
693
|
+
* 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.
|
|
694
|
+
* @format date-time
|
|
695
|
+
*/
|
|
696
|
+
declared_at?: string;
|
|
697
|
+
/**
|
|
698
|
+
* When this content was created or generated (ISO 8601)
|
|
699
|
+
* @format date-time
|
|
700
|
+
*/
|
|
701
|
+
created_time?: string;
|
|
702
|
+
/**
|
|
703
|
+
* 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.
|
|
704
|
+
*/
|
|
705
|
+
c2pa?: {
|
|
706
|
+
/**
|
|
707
|
+
* URL to the C2PA manifest store for this content
|
|
708
|
+
*/
|
|
709
|
+
manifest_url: string;
|
|
710
|
+
};
|
|
711
|
+
/**
|
|
712
|
+
* 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`).
|
|
713
|
+
*/
|
|
714
|
+
embedded_provenance?: {
|
|
715
|
+
method: EmbeddedProvenanceMethod;
|
|
716
|
+
/**
|
|
717
|
+
* Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)
|
|
718
|
+
*/
|
|
719
|
+
standard?: string;
|
|
720
|
+
/**
|
|
721
|
+
* Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context — not a wire identifier.
|
|
722
|
+
*/
|
|
723
|
+
provider: string;
|
|
724
|
+
/**
|
|
725
|
+
* 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).
|
|
726
|
+
*/
|
|
727
|
+
verify_agent?: {
|
|
728
|
+
/**
|
|
729
|
+
* 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.
|
|
730
|
+
* @pattern ^https:\/\/
|
|
731
|
+
*/
|
|
732
|
+
agent_url: string;
|
|
733
|
+
/**
|
|
734
|
+
* 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.
|
|
735
|
+
*/
|
|
736
|
+
feature_id?: string;
|
|
737
|
+
};
|
|
738
|
+
/**
|
|
739
|
+
* When the provenance data was embedded (ISO 8601)
|
|
740
|
+
* @format date-time
|
|
741
|
+
*/
|
|
742
|
+
embedded_at?: string;
|
|
743
|
+
}[];
|
|
744
|
+
/**
|
|
745
|
+
* 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`).
|
|
746
|
+
*/
|
|
747
|
+
watermarks?: {
|
|
748
|
+
media_type: WatermarkMediaType;
|
|
749
|
+
/**
|
|
750
|
+
* Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context — not a wire identifier.
|
|
751
|
+
*/
|
|
752
|
+
provider: string;
|
|
753
|
+
/**
|
|
754
|
+
* 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).
|
|
755
|
+
*/
|
|
756
|
+
verify_agent?: {
|
|
757
|
+
/**
|
|
758
|
+
* 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.
|
|
759
|
+
* @pattern ^https:\/\/
|
|
760
|
+
*/
|
|
761
|
+
agent_url: string;
|
|
762
|
+
/**
|
|
763
|
+
* 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.
|
|
764
|
+
*/
|
|
765
|
+
feature_id?: string;
|
|
766
|
+
};
|
|
767
|
+
c2pa_action?: C2PAWatermarkAction;
|
|
768
|
+
/**
|
|
769
|
+
* When the watermark was applied (ISO 8601)
|
|
770
|
+
* @format date-time
|
|
771
|
+
*/
|
|
772
|
+
embedded_at?: string;
|
|
773
|
+
}[];
|
|
774
|
+
/**
|
|
775
|
+
* Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.
|
|
776
|
+
*/
|
|
777
|
+
disclosure?: {
|
|
778
|
+
/**
|
|
779
|
+
* 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.
|
|
780
|
+
*/
|
|
781
|
+
required: boolean;
|
|
782
|
+
/**
|
|
783
|
+
* Jurisdictions where disclosure obligations apply
|
|
784
|
+
*/
|
|
785
|
+
jurisdictions?: {
|
|
786
|
+
/**
|
|
787
|
+
* ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')
|
|
788
|
+
*/
|
|
789
|
+
country: string;
|
|
790
|
+
/**
|
|
791
|
+
* Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)
|
|
792
|
+
*/
|
|
793
|
+
region?: string;
|
|
794
|
+
/**
|
|
795
|
+
* Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')
|
|
796
|
+
*/
|
|
797
|
+
regulation: string;
|
|
798
|
+
/**
|
|
799
|
+
* Required disclosure label text for this jurisdiction, in the local language
|
|
800
|
+
*/
|
|
801
|
+
label_text?: string;
|
|
802
|
+
/**
|
|
803
|
+
* 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.
|
|
804
|
+
*/
|
|
805
|
+
render_guidance?: {
|
|
806
|
+
persistence?: DisclosurePersistence;
|
|
807
|
+
/**
|
|
808
|
+
* 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.
|
|
809
|
+
* @minimum 1
|
|
810
|
+
*/
|
|
811
|
+
min_duration_ms?: number;
|
|
812
|
+
/**
|
|
813
|
+
* Preferred disclosure positions in priority order. The first position a format supports should be used.
|
|
814
|
+
*/
|
|
815
|
+
positions?: DisclosurePosition[];
|
|
816
|
+
ext?: ExtensionObject;
|
|
817
|
+
};
|
|
818
|
+
}[];
|
|
819
|
+
};
|
|
820
|
+
/**
|
|
821
|
+
* 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.
|
|
822
|
+
*/
|
|
823
|
+
verification?: {
|
|
824
|
+
/**
|
|
825
|
+
* Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')
|
|
826
|
+
*/
|
|
827
|
+
verified_by: string;
|
|
828
|
+
/**
|
|
829
|
+
* When the verification was performed (ISO 8601)
|
|
830
|
+
* @format date-time
|
|
831
|
+
*/
|
|
832
|
+
verified_time?: string;
|
|
833
|
+
/**
|
|
834
|
+
* Verification outcome
|
|
835
|
+
*/
|
|
836
|
+
result: 'authentic' | 'ai_generated' | 'ai_modified' | 'inconclusive';
|
|
837
|
+
/**
|
|
838
|
+
* Confidence score of the verification result (0.0 to 1.0)
|
|
839
|
+
* @minimum 0
|
|
840
|
+
* @maximum 1
|
|
841
|
+
*/
|
|
842
|
+
confidence?: number;
|
|
843
|
+
/**
|
|
844
|
+
* URL to the full verification report
|
|
845
|
+
*/
|
|
846
|
+
details_url?: string;
|
|
847
|
+
}[];
|
|
848
|
+
ext?: ExtensionObject;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* 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.
|
|
853
|
+
*/
|
|
854
|
+
export interface PushNotificationConfig {
|
|
855
|
+
/**
|
|
856
|
+
* 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).
|
|
857
|
+
*/
|
|
858
|
+
url: string;
|
|
859
|
+
/**
|
|
860
|
+
* 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`.
|
|
861
|
+
* @minLength 1
|
|
862
|
+
* @maxLength 255
|
|
863
|
+
* @pattern ^[A-Za-z0-9_.:-]{1,255}$
|
|
864
|
+
*/
|
|
865
|
+
operation_id?: string;
|
|
866
|
+
/**
|
|
867
|
+
* 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.
|
|
868
|
+
* @minLength 16
|
|
869
|
+
* @maxLength 4096
|
|
870
|
+
*/
|
|
871
|
+
token?: string;
|
|
872
|
+
/**
|
|
873
|
+
* 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).
|
|
874
|
+
*/
|
|
875
|
+
authentication?: {
|
|
876
|
+
/**
|
|
877
|
+
* 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.
|
|
878
|
+
*/
|
|
879
|
+
schemes: AuthenticationScheme[];
|
|
880
|
+
/**
|
|
881
|
+
* 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.
|
|
882
|
+
* @minLength 32
|
|
883
|
+
*/
|
|
884
|
+
credentials: string;
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Types of signal catalogs available for audience targeting
|
|
890
|
+
*/
|
|
891
|
+
export type SignalCatalogType = 'marketplace' | 'custom' | 'owned';
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* Filters to refine signal discovery results
|
|
895
|
+
*/
|
|
896
|
+
export interface SignalFilters {
|
|
897
|
+
/**
|
|
898
|
+
* Filter by catalog type
|
|
899
|
+
*/
|
|
900
|
+
catalog_types?: SignalCatalogType[];
|
|
901
|
+
/**
|
|
902
|
+
* Filter by specific data providers
|
|
903
|
+
*/
|
|
904
|
+
data_providers?: string[];
|
|
905
|
+
/**
|
|
906
|
+
* Maximum CPM filter. Applies only to signals with model='cpm'.
|
|
907
|
+
* @minimum 0
|
|
908
|
+
*/
|
|
909
|
+
max_cpm?: number;
|
|
910
|
+
/**
|
|
911
|
+
* Maximum percent-of-media rate filter. Signals where all percent_of_media pricing options exceed this value are excluded. Does not account for max_cpm caps.
|
|
912
|
+
* @minimum 0
|
|
913
|
+
* @maximum 100
|
|
914
|
+
*/
|
|
915
|
+
max_percent?: number;
|
|
916
|
+
/**
|
|
917
|
+
* Minimum coverage requirement
|
|
918
|
+
* @minimum 0
|
|
919
|
+
* @maximum 100
|
|
920
|
+
*/
|
|
921
|
+
min_coverage_percentage?: number;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
/**
|
|
925
|
+
* The signal to target
|
|
926
|
+
*/
|
|
927
|
+
export type SignalID = {
|
|
928
|
+
/**
|
|
929
|
+
* Discriminator indicating this signal is from a data provider's published catalog
|
|
930
|
+
*/
|
|
931
|
+
source: 'catalog';
|
|
932
|
+
/**
|
|
933
|
+
* Domain of the data provider that owns this signal (e.g., 'polk.com', 'experian.com'). The signal definition is published at this domain's /.well-known/adagents.json
|
|
934
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
935
|
+
*/
|
|
936
|
+
data_provider_domain: string;
|
|
937
|
+
/**
|
|
938
|
+
* Signal identifier within the data provider's catalog (e.g., 'likely_tesla_buyers', 'income_100k_plus')
|
|
939
|
+
* @pattern ^[a-zA-Z0-9_-]+$
|
|
940
|
+
*/
|
|
941
|
+
id: string;
|
|
942
|
+
} | {
|
|
943
|
+
/**
|
|
944
|
+
* Discriminator indicating this signal is native to the agent (not from a data provider catalog)
|
|
945
|
+
*/
|
|
946
|
+
source: 'agent';
|
|
947
|
+
/**
|
|
948
|
+
* URL of the signals agent that provides this signal (e.g., 'https://liveramp.com/.well-known/adcp/signals')
|
|
949
|
+
*/
|
|
950
|
+
agent_url: string;
|
|
951
|
+
/**
|
|
952
|
+
* Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')
|
|
953
|
+
* @pattern ^[a-zA-Z0-9_-]+$
|
|
954
|
+
*/
|
|
955
|
+
id: string;
|
|
956
|
+
};
|
|
957
|
+
|
|
958
|
+
/**
|
|
959
|
+
* The data type of this signal's values (binary, categorical, numeric)
|
|
960
|
+
*/
|
|
961
|
+
export type SignalValueType = 'binary' | 'categorical' | 'numeric';
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* 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.
|
|
965
|
+
*/
|
|
966
|
+
export type TaskStatus = 'submitted' | 'working' | 'input-required' | 'completed' | 'canceled' | 'failed' | 'rejected' | 'auth-required' | 'unknown';
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Pricing model for a vendor service. Discriminated by model: 'cpm' (fixed CPM), 'percent_of_media' (percentage of spend with optional CPM cap), 'flat_fee' (fixed charge per reporting period), 'per_unit' (fixed price per unit of work), or 'custom' (escape hatch for models not covered by the enumerated forms — requires a description and structured metadata).
|
|
970
|
+
*/
|
|
971
|
+
export type VendorPricing = CpmPricing | PercentOfMediaPricing | FlatFeePricing | PerUnitPricing | CustomPricing;
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* A pricing option offered by a vendor agent (signals, creative, governance). Combines pricing_option_id with the pricing model fields. Pass pricing_option_id in report_usage for billing verification. All vendor discovery responses return pricing_options as an array — vendors may offer multiple options (volume tiers, context-specific rates, different models per product line).
|
|
975
|
+
*/
|
|
976
|
+
export type VendorPricingOption = {
|
|
977
|
+
/**
|
|
978
|
+
* Opaque identifier for this pricing option, unique within the vendor agent. Pass this in report_usage to identify which pricing option was applied.
|
|
979
|
+
*/
|
|
980
|
+
pricing_option_id: string;
|
|
981
|
+
} & VendorPricing;
|
|
982
|
+
|
|
983
|
+
/**
|
|
984
|
+
* Media category of the watermarked content
|
|
985
|
+
*/
|
|
986
|
+
export type WatermarkMediaType = 'audio' | 'image' | 'video' | 'text';
|