@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,856 @@
|
|
|
1
|
+
// AUTO-GENERATED — DO NOT EDIT.
|
|
2
|
+
// Per-tool .d.ts slice for `sync_accounts`. 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
|
+
* Sync advertiser account state with a seller. Two modes, distinguished by the key on each per-account entry:
|
|
13
|
+
*
|
|
14
|
+
* - **Provisioning mode** (`brand` + `operator` + `billing` at the entry root): the agent declares which brands it represents, who operates on each brand's behalf, and the billing model. The seller provisions or links accounts via upsert. Used for implicit accounts (`require_operator_auth: false`).
|
|
15
|
+
*
|
|
16
|
+
* - **Settings-update mode** (`account` field carrying an [`AccountRef`](/schemas/core/account-ref.json)): targets an existing account by `account_id` (or by natural key for the implicit case). The seller updates the account's settable state (notification subscriptions, payment terms, billing entity refinements) — no provisioning side effects. Used for explicit accounts (`require_operator_auth: true`) where accounts are pre-provisioned out of band, and discovered via `list_accounts`. Implicit-account sellers MAY also accept this mode for settings updates against accounts they previously provisioned.
|
|
17
|
+
*
|
|
18
|
+
* Exactly one of the two key shapes is allowed per entry. Sellers that do not implement settings-update mode MUST return `UNSUPPORTED_PROVISIONING` on entries keyed by `account.account_id`; sellers that do not provision MUST return `UNSUPPORTED_PROVISIONING` on entries keyed by the natural-key trio.
|
|
19
|
+
*/
|
|
20
|
+
export interface SyncAccountsRequest {
|
|
21
|
+
/**
|
|
22
|
+
* 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.
|
|
23
|
+
*/
|
|
24
|
+
adcp_version?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 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.
|
|
27
|
+
*/
|
|
28
|
+
adcp_major_version?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Client-generated unique key for at-most-once execution. Natural per-account upsert keys (brand, operator) handle resource-level dedup, but the envelope triggers onboarding webhooks, billing setup, and audit events — this key prevents those side effects from firing twice on retry. MUST be unique per (seller, request) pair. Use a fresh UUID v4 for each request.
|
|
31
|
+
* @minLength 16
|
|
32
|
+
* @maxLength 255
|
|
33
|
+
* @pattern ^[A-Za-z0-9_.:-]{16,255}$
|
|
34
|
+
*/
|
|
35
|
+
idempotency_key: string;
|
|
36
|
+
/**
|
|
37
|
+
* Per-account sync entries. Each entry uses one of two key shapes: the `account` field (AccountRef) for settings-update mode, or the flat `brand` + `operator` + `billing` trio for provisioning mode.
|
|
38
|
+
*/
|
|
39
|
+
accounts: (ProvisioningMode | SettingsUpdateMode)[];
|
|
40
|
+
/**
|
|
41
|
+
* When true, accounts previously synced by this agent but not included in this request will be deactivated. Scoped to the authenticated agent — does not affect accounts managed by other agents. Use with caution.
|
|
42
|
+
*/
|
|
43
|
+
delete_missing?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* When true, preview what would change without applying. Returns what would be created/updated/deactivated.
|
|
46
|
+
*/
|
|
47
|
+
dry_run?: boolean;
|
|
48
|
+
push_notification_config?: PushNotificationConfig;
|
|
49
|
+
context?: ContextObject;
|
|
50
|
+
ext?: ExtensionObject;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Response from account sync operation. Returns per-account results with status and billing, or operation-level errors on complete failure.
|
|
55
|
+
*/
|
|
56
|
+
export type SyncAccountsResponse = {
|
|
57
|
+
/**
|
|
58
|
+
* Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context. Distinct from `context` (per-request opaque echo, see below).
|
|
59
|
+
*/
|
|
60
|
+
context_id?: string;
|
|
61
|
+
context?: ContextObject;
|
|
62
|
+
/**
|
|
63
|
+
* Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.
|
|
64
|
+
*/
|
|
65
|
+
task_id?: string;
|
|
66
|
+
status: TaskStatus;
|
|
67
|
+
/**
|
|
68
|
+
* Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response.
|
|
69
|
+
*/
|
|
70
|
+
message?: string;
|
|
71
|
+
/**
|
|
72
|
+
* ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.
|
|
73
|
+
*/
|
|
74
|
+
timestamp?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. From 3.1 onward, `replayed` MAY appear on responses to any request that resolved via the idempotency cache, including read tools — universal `idempotency_key` (see security.mdx §Idempotency) means the cache holds read responses too.
|
|
77
|
+
*/
|
|
78
|
+
replayed?: boolean;
|
|
79
|
+
adcp_error?: Error;
|
|
80
|
+
push_notification_config?: PushNotificationConfig;
|
|
81
|
+
/**
|
|
82
|
+
* Governance context token issued by the account's governance agent during check_governance. Buyers attach it to governed purchase requests (media buys, rights acquisitions, signal activations, creative services); sellers persist it and include it on all subsequent governance calls for that action's lifecycle. An account binds to one governance agent (see sync_governance); governance is phased across `purchase` / `modification` / `delivery`, not partitioned across specialist agents, so the envelope carries a single token for the full lifecycle.
|
|
83
|
+
*
|
|
84
|
+
* Value format: governance agents MUST emit a compact JWS per the AdCP JWS profile (see Security — Signed Governance Context). Sellers MAY verify; sellers that do not verify MUST persist and forward the token unchanged. In 3.1 all sellers MUST verify. Non-JWS values from pre-3.0 governance agents are deprecated.
|
|
85
|
+
*
|
|
86
|
+
* This is the primary correlation key for audit and reporting across the governance lifecycle.
|
|
87
|
+
*/
|
|
88
|
+
governance_context?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). `payload` is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a `payload` object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside `task.artifacts[0].parts[].DataPart`; on REST they appear at the root of the JSON body.
|
|
91
|
+
*/
|
|
92
|
+
payload?: {};
|
|
93
|
+
/**
|
|
94
|
+
* Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values.
|
|
95
|
+
*/
|
|
96
|
+
adcp_version?: string;
|
|
97
|
+
/**
|
|
98
|
+
* DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version.
|
|
99
|
+
*/
|
|
100
|
+
adcp_major_version?: number;
|
|
101
|
+
} & (SyncAccountsSuccess | SyncAccountsError);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Sync operation processed accounts (individual accounts may be pending or have action=failed)
|
|
105
|
+
*/
|
|
106
|
+
export interface SyncAccountsSuccess {
|
|
107
|
+
/**
|
|
108
|
+
* Whether this was a dry run (no actual changes made)
|
|
109
|
+
*/
|
|
110
|
+
dry_run?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Results for each account processed
|
|
113
|
+
*/
|
|
114
|
+
accounts: {
|
|
115
|
+
/**
|
|
116
|
+
* Seller-assigned account identifier. Use this in subsequent create_media_buy and other account-scoped operations.
|
|
117
|
+
*/
|
|
118
|
+
account_id?: string;
|
|
119
|
+
brand: BrandReference;
|
|
120
|
+
/**
|
|
121
|
+
* Operator domain, echoed from request
|
|
122
|
+
*/
|
|
123
|
+
operator: string;
|
|
124
|
+
/**
|
|
125
|
+
* Human-readable account name assigned by the seller
|
|
126
|
+
*/
|
|
127
|
+
name?: string;
|
|
128
|
+
/**
|
|
129
|
+
* Action taken for this account. created: new account provisioned. updated: existing account modified. unchanged: no changes needed. failed: could not process (see errors).
|
|
130
|
+
*/
|
|
131
|
+
action: 'created' | 'updated' | 'unchanged' | 'failed';
|
|
132
|
+
/**
|
|
133
|
+
* Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). rejected: seller declined the account request. payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: was active, now terminated.
|
|
134
|
+
*/
|
|
135
|
+
status: 'active' | 'pending_approval' | 'rejected' | 'payment_required' | 'suspended' | 'closed';
|
|
136
|
+
billing?: BillingParty;
|
|
137
|
+
billing_entity?: BusinessEntity;
|
|
138
|
+
account_scope?: AccountScope;
|
|
139
|
+
/**
|
|
140
|
+
* Setup information for pending accounts. Provides the agent (or human) with next steps to complete account activation.
|
|
141
|
+
*/
|
|
142
|
+
setup?: {
|
|
143
|
+
/**
|
|
144
|
+
* URL where the human can complete the required action (credit application, legal agreement, add funds)
|
|
145
|
+
*/
|
|
146
|
+
url?: string;
|
|
147
|
+
/**
|
|
148
|
+
* Human-readable description of what's needed
|
|
149
|
+
*/
|
|
150
|
+
message: string;
|
|
151
|
+
/**
|
|
152
|
+
* When this setup link expires
|
|
153
|
+
* @format date-time
|
|
154
|
+
*/
|
|
155
|
+
expires_at?: string;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Rate card applied to this account
|
|
159
|
+
*/
|
|
160
|
+
rate_card?: string;
|
|
161
|
+
payment_terms?: PaymentTerms;
|
|
162
|
+
credit_limit?: {
|
|
163
|
+
/**
|
|
164
|
+
* @minimum 0
|
|
165
|
+
*/
|
|
166
|
+
amount: number;
|
|
167
|
+
/**
|
|
168
|
+
* @pattern ^[A-Z]{3}$
|
|
169
|
+
*/
|
|
170
|
+
currency: string;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Per-account errors (only present when action is 'failed')
|
|
174
|
+
*/
|
|
175
|
+
errors?: Error[];
|
|
176
|
+
/**
|
|
177
|
+
* Non-fatal warnings about this account
|
|
178
|
+
*/
|
|
179
|
+
warnings?: string[];
|
|
180
|
+
/**
|
|
181
|
+
* Whether this is a sandbox account, echoed from the request. Only present for implicit accounts.
|
|
182
|
+
*/
|
|
183
|
+
sandbox?: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Applied notification subscribers for this account, echoed after the seller diffs the requested state against persisted state. Present on `created`, `updated`, and `unchanged` results when the buyer included `notification_configs` in the request or any persisted entries exist on the account. `authentication.credentials` is omitted on every entry (write-only).
|
|
186
|
+
*/
|
|
187
|
+
notification_configs?: NotificationConfig[];
|
|
188
|
+
authorization?: AccountAuthorization;
|
|
189
|
+
}[];
|
|
190
|
+
context?: ContextObject;
|
|
191
|
+
ext?: ExtensionObject;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Operation failed completely, no accounts were processed
|
|
196
|
+
*/
|
|
197
|
+
export interface SyncAccountsError {
|
|
198
|
+
/**
|
|
199
|
+
* Operation-level errors (e.g., authentication failure, service unavailable)
|
|
200
|
+
*/
|
|
201
|
+
errors: Error[];
|
|
202
|
+
context?: ContextObject;
|
|
203
|
+
ext?: ExtensionObject;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Optional. The caller's scope grant against this account. Vendor agents of any type (media-buy, signals, governance, creative, brand) that support scope introspection SHOULD populate this so callers can preempt SCOPE_INSUFFICIENT / FIELD_NOT_PERMITTED errors rather than discovering scope by trial and error. Media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Absence means the vendor agent does not advertise introspectable scope for this account — callers MUST NOT infer access from absence, and fall back to error-driven discovery via the RBAC error codes.
|
|
208
|
+
*/
|
|
209
|
+
export interface AccountAuthorization {
|
|
210
|
+
/**
|
|
211
|
+
* Canonical snake_case task names the caller may invoke against this account (e.g., get_media_buys, update_media_buy, create_media_buy, sync_creatives). Absence of a task from this list MUST be interpreted as 'not permitted' — invoking an absent task MUST return SCOPE_INSUFFICIENT. This list reflects the caller's grant, not the seller's universal capability surface (for that, see get_adcp_capabilities). A seller may grant narrower subsets to different callers on the same account.
|
|
212
|
+
*/
|
|
213
|
+
allowed_tasks: string[];
|
|
214
|
+
/**
|
|
215
|
+
* Optional per-task allowlist of request fields the caller may set. Keys are task names (which MUST also appear in allowed_tasks). Values are arrays of top-level request-field paths permitted for that task. When a task appears in field_scopes, requests to that task with any field outside the allowlist MUST be rejected with FIELD_NOT_PERMITTED. Implicit framing fields are always permitted and do NOT need to appear in the allowlist — they identify the resource or shape the call rather than mutating business state. The list is non-exhaustive but covers the common cases: typed entity references (`account`, `media_buy_id`, `package_id`, `creative_id`, `signal_id`, `format_id`, `proposal_id`, `plan_id`, `session_id`), concurrency/idempotency (`revision`, `idempotency_key`), buyer-side correlation (`buyer_ref`, `po_number`), mode flags (`dry_run`), pagination (`pagination`, `cursor`, `max_results`), and envelope fields (`context`, `ext`, `adcp_major_version`, `push_notification_config` — transport-level async receipt, not business state). Any other typed entity-id parameter or query-shaping field on a read task SHOULD be treated as framing and not require listing. Tasks absent from field_scopes have no field-level restriction beyond what the task schema already enforces. An entry with an empty array means 'framing fields only, no business fields' — semantically distinct from the task being absent from field_scopes.
|
|
216
|
+
*/
|
|
217
|
+
field_scopes?: {
|
|
218
|
+
[k: string]: string[] | undefined;
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Optional named scope identifier. When present, callers and the vendor agent can reason about the grant by name rather than by enumerating allowed_tasks and field_scopes. Modeled as a discriminated union so code generators produce a literal type for the standard scope(s) and a distinct type for agent-defined values — this prevents a typo of `attestation_verifier` from being silently accepted as a custom scope. Agent-defined scope names MUST use a `custom:` prefix to avoid collision with future standard scopes. The prefix is protocol-neutral: a signals agent, a governance agent, or a creative agent defines custom scopes the same way a media-buy sales agent does.
|
|
222
|
+
*/
|
|
223
|
+
scope_name?: StandardScope | CustomScope;
|
|
224
|
+
/**
|
|
225
|
+
* Convenience flag. When true, the caller is permitted only non-mutating tasks. Sellers MUST reject any mutation from a read-only caller with READ_ONLY_SCOPE. Sellers MAY omit this field; omission is equivalent to `false`. Callers MUST NOT infer read-only from `allowed_tasks` alone — the seller MUST set this explicitly when it applies.
|
|
226
|
+
*/
|
|
227
|
+
read_only?: boolean;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Account for product lookup. Returns products with pricing specific to this account's rate card.
|
|
232
|
+
*/
|
|
233
|
+
export type AccountReference = {
|
|
234
|
+
/**
|
|
235
|
+
* Seller-assigned account identifier (from sync_accounts or list_accounts)
|
|
236
|
+
*/
|
|
237
|
+
account_id: string;
|
|
238
|
+
} | {
|
|
239
|
+
brand: BrandReference;
|
|
240
|
+
/**
|
|
241
|
+
* Domain of the entity operating on the brand's behalf. When the brand operates directly, this is the brand's domain.
|
|
242
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
243
|
+
*/
|
|
244
|
+
operator: string;
|
|
245
|
+
/**
|
|
246
|
+
* When true, references the sandbox account for this brand/operator pair. Defaults to false (production account).
|
|
247
|
+
*/
|
|
248
|
+
sandbox?: boolean;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* How the seller scoped a billing account relative to the operator and brand dimensions.
|
|
253
|
+
*/
|
|
254
|
+
export type AccountScope = 'operator' | 'brand' | 'operator_brand' | 'agent';
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* 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.
|
|
258
|
+
*/
|
|
259
|
+
export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Who is invoiced on this account. See billing_entity for the invoiced party's business details.
|
|
263
|
+
*/
|
|
264
|
+
export type BillingParty = 'operator' | 'agent' | 'advertiser';
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Brand identifier within the house portfolio. Optional for single-brand domains.
|
|
268
|
+
*/
|
|
269
|
+
export type BrandID = string;
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Brand reference for product discovery context. Resolved to full brand identity at execution time.
|
|
273
|
+
*/
|
|
274
|
+
export interface BrandReference {
|
|
275
|
+
/**
|
|
276
|
+
* Domain where /.well-known/brand.json is hosted, or the brand's operating domain
|
|
277
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
278
|
+
*/
|
|
279
|
+
domain: string;
|
|
280
|
+
brand_id?: BrandID;
|
|
281
|
+
/**
|
|
282
|
+
* 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.
|
|
283
|
+
*/
|
|
284
|
+
industries?: string[];
|
|
285
|
+
/**
|
|
286
|
+
* 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.
|
|
287
|
+
*/
|
|
288
|
+
data_subject_contestation?: {
|
|
289
|
+
[k: string]: unknown | undefined;
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* 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.
|
|
293
|
+
*
|
|
294
|
+
* **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.
|
|
295
|
+
*/
|
|
296
|
+
brand_kit_override?: {
|
|
297
|
+
logo?: ImageAsset;
|
|
298
|
+
/**
|
|
299
|
+
* Override brand colors (hex strings).
|
|
300
|
+
*/
|
|
301
|
+
colors?: {
|
|
302
|
+
/**
|
|
303
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
304
|
+
*/
|
|
305
|
+
primary?: string;
|
|
306
|
+
/**
|
|
307
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
308
|
+
*/
|
|
309
|
+
secondary?: string;
|
|
310
|
+
/**
|
|
311
|
+
* @pattern ^#[0-9a-fA-F]{6}$
|
|
312
|
+
*/
|
|
313
|
+
accent?: string;
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Override brand-voice description for surface-composed text/audio output.
|
|
317
|
+
*/
|
|
318
|
+
voice?: string;
|
|
319
|
+
/**
|
|
320
|
+
* Override tagline.
|
|
321
|
+
*/
|
|
322
|
+
tagline?: string;
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Override the account's default billing entity for this specific buy. When provided, the seller invoices this entity instead. The seller MUST validate the invoice recipient is authorized for this account. When governance_agents are configured, the seller MUST include invoice_recipient in the check_governance request.
|
|
328
|
+
*/
|
|
329
|
+
export interface BusinessEntity {
|
|
330
|
+
/**
|
|
331
|
+
* Registered legal name of the business entity
|
|
332
|
+
* @maxLength 200
|
|
333
|
+
*/
|
|
334
|
+
legal_name: string;
|
|
335
|
+
/**
|
|
336
|
+
* VAT identification number (e.g., DE123456789 for Germany, FR12345678901 for France). Required for B2B invoicing in the EU. Must be normalized: no spaces, dots, or dashes.
|
|
337
|
+
* @pattern ^[A-Z]{2}[A-Z0-9]{2,13}$
|
|
338
|
+
*/
|
|
339
|
+
vat_id?: string;
|
|
340
|
+
/**
|
|
341
|
+
* Tax identification number for jurisdictions that do not use VAT (e.g., US EIN)
|
|
342
|
+
* @maxLength 30
|
|
343
|
+
*/
|
|
344
|
+
tax_id?: string;
|
|
345
|
+
/**
|
|
346
|
+
* Company registration number (e.g., HRB 12345 for German Handelsregister)
|
|
347
|
+
* @maxLength 50
|
|
348
|
+
*/
|
|
349
|
+
registration_number?: string;
|
|
350
|
+
/**
|
|
351
|
+
* Postal address for invoicing and legal correspondence
|
|
352
|
+
*/
|
|
353
|
+
address?: {
|
|
354
|
+
/**
|
|
355
|
+
* Street address including building number
|
|
356
|
+
* @maxLength 200
|
|
357
|
+
*/
|
|
358
|
+
street: string;
|
|
359
|
+
/**
|
|
360
|
+
* @maxLength 100
|
|
361
|
+
*/
|
|
362
|
+
city: string;
|
|
363
|
+
/**
|
|
364
|
+
* @maxLength 20
|
|
365
|
+
*/
|
|
366
|
+
postal_code: string;
|
|
367
|
+
/**
|
|
368
|
+
* State, province, or region
|
|
369
|
+
* @maxLength 100
|
|
370
|
+
*/
|
|
371
|
+
region?: string;
|
|
372
|
+
/**
|
|
373
|
+
* ISO 3166-1 alpha-2 country code
|
|
374
|
+
* @pattern ^[A-Z]{2}$
|
|
375
|
+
*/
|
|
376
|
+
country: string;
|
|
377
|
+
};
|
|
378
|
+
/**
|
|
379
|
+
* Contacts for billing, legal, and operational matters. Contains personal data subject to GDPR and equivalent regulations. Implementations MUST use this data only for invoicing and account management.
|
|
380
|
+
*/
|
|
381
|
+
contacts?: {
|
|
382
|
+
/**
|
|
383
|
+
* Contact's functional role in the business relationship
|
|
384
|
+
*/
|
|
385
|
+
role: 'billing' | 'legal' | 'creative' | 'general';
|
|
386
|
+
/**
|
|
387
|
+
* Full name of the contact
|
|
388
|
+
* @maxLength 200
|
|
389
|
+
*/
|
|
390
|
+
name?: string;
|
|
391
|
+
/**
|
|
392
|
+
* @maxLength 254
|
|
393
|
+
* @format email
|
|
394
|
+
*/
|
|
395
|
+
email?: string;
|
|
396
|
+
/**
|
|
397
|
+
* @maxLength 30
|
|
398
|
+
*/
|
|
399
|
+
phone?: string;
|
|
400
|
+
}[];
|
|
401
|
+
/**
|
|
402
|
+
* Bank account details for payment processing. Write-only: included in requests to provide payment coordinates, but MUST NOT be echoed in responses. Sellers store these details and confirm receipt without returning them.
|
|
403
|
+
*/
|
|
404
|
+
bank?: {
|
|
405
|
+
/**
|
|
406
|
+
* Name on the bank account
|
|
407
|
+
* @maxLength 200
|
|
408
|
+
*/
|
|
409
|
+
account_holder: string;
|
|
410
|
+
/**
|
|
411
|
+
* International Bank Account Number (SEPA markets)
|
|
412
|
+
* @pattern ^[A-Z]{2}[0-9]{2}[A-Z0-9]{4,30}$
|
|
413
|
+
*/
|
|
414
|
+
iban?: string;
|
|
415
|
+
/**
|
|
416
|
+
* Bank Identifier Code / SWIFT code (SEPA markets)
|
|
417
|
+
* @pattern ^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$
|
|
418
|
+
*/
|
|
419
|
+
bic?: string;
|
|
420
|
+
/**
|
|
421
|
+
* Bank routing number for non-SEPA markets (e.g., US ABA routing number, Canadian transit/institution number)
|
|
422
|
+
* @maxLength 30
|
|
423
|
+
*/
|
|
424
|
+
routing_number?: string;
|
|
425
|
+
/**
|
|
426
|
+
* Bank account number for non-SEPA markets
|
|
427
|
+
* @maxLength 30
|
|
428
|
+
*/
|
|
429
|
+
account_number?: string;
|
|
430
|
+
};
|
|
431
|
+
ext?: ExtensionObject;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* C2PA action classification for this watermark
|
|
436
|
+
*/
|
|
437
|
+
export type C2PAWatermarkAction = 'c2pa.watermarked.bound' | 'c2pa.watermarked.unbound';
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Cloud storage protocol
|
|
441
|
+
*/
|
|
442
|
+
export type CloudStorageProtocol = 's3' | 'gcs' | 'azure_blob';
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* 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.
|
|
446
|
+
*/
|
|
447
|
+
export interface ContextObject {
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Agent-defined scope name, prefixed with `custom:`. Any vendor agent (media-buy seller, signals agent, governance agent, creative agent, brand agent) MAY define custom scopes. Callers MUST NOT assume any semantics from a custom-prefixed scope name.
|
|
452
|
+
* @pattern ^custom:[a-z][a-z0-9_]*$
|
|
453
|
+
*/
|
|
454
|
+
export type CustomScope = string;
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* IPTC-aligned classification of AI involvement in producing this content
|
|
458
|
+
*/
|
|
459
|
+
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';
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* How long the disclosure must persist during content playback or display
|
|
463
|
+
*/
|
|
464
|
+
export type DisclosurePersistence = 'continuous' | 'initial' | 'flexible';
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* 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.
|
|
468
|
+
*/
|
|
469
|
+
export type DisclosurePosition = 'prominent' | 'footer' | 'audio' | 'subtitle' | 'overlay' | 'end_card' | 'pre_roll' | 'companion';
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* How provenance data is carried within the content
|
|
473
|
+
*/
|
|
474
|
+
export type EmbeddedProvenanceMethod = 'manifest_wrapper' | 'provenance_markers';
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* 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.
|
|
478
|
+
*/
|
|
479
|
+
export interface ExtensionObject {
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Override logo asset.
|
|
484
|
+
*/
|
|
485
|
+
export interface ImageAsset {
|
|
486
|
+
/**
|
|
487
|
+
* Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry.
|
|
488
|
+
*/
|
|
489
|
+
asset_type: 'image';
|
|
490
|
+
/**
|
|
491
|
+
* URL to the image asset
|
|
492
|
+
*/
|
|
493
|
+
url: string;
|
|
494
|
+
/**
|
|
495
|
+
* Width in pixels
|
|
496
|
+
* @minimum 1
|
|
497
|
+
*/
|
|
498
|
+
width: number;
|
|
499
|
+
/**
|
|
500
|
+
* Height in pixels
|
|
501
|
+
* @minimum 1
|
|
502
|
+
*/
|
|
503
|
+
height: number;
|
|
504
|
+
/**
|
|
505
|
+
* Image file format (jpg, png, gif, webp, etc.)
|
|
506
|
+
*/
|
|
507
|
+
format?: string;
|
|
508
|
+
/**
|
|
509
|
+
* Alternative text for accessibility
|
|
510
|
+
*/
|
|
511
|
+
alt_text?: string;
|
|
512
|
+
provenance?: Provenance;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Account-level webhook subscription for notifications whose lifecycle outlives any single media buy — creative state changes, library purges, wholesale feed change webhooks, and future account-scoped events. Distinct from `push-notification-config.json`, which anchors at a per-resource operation (a single task or media buy). An account MAY register multiple notification configs to fan a single seller's events out to multiple buyer-side endpoints; each entry filters by `event_types`. As with push-notification-config, the default signing scheme is the AdCP RFC 9421 webhook profile against the seller's brand.json `agents[]` JWKS; the optional `authentication` block opts into the deprecated Bearer / HMAC-SHA256 fallback for compatibility. Credentials and shared secrets in `authentication.credentials` are write-only — sellers MUST NOT echo them back in `list_accounts` responses. Sellers MUST verify endpoint control before activating account-level notification configs for high-volume event families such as wholesale feed changes; delivery-time SSRF validation still applies to every fire.
|
|
517
|
+
*/
|
|
518
|
+
export interface NotificationConfig {
|
|
519
|
+
/**
|
|
520
|
+
* Buyer-supplied identifier for this subscription endpoint. Echoed on every webhook payload and on every `webhook_activity[]` record fired against this config so the buyer can attribute fires across multiple endpoints. MUST be unique within the account's `notification_configs[]` — uniqueness is enforced by the seller at registration time; duplicates are rejected with `errors[]`. Always required (even with a single subscriber) so the SDK contract is uniform — no conditional required-when-multiple rules to trip up implementations. Format is opaque — recommended values are short kebab-case slugs (`buyer-primary`, `audit-bus`, `dx-team`).
|
|
521
|
+
* @minLength 1
|
|
522
|
+
* @maxLength 64
|
|
523
|
+
* @pattern ^[A-Za-z0-9_.:-]{1,64}$
|
|
524
|
+
*/
|
|
525
|
+
subscriber_id: string;
|
|
526
|
+
/**
|
|
527
|
+
* Webhook endpoint URL. Same wire contract as `push-notification-config.url` — `format: "uri"`, no destination-port allowlist enforced by the protocol, SSRF protection via the IP-range check defined in docs/building/by-layer/L1/security.mdx#webhook-url-validation-ssrf. For wholesale feed subscribers, sellers MUST complete an activation challenge or equivalent proof-of-control before treating the subscriber as active.
|
|
528
|
+
*/
|
|
529
|
+
url: string;
|
|
530
|
+
/**
|
|
531
|
+
* Notification types this subscriber wishes to receive on the registered `url`. The seller MUST NOT fire other types against this endpoint, and MUST NOT silently widen the filter when new types are added to `notification-type.json`. When omitted, the seller MUST default to a no-fire policy and surface an `errors[]` entry on `sync_accounts` so the buyer notices the missing filter. Values are drawn from `notification-type.json`, but only types whose contract anchors at the account scope are valid here — creative lifecycle events and wholesale feed change payloads are valid; media-buy-anchored types (`scheduled`, `final`, `delayed`, `adjusted`, `impairment`) belong on a media buy's `push_notification_config`, not on this surface; sellers MUST reject those entries as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry rather than silently dropping them.
|
|
532
|
+
*/
|
|
533
|
+
event_types: NotificationType[];
|
|
534
|
+
/**
|
|
535
|
+
* Legacy authentication selector. Same precedence and semantics as `push-notification-config.authentication` — presence opts the seller into Bearer or HMAC-SHA256 signing; absence selects the default RFC 9421 webhook profile keyed off the seller's brand.json `agents[]` JWKS. The same signed-registration downgrade-resistance rules apply to accounts[].notification_configs[].authentication. Deprecated; removed in AdCP 4.0. Credentials are write-only and MUST NOT be echoed on `list_accounts` reads.
|
|
536
|
+
*/
|
|
537
|
+
authentication?: {
|
|
538
|
+
schemes: AuthenticationScheme[];
|
|
539
|
+
/**
|
|
540
|
+
* Credentials for the legacy scheme. Bearer: token. HMAC-SHA256: shared secret. Minimum 32 characters. Exchanged out-of-band during onboarding. Write-only.
|
|
541
|
+
* @minLength 32
|
|
542
|
+
*/
|
|
543
|
+
credentials: string;
|
|
544
|
+
};
|
|
545
|
+
/**
|
|
546
|
+
* When false, the seller persists the configuration but suppresses fires. Use to pause a noisy subscriber without losing the registration. Sellers MUST NOT skip persisting the entry when `active: false` — the buyer's next `sync_accounts` MUST observe the same array, otherwise the buyer cannot distinguish pause from drop.
|
|
547
|
+
*/
|
|
548
|
+
active?: boolean;
|
|
549
|
+
ext?: ExtensionObject;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Type of push notification fired by a seller agent. Media-buy-anchored notifications (`scheduled`, `final`, `delayed`, `adjusted`, `impairment`) fire against a media buy's `push_notification_config`. Account-anchored notifications (`creative.status_changed`, `creative.purged`, `product.*`, `signal.*`, `wholesale_feed.bulk_change`) fire against an account's `notification_configs[]` entries whose `event_types` include the value — these outlive any single media buy and anchor at the account. Wholesale feed notifications carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; receivers use `get_products` / `get_signals` with `if_wholesale_feed_version` to repair or reconcile. New notification types added to this enum MUST declare their anchor (media-buy or account) and per-type `notification_id` semantics in the enumDescription. Sellers MUST reject `notification_configs[]` entries whose `event_types` include any media-buy-anchored type, and MUST reject `push_notification_config` registrations for account-anchored types.
|
|
554
|
+
*/
|
|
555
|
+
export type NotificationType = 'scheduled' | 'final' | 'delayed' | 'adjusted' | 'impairment' | 'creative.status_changed' | 'creative.purged' | 'product.created' | 'product.updated' | 'product.priced' | 'product.removed' | 'signal.created' | 'signal.updated' | 'signal.priced' | 'signal.removed' | 'wholesale_feed.bulk_change';
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Payment terms agreed for this account. Binding for all invoices when the account is active.
|
|
559
|
+
*/
|
|
560
|
+
export type PaymentTerms = 'net_15' | 'net_30' | 'net_45' | 'net_60' | 'net_90' | 'prepay';
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Provenance metadata for this asset, overrides manifest-level provenance
|
|
564
|
+
*/
|
|
565
|
+
export interface Provenance {
|
|
566
|
+
digital_source_type?: DigitalSourceType;
|
|
567
|
+
/**
|
|
568
|
+
* AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.
|
|
569
|
+
*/
|
|
570
|
+
ai_tool?: {
|
|
571
|
+
/**
|
|
572
|
+
* Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')
|
|
573
|
+
*/
|
|
574
|
+
name: string;
|
|
575
|
+
/**
|
|
576
|
+
* 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.
|
|
577
|
+
*/
|
|
578
|
+
version?: string;
|
|
579
|
+
/**
|
|
580
|
+
* Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')
|
|
581
|
+
*/
|
|
582
|
+
provider?: string;
|
|
583
|
+
};
|
|
584
|
+
/**
|
|
585
|
+
* 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`.
|
|
586
|
+
*/
|
|
587
|
+
human_oversight?: 'none' | 'prompt_only' | 'selected' | 'edited' | 'directed';
|
|
588
|
+
/**
|
|
589
|
+
* Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.
|
|
590
|
+
*/
|
|
591
|
+
declared_by?: {
|
|
592
|
+
/**
|
|
593
|
+
* URL of the agent or service that declared this provenance
|
|
594
|
+
*/
|
|
595
|
+
agent_url?: string;
|
|
596
|
+
/**
|
|
597
|
+
* Role of the declaring party in the supply chain
|
|
598
|
+
*/
|
|
599
|
+
role: 'creator' | 'advertiser' | 'agency' | 'platform' | 'tool';
|
|
600
|
+
};
|
|
601
|
+
/**
|
|
602
|
+
* 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.
|
|
603
|
+
* @format date-time
|
|
604
|
+
*/
|
|
605
|
+
declared_at?: string;
|
|
606
|
+
/**
|
|
607
|
+
* When this content was created or generated (ISO 8601)
|
|
608
|
+
* @format date-time
|
|
609
|
+
*/
|
|
610
|
+
created_time?: string;
|
|
611
|
+
/**
|
|
612
|
+
* 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.
|
|
613
|
+
*/
|
|
614
|
+
c2pa?: {
|
|
615
|
+
/**
|
|
616
|
+
* URL to the C2PA manifest store for this content
|
|
617
|
+
*/
|
|
618
|
+
manifest_url: string;
|
|
619
|
+
};
|
|
620
|
+
/**
|
|
621
|
+
* 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`).
|
|
622
|
+
*/
|
|
623
|
+
embedded_provenance?: {
|
|
624
|
+
method: EmbeddedProvenanceMethod;
|
|
625
|
+
/**
|
|
626
|
+
* Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)
|
|
627
|
+
*/
|
|
628
|
+
standard?: string;
|
|
629
|
+
/**
|
|
630
|
+
* Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context — not a wire identifier.
|
|
631
|
+
*/
|
|
632
|
+
provider: string;
|
|
633
|
+
/**
|
|
634
|
+
* 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).
|
|
635
|
+
*/
|
|
636
|
+
verify_agent?: {
|
|
637
|
+
/**
|
|
638
|
+
* 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.
|
|
639
|
+
* @pattern ^https:\/\/
|
|
640
|
+
*/
|
|
641
|
+
agent_url: string;
|
|
642
|
+
/**
|
|
643
|
+
* 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.
|
|
644
|
+
*/
|
|
645
|
+
feature_id?: string;
|
|
646
|
+
};
|
|
647
|
+
/**
|
|
648
|
+
* When the provenance data was embedded (ISO 8601)
|
|
649
|
+
* @format date-time
|
|
650
|
+
*/
|
|
651
|
+
embedded_at?: string;
|
|
652
|
+
}[];
|
|
653
|
+
/**
|
|
654
|
+
* 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`).
|
|
655
|
+
*/
|
|
656
|
+
watermarks?: {
|
|
657
|
+
media_type: WatermarkMediaType;
|
|
658
|
+
/**
|
|
659
|
+
* Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context — not a wire identifier.
|
|
660
|
+
*/
|
|
661
|
+
provider: string;
|
|
662
|
+
/**
|
|
663
|
+
* 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).
|
|
664
|
+
*/
|
|
665
|
+
verify_agent?: {
|
|
666
|
+
/**
|
|
667
|
+
* 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.
|
|
668
|
+
* @pattern ^https:\/\/
|
|
669
|
+
*/
|
|
670
|
+
agent_url: string;
|
|
671
|
+
/**
|
|
672
|
+
* 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.
|
|
673
|
+
*/
|
|
674
|
+
feature_id?: string;
|
|
675
|
+
};
|
|
676
|
+
c2pa_action?: C2PAWatermarkAction;
|
|
677
|
+
/**
|
|
678
|
+
* When the watermark was applied (ISO 8601)
|
|
679
|
+
* @format date-time
|
|
680
|
+
*/
|
|
681
|
+
embedded_at?: string;
|
|
682
|
+
}[];
|
|
683
|
+
/**
|
|
684
|
+
* Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.
|
|
685
|
+
*/
|
|
686
|
+
disclosure?: {
|
|
687
|
+
/**
|
|
688
|
+
* 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.
|
|
689
|
+
*/
|
|
690
|
+
required: boolean;
|
|
691
|
+
/**
|
|
692
|
+
* Jurisdictions where disclosure obligations apply
|
|
693
|
+
*/
|
|
694
|
+
jurisdictions?: {
|
|
695
|
+
/**
|
|
696
|
+
* ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')
|
|
697
|
+
*/
|
|
698
|
+
country: string;
|
|
699
|
+
/**
|
|
700
|
+
* Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)
|
|
701
|
+
*/
|
|
702
|
+
region?: string;
|
|
703
|
+
/**
|
|
704
|
+
* Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')
|
|
705
|
+
*/
|
|
706
|
+
regulation: string;
|
|
707
|
+
/**
|
|
708
|
+
* Required disclosure label text for this jurisdiction, in the local language
|
|
709
|
+
*/
|
|
710
|
+
label_text?: string;
|
|
711
|
+
/**
|
|
712
|
+
* 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.
|
|
713
|
+
*/
|
|
714
|
+
render_guidance?: {
|
|
715
|
+
persistence?: DisclosurePersistence;
|
|
716
|
+
/**
|
|
717
|
+
* 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.
|
|
718
|
+
* @minimum 1
|
|
719
|
+
*/
|
|
720
|
+
min_duration_ms?: number;
|
|
721
|
+
/**
|
|
722
|
+
* Preferred disclosure positions in priority order. The first position a format supports should be used.
|
|
723
|
+
*/
|
|
724
|
+
positions?: DisclosurePosition[];
|
|
725
|
+
ext?: ExtensionObject;
|
|
726
|
+
};
|
|
727
|
+
}[];
|
|
728
|
+
};
|
|
729
|
+
/**
|
|
730
|
+
* 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.
|
|
731
|
+
*/
|
|
732
|
+
verification?: {
|
|
733
|
+
/**
|
|
734
|
+
* Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')
|
|
735
|
+
*/
|
|
736
|
+
verified_by: string;
|
|
737
|
+
/**
|
|
738
|
+
* When the verification was performed (ISO 8601)
|
|
739
|
+
* @format date-time
|
|
740
|
+
*/
|
|
741
|
+
verified_time?: string;
|
|
742
|
+
/**
|
|
743
|
+
* Verification outcome
|
|
744
|
+
*/
|
|
745
|
+
result: 'authentic' | 'ai_generated' | 'ai_modified' | 'inconclusive';
|
|
746
|
+
/**
|
|
747
|
+
* Confidence score of the verification result (0.0 to 1.0)
|
|
748
|
+
* @minimum 0
|
|
749
|
+
* @maximum 1
|
|
750
|
+
*/
|
|
751
|
+
confidence?: number;
|
|
752
|
+
/**
|
|
753
|
+
* URL to the full verification report
|
|
754
|
+
*/
|
|
755
|
+
details_url?: string;
|
|
756
|
+
}[];
|
|
757
|
+
ext?: ExtensionObject;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/**
|
|
761
|
+
* Provisioning-mode entry — natural-key trio is required, `account` is forbidden.
|
|
762
|
+
*/
|
|
763
|
+
export interface ProvisioningMode {
|
|
764
|
+
brand: BrandReference;
|
|
765
|
+
/**
|
|
766
|
+
* Domain of the entity operating on the brand's behalf (e.g., 'pinnacle-media.com'). When the brand operates directly, this is the brand's domain. Verified against the brand's authorized_operators in brand.json. Required for **provisioning mode**; MUST be absent in settings-update mode.
|
|
767
|
+
* @pattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
|
|
768
|
+
*/
|
|
769
|
+
operator: string;
|
|
770
|
+
billing: BillingParty;
|
|
771
|
+
billing_entity?: BusinessEntity;
|
|
772
|
+
payment_terms?: PaymentTerms;
|
|
773
|
+
/**
|
|
774
|
+
* When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to implicit accounts (require_operator_auth: false) in provisioning mode. For explicit accounts, sandbox accounts are pre-existing test accounts discovered via list_accounts.
|
|
775
|
+
*/
|
|
776
|
+
sandbox?: boolean;
|
|
777
|
+
preferred_reporting_protocol?: CloudStorageProtocol;
|
|
778
|
+
/**
|
|
779
|
+
* Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, `creative.purged`, wholesale feed change payloads, future account-scoped events). Declarative replace semantics: the buyer sends the full desired array; the seller diffs against persisted state. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth — see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `impairment`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry — those events belong on a media buy's `push_notification_config`. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; receivers use `get_products` / `get_signals` with `if_wholesale_feed_version` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.
|
|
780
|
+
*
|
|
781
|
+
* **Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.
|
|
782
|
+
*/
|
|
783
|
+
notification_configs?: NotificationConfig[];
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/**
|
|
787
|
+
* 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.
|
|
788
|
+
*/
|
|
789
|
+
export interface PushNotificationConfig {
|
|
790
|
+
/**
|
|
791
|
+
* 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).
|
|
792
|
+
*/
|
|
793
|
+
url: string;
|
|
794
|
+
/**
|
|
795
|
+
* 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`.
|
|
796
|
+
* @minLength 1
|
|
797
|
+
* @maxLength 255
|
|
798
|
+
* @pattern ^[A-Za-z0-9_.:-]{1,255}$
|
|
799
|
+
*/
|
|
800
|
+
operation_id?: string;
|
|
801
|
+
/**
|
|
802
|
+
* 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.
|
|
803
|
+
* @minLength 16
|
|
804
|
+
* @maxLength 4096
|
|
805
|
+
*/
|
|
806
|
+
token?: string;
|
|
807
|
+
/**
|
|
808
|
+
* 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).
|
|
809
|
+
*/
|
|
810
|
+
authentication?: {
|
|
811
|
+
/**
|
|
812
|
+
* 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.
|
|
813
|
+
*/
|
|
814
|
+
schemes: AuthenticationScheme[];
|
|
815
|
+
/**
|
|
816
|
+
* 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.
|
|
817
|
+
* @minLength 32
|
|
818
|
+
*/
|
|
819
|
+
credentials: string;
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Settings-update entry — `account` (AccountRef) is required, provisioning trio fields are forbidden.
|
|
825
|
+
*/
|
|
826
|
+
export interface SettingsUpdateMode {
|
|
827
|
+
account: AccountReference;
|
|
828
|
+
billing_entity?: BusinessEntity;
|
|
829
|
+
payment_terms?: PaymentTerms;
|
|
830
|
+
/**
|
|
831
|
+
* When true, provision this as a sandbox account with no real platform calls or billing. Only applicable to implicit accounts (require_operator_auth: false) in provisioning mode. For explicit accounts, sandbox accounts are pre-existing test accounts discovered via list_accounts.
|
|
832
|
+
*/
|
|
833
|
+
sandbox?: boolean;
|
|
834
|
+
preferred_reporting_protocol?: CloudStorageProtocol;
|
|
835
|
+
/**
|
|
836
|
+
* Account-level webhook subscriptions for notifications whose lifecycle outlives any single media buy (`creative.status_changed`, `creative.purged`, wholesale feed change payloads, future account-scoped events). Declarative replace semantics: the buyer sends the full desired array; the seller diffs against persisted state. Omit this field to leave existing subscribers unchanged; send `[]` to remove all subscribers. Permitted in both provisioning and settings-update modes. Each entry registers a URL, the event types the subscriber wants, and optional legacy auth — see [`notification-config.json`](/schemas/core/notification-config.json). The seller MUST echo applied state on the response and on `list_accounts` reads, with `authentication.credentials` omitted (write-only). Sellers MUST reject entries whose `event_types` include any type whose contract anchors at a media buy or below (today: `scheduled`, `final`, `delayed`, `adjusted`, `impairment`) as per-account validation failures with `INVALID_REQUEST` or `VALIDATION_ERROR` and `error.field` pointing at the invalid `event_types` entry — those events belong on a media buy's `push_notification_config`. Wholesale feed webhook registrations carry the actual change payload in `/schemas/core/wholesale-feed-webhook.json`; receivers use `get_products` / `get_signals` with `if_wholesale_feed_version` to repair or reconcile. This is distinct from sync_catalogs, which manages buyer-provided campaign input feeds on a seller account.
|
|
837
|
+
*
|
|
838
|
+
* **Cap rationale:** `maxItems: 16` is a practical fan-out cap (governance + buyer ingestion + audit bus + dx team + a few partner hooks). The cap exists to prevent unbounded subscriber arrays in storage and to bound the seller's per-event fan-out work. Sellers that hit the cap with legitimate subscribers should surface this on the protocol roadmap rather than work around it.
|
|
839
|
+
*/
|
|
840
|
+
notification_configs?: NotificationConfig[];
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
/**
|
|
844
|
+
* Standard named scopes defined by the AdCP spec. `attestation_verifier` binds to the AAO Verified (Live) qualifier (a Media Buy Protocol flow — live observation requires real ad delivery) — the authorization mechanism itself is protocol-neutral, but this particular named scope is media-buy-specific.
|
|
845
|
+
*/
|
|
846
|
+
export type StandardScope = 'attestation_verifier';
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* 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.
|
|
850
|
+
*/
|
|
851
|
+
export type TaskStatus = 'submitted' | 'working' | 'input-required' | 'completed' | 'canceled' | 'failed' | 'rejected' | 'auth-required' | 'unknown';
|
|
852
|
+
|
|
853
|
+
/**
|
|
854
|
+
* Media category of the watermarked content
|
|
855
|
+
*/
|
|
856
|
+
export type WatermarkMediaType = 'audio' | 'image' | 'video' | 'text';
|