@adcp/sdk 15.9.1 → 16.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/bin/adcp-identity.js +74 -0
  2. package/bin/adcp.js +2 -0
  3. package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
  4. package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
  5. package/dist/lib/adapters/keyed-account-backend.js +121 -0
  6. package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
  7. package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
  8. package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
  9. package/dist/lib/adapters/keyed-account-store.js +227 -0
  10. package/dist/lib/adapters/keyed-account-store.mjs +203 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +25 -2
  12. package/dist/lib/core/SingleAgentClient.d.ts +25 -2
  13. package/dist/lib/core/SingleAgentClient.js +280 -62
  14. package/dist/lib/core/SingleAgentClient.mjs +282 -57
  15. package/dist/lib/core/TaskExecutor.d.mts +6 -0
  16. package/dist/lib/core/TaskExecutor.d.ts +6 -0
  17. package/dist/lib/core/TaskExecutor.js +66 -5
  18. package/dist/lib/core/TaskExecutor.mjs +71 -5
  19. package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
  20. package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
  21. package/dist/lib/core/redis-webhook-registration-store.js +23 -1
  22. package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
  23. package/dist/lib/core/webhook-registration.d.mts +7 -1
  24. package/dist/lib/core/webhook-registration.d.ts +7 -1
  25. package/dist/lib/core/webhook-registration.js +24 -2
  26. package/dist/lib/core/webhook-registration.mjs +23 -2
  27. package/dist/lib/identity-3.3/generated-compat.d.mts +34 -0
  28. package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
  29. package/dist/lib/identity-3.3/generated-compat.js +16 -0
  30. package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
  31. package/dist/lib/identity-3.3/index.d.mts +10 -0
  32. package/dist/lib/identity-3.3/index.d.ts +10 -0
  33. package/dist/lib/identity-3.3/index.js +79 -0
  34. package/dist/lib/identity-3.3/index.mjs +50 -0
  35. package/dist/lib/identity-3.3/lifecycle.d.mts +125 -0
  36. package/dist/lib/identity-3.3/lifecycle.d.ts +125 -0
  37. package/dist/lib/identity-3.3/lifecycle.js +294 -0
  38. package/dist/lib/identity-3.3/lifecycle.mjs +272 -0
  39. package/dist/lib/identity-3.3/revocation.d.mts +86 -0
  40. package/dist/lib/identity-3.3/revocation.d.ts +86 -0
  41. package/dist/lib/identity-3.3/revocation.js +308 -0
  42. package/dist/lib/identity-3.3/revocation.mjs +286 -0
  43. package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
  44. package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
  45. package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
  46. package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
  47. package/dist/lib/identity-3.3/server.d.mts +46 -0
  48. package/dist/lib/identity-3.3/server.d.ts +46 -0
  49. package/dist/lib/identity-3.3/server.js +279 -0
  50. package/dist/lib/identity-3.3/server.mjs +260 -0
  51. package/dist/lib/identity-3.3/store.d.mts +24 -0
  52. package/dist/lib/identity-3.3/store.d.ts +24 -0
  53. package/dist/lib/identity-3.3/store.js +191 -0
  54. package/dist/lib/identity-3.3/store.mjs +169 -0
  55. package/dist/lib/identity-3.3/trust.d.mts +155 -0
  56. package/dist/lib/identity-3.3/trust.d.ts +155 -0
  57. package/dist/lib/identity-3.3/trust.js +383 -0
  58. package/dist/lib/identity-3.3/trust.mjs +342 -0
  59. package/dist/lib/identity-3.3/types.d.mts +155 -0
  60. package/dist/lib/identity-3.3/types.d.ts +155 -0
  61. package/dist/lib/identity-3.3/types.js +16 -0
  62. package/dist/lib/identity-3.3/types.mjs +0 -0
  63. package/dist/lib/identity-3.3/validation.d.mts +2 -0
  64. package/dist/lib/identity-3.3/validation.d.ts +2 -0
  65. package/dist/lib/identity-3.3/validation.js +125 -0
  66. package/dist/lib/identity-3.3/validation.mjs +91 -0
  67. package/dist/lib/index.d.mts +1 -1
  68. package/dist/lib/index.d.ts +1 -1
  69. package/dist/lib/index.js +2 -0
  70. package/dist/lib/index.mjs +2 -0
  71. package/dist/lib/protocols/index.d.mts +1 -1
  72. package/dist/lib/protocols/index.d.ts +1 -1
  73. package/dist/lib/protocols/index.js +2 -2
  74. package/dist/lib/protocols/index.mjs +2 -2
  75. package/dist/lib/reporting/azure/index.d.mts +5 -0
  76. package/dist/lib/reporting/azure/index.d.ts +5 -0
  77. package/dist/lib/reporting/azure/index.js +26 -7
  78. package/dist/lib/reporting/azure/index.mjs +26 -7
  79. package/dist/lib/reporting/bigquery/index.d.mts +39 -5
  80. package/dist/lib/reporting/bigquery/index.d.ts +39 -5
  81. package/dist/lib/reporting/bigquery/index.js +26 -20
  82. package/dist/lib/reporting/bigquery/index.mjs +26 -20
  83. package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
  84. package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
  85. package/dist/lib/reporting/gcs/errors.d.mts +6 -0
  86. package/dist/lib/reporting/gcs/errors.d.ts +6 -0
  87. package/dist/lib/reporting/gcs/fence.d.mts +5 -0
  88. package/dist/lib/reporting/gcs/fence.d.ts +5 -0
  89. package/dist/lib/reporting/gcs/index.d.mts +9 -0
  90. package/dist/lib/reporting/gcs/index.d.ts +9 -0
  91. package/dist/lib/reporting/gcs/reader.d.mts +27 -3
  92. package/dist/lib/reporting/gcs/reader.d.ts +27 -3
  93. package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
  94. package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
  95. package/dist/lib/reporting/gcs/row-provider.js +34 -14
  96. package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
  97. package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
  98. package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
  99. package/dist/lib/reporting/ledger/index.d.mts +11 -0
  100. package/dist/lib/reporting/ledger/index.d.ts +11 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
  102. package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
  103. package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
  104. package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
  105. package/dist/lib/reporting/ledger/managed.d.mts +86 -6
  106. package/dist/lib/reporting/ledger/managed.d.ts +86 -6
  107. package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
  108. package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
  109. package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
  110. package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
  111. package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
  112. package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
  113. package/dist/lib/reporting/ledger/postgres.js +43 -27
  114. package/dist/lib/reporting/ledger/postgres.mjs +43 -27
  115. package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
  116. package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
  117. package/dist/lib/reporting/ledger/row-encoding.js +8 -4
  118. package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
  119. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
  120. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
  121. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
  122. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
  123. package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
  124. package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
  125. package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
  126. package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
  127. package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
  128. package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
  129. package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
  130. package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
  131. package/dist/lib/reporting/ledger/row-storage.js +126 -66
  132. package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
  133. package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
  134. package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
  135. package/dist/lib/reporting/ledger/schedule.js +24 -0
  136. package/dist/lib/reporting/ledger/schedule.mjs +23 -0
  137. package/dist/lib/reporting/ledger/types.d.mts +23 -1
  138. package/dist/lib/reporting/ledger/types.d.ts +23 -1
  139. package/dist/lib/reporting/s3/index.d.mts +5 -0
  140. package/dist/lib/reporting/s3/index.d.ts +5 -0
  141. package/dist/lib/reporting/s3/index.js +37 -14
  142. package/dist/lib/reporting/s3/index.mjs +37 -14
  143. package/dist/lib/reporting/service/index.d.mts +10 -0
  144. package/dist/lib/reporting/service/index.d.ts +10 -0
  145. package/dist/lib/reporting/service/maintenance.d.mts +28 -2
  146. package/dist/lib/reporting/service/maintenance.d.ts +28 -2
  147. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  148. package/dist/lib/server/account-sync-contract.d.mts +14 -0
  149. package/dist/lib/server/account-sync-contract.d.ts +14 -0
  150. package/dist/lib/server/account-sync-contract.js +225 -0
  151. package/dist/lib/server/account-sync-contract.mjs +197 -0
  152. package/dist/lib/server/adcp-server.js +5 -0
  153. package/dist/lib/server/adcp-server.mjs +10 -0
  154. package/dist/lib/server/auth-signature.d.mts +15 -0
  155. package/dist/lib/server/auth-signature.d.ts +15 -0
  156. package/dist/lib/server/auth-signature.js +72 -2
  157. package/dist/lib/server/auth-signature.mjs +81 -2
  158. package/dist/lib/server/auth.d.mts +6 -0
  159. package/dist/lib/server/auth.d.ts +6 -0
  160. package/dist/lib/server/auth.js +6 -0
  161. package/dist/lib/server/auth.mjs +6 -0
  162. package/dist/lib/server/create-adcp-server.d.mts +19 -5
  163. package/dist/lib/server/create-adcp-server.d.ts +19 -5
  164. package/dist/lib/server/create-adcp-server.js +259 -19
  165. package/dist/lib/server/create-adcp-server.mjs +266 -10
  166. package/dist/lib/server/decisioning/account.d.mts +24 -1
  167. package/dist/lib/server/decisioning/account.d.ts +24 -1
  168. package/dist/lib/server/decisioning/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
  171. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
  172. package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
  173. package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
  174. package/dist/lib/server/index.d.mts +2 -0
  175. package/dist/lib/server/index.d.ts +2 -0
  176. package/dist/lib/server/index.js +12 -0
  177. package/dist/lib/server/index.mjs +12 -0
  178. package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
  179. package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
  180. package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
  181. package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
  182. package/dist/lib/server/principal/types.d.mts +1 -1
  183. package/dist/lib/server/principal/types.d.ts +1 -1
  184. package/dist/lib/server/serve.js +5 -0
  185. package/dist/lib/server/serve.mjs +5 -0
  186. package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
  187. package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
  188. package/dist/lib/server/webhook-delivery/recovery.js +4 -0
  189. package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
  190. package/dist/lib/server/webhook-emitter.d.mts +10 -0
  191. package/dist/lib/server/webhook-emitter.d.ts +10 -0
  192. package/dist/lib/server/webhook-emitter.js +22 -0
  193. package/dist/lib/server/webhook-emitter.mjs +22 -0
  194. package/dist/lib/signing/agent-context.d.mts +0 -5
  195. package/dist/lib/signing/agent-context.d.ts +0 -5
  196. package/dist/lib/signing/agent-context.js +9 -1
  197. package/dist/lib/signing/agent-context.mjs +9 -1
  198. package/dist/lib/signing/agent-fetch.js +27 -2
  199. package/dist/lib/signing/agent-fetch.mjs +32 -2
  200. package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
  201. package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
  202. package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
  203. package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
  204. package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
  205. package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
  206. package/dist/lib/signing/agent-resolver/index.js +5 -0
  207. package/dist/lib/signing/agent-resolver/index.mjs +3 -0
  208. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
  209. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
  210. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
  211. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
  212. package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
  213. package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
  214. package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
  215. package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
  216. package/dist/lib/signing/brand-jwks.d.mts +2 -2
  217. package/dist/lib/signing/brand-jwks.d.ts +2 -2
  218. package/dist/lib/signing/brand-jwks.js +4 -4
  219. package/dist/lib/signing/brand-jwks.mjs +4 -4
  220. package/dist/lib/signing/client.d.mts +1 -0
  221. package/dist/lib/signing/client.d.ts +1 -0
  222. package/dist/lib/signing/client.js +5 -0
  223. package/dist/lib/signing/client.mjs +3 -0
  224. package/dist/lib/signing/crypto.js +8 -0
  225. package/dist/lib/signing/crypto.mjs +9 -1
  226. package/dist/lib/signing/fetch-async.js +1 -1
  227. package/dist/lib/signing/fetch-async.mjs +1 -1
  228. package/dist/lib/signing/fetch.js +1 -1
  229. package/dist/lib/signing/fetch.mjs +1 -1
  230. package/dist/lib/signing/jwks-https.d.mts +1 -1
  231. package/dist/lib/signing/jwks-https.d.ts +1 -1
  232. package/dist/lib/signing/jwks-https.js +1 -1
  233. package/dist/lib/signing/jwks-https.mjs +1 -1
  234. package/dist/lib/signing/jwks.d.mts +11 -3
  235. package/dist/lib/signing/jwks.d.ts +11 -3
  236. package/dist/lib/signing/jwks.js +1 -1
  237. package/dist/lib/signing/jwks.mjs +1 -1
  238. package/dist/lib/signing/middleware.js +9 -0
  239. package/dist/lib/signing/middleware.mjs +14 -0
  240. package/dist/lib/signing/parser.d.mts +9 -6
  241. package/dist/lib/signing/parser.d.ts +9 -6
  242. package/dist/lib/signing/parser.js +82 -64
  243. package/dist/lib/signing/parser.mjs +83 -65
  244. package/dist/lib/signing/revocation.d.mts +4 -1
  245. package/dist/lib/signing/revocation.d.ts +4 -1
  246. package/dist/lib/signing/revocation.js +36 -3
  247. package/dist/lib/signing/revocation.mjs +34 -2
  248. package/dist/lib/signing/server.d.mts +1 -1
  249. package/dist/lib/signing/server.d.ts +1 -1
  250. package/dist/lib/signing/server.js +4 -0
  251. package/dist/lib/signing/server.mjs +4 -0
  252. package/dist/lib/signing/types.d.mts +3 -0
  253. package/dist/lib/signing/types.d.ts +3 -0
  254. package/dist/lib/signing/verifier.js +1 -1
  255. package/dist/lib/signing/verifier.mjs +1 -1
  256. package/dist/lib/signing/web-bot-auth.d.mts +191 -0
  257. package/dist/lib/signing/web-bot-auth.d.ts +191 -0
  258. package/dist/lib/signing/web-bot-auth.js +837 -0
  259. package/dist/lib/signing/web-bot-auth.mjs +796 -0
  260. package/dist/lib/signing/webhook-verifier.js +1 -1
  261. package/dist/lib/signing/webhook-verifier.mjs +1 -1
  262. package/dist/lib/testing/client.d.mts +1 -4
  263. package/dist/lib/testing/client.d.ts +1 -4
  264. package/dist/lib/testing/client.js +141 -20
  265. package/dist/lib/testing/client.mjs +137 -19
  266. package/dist/lib/testing/compliance/comply.js +29 -10
  267. package/dist/lib/testing/compliance/comply.mjs +37 -11
  268. package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
  269. package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
  270. package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
  271. package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
  272. package/dist/lib/testing/storyboard/default-invariants.js +2 -0
  273. package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
  274. package/dist/lib/testing/storyboard/runner.js +23 -8
  275. package/dist/lib/testing/storyboard/runner.mjs +24 -8
  276. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  277. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  278. package/dist/lib/types/adcp.d.mts +4 -0
  279. package/dist/lib/types/adcp.d.ts +4 -0
  280. package/dist/lib/types/schemas.generated.d.ts +6 -6
  281. package/dist/lib/utils/capabilities.d.mts +1 -0
  282. package/dist/lib/utils/capabilities.d.ts +1 -0
  283. package/dist/lib/utils/capabilities.js +5 -0
  284. package/dist/lib/utils/capabilities.mjs +5 -0
  285. package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
  286. package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
  287. package/dist/lib/v2/projection/creative-delivery.d.mts +34 -10
  288. package/dist/lib/v2/projection/creative-delivery.d.ts +34 -10
  289. package/dist/lib/v2/projection/creative-delivery.js +26 -10
  290. package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
  291. package/dist/lib/v2/projection/index.d.mts +1 -1
  292. package/dist/lib/v2/projection/index.d.ts +1 -1
  293. package/dist/lib/v2/projection/index.js +2 -0
  294. package/dist/lib/v2/projection/index.mjs +2 -0
  295. package/dist/lib/v2/projection/legacy-routes.d.mts +34 -2
  296. package/dist/lib/v2/projection/legacy-routes.d.ts +34 -2
  297. package/dist/lib/v2/projection/legacy-routes.js +35 -2
  298. package/dist/lib/v2/projection/legacy-routes.mjs +32 -2
  299. package/dist/lib/validation/schema-loader.d.mts +2 -0
  300. package/dist/lib/validation/schema-loader.d.ts +2 -0
  301. package/dist/lib/validation/schema-loader.js +43 -4
  302. package/dist/lib/validation/schema-loader.mjs +39 -3
  303. package/dist/lib/version.d.mts +3 -3
  304. package/dist/lib/version.d.ts +3 -3
  305. package/dist/lib/version.js +3 -3
  306. package/dist/lib/version.mjs +3 -3
  307. package/docs/TYPE-SUMMARY.md +2 -2
  308. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
  309. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
  310. package/docs/guides/REPORTING-LEDGER.md +99 -29
  311. package/docs/guides/REPORTING-OPERATIONS.md +29 -13
  312. package/docs/guides/REPORTING-STABILITY.md +76 -0
  313. package/docs/guides/account-resolution.md +101 -0
  314. package/docs/llms.txt +3 -2
  315. package/docs/migration-12-to-13.md +15 -0
  316. package/docs/migration-14.x-rc-worksheet.md +4 -4
  317. package/docs/migration-agent-identity-3.3.md +494 -0
  318. package/docs/migration-agent-resolution-3.3.md +5 -0
  319. package/docs/migration-reporting-row-storage-alignment.md +137 -0
  320. package/examples/storyboards/account-sync-contract.yaml +57 -0
  321. package/package.json +17 -1
@@ -0,0 +1,1448 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var schemas_draft_exports = {};
20
+ __export(schemas_draft_exports, {
21
+ default: () => schemas_draft_default
22
+ });
23
+ module.exports = __toCommonJS(schemas_draft_exports);
24
+ var schemas_draft_default = [
25
+ {
26
+ $schema: "http://json-schema.org/draft-07/schema#",
27
+ $id: "/schemas/trust/v1/trust.json",
28
+ title: "trust.json",
29
+ "x-status": "experimental",
30
+ description: "An organization's agent trust record, hosted at /.well-known/trust.json on the organization's own host. Protocol-neutral core: the agents the organization runs (agents[]), the authority it delegates to others (grants[]), and the grants it has accepted from others (acknowledgements[]). Protocol-specific semantics live in namespaced roles and scopes (e.g. 'adcp:sales') and in per-protocol `profiles` objects; this draft defines the `adcp` profile. The organization a record speaks for is the host serving /.well-known/trust.json \u2014 never a value inside the document. Versioned independently of any one protocol. The v1 in the path is a namespace, not a stability promise: while x-status is experimental the schema may change in breaking ways. EXPERIMENTAL (x-status: experimental, feature id identity.trust_json). In AdCP 3.3 the experimental Web Bot Auth signing profile reads agents[] (origin and roles) when it evaluates a trust record derived from an agent's origin (docs/building/by-layer/L1/security.mdx, Web Bot Auth identities); grants[] are read once demand-side grants (#6033) land. Outside those uses, third parties, crawlers and registries MUST NOT treat a published trust.json as authority. brand.json behavior is unchanged for the RFC 9421 signing profile. The document name and its /.well-known path may change before graduation (the JournalList trust.txt naming outreach is still open), so do not treat the file name as frozen. An agent URL anywhere in this record identifies the agent by its canonical origin (see docs/reference/url-canonicalization.mdx): one agent per origin. See RFC #7809 and specs/agent-identity-3-3.md.",
31
+ definitions: {
32
+ domain: {
33
+ type: "string",
34
+ pattern: "^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$",
35
+ description: "A lowercase DNS host name (internationalized names in punycode)."
36
+ },
37
+ https_url: {
38
+ type: "string",
39
+ format: "uri",
40
+ pattern: "^https://",
41
+ description: "An HTTPS URL. Every such URL in this document is untrusted input and, when fetched, a fetch target: the pattern is not an SSRF check. Verifiers MUST apply their own SSRF validation (no userinfo, no private or link-local addresses, no redirects) and enforce body-size and item-count limits."
42
+ },
43
+ namespaced_token: {
44
+ type: "string",
45
+ pattern: "^[a-z0-9-]+:[a-z0-9_.-]+$",
46
+ description: "A '<namespace>:<name>' token. Each namespace is defined by the protocol that owns it (e.g. 'adcp:' by AdCP). Consumers MUST ignore tokens in namespaces they do not implement."
47
+ },
48
+ role: {
49
+ description: "Functional role of an agent. Tokens in the adcp namespace MUST be one of the AdCP agent types.",
50
+ anyOf: [
51
+ {
52
+ allOf: [
53
+ {
54
+ $ref: "#/definitions/namespaced_token"
55
+ },
56
+ {
57
+ not: {
58
+ pattern: "^adcp:"
59
+ }
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ type: "string",
65
+ enum: [
66
+ "adcp:brand",
67
+ "adcp:rights",
68
+ "adcp:measurement",
69
+ "adcp:governance",
70
+ "adcp:creative",
71
+ "adcp:sales",
72
+ "adcp:buying",
73
+ "adcp:signals"
74
+ ]
75
+ }
76
+ ]
77
+ },
78
+ scope: {
79
+ description: "An activity a grant covers. Tokens in the adcp namespace MUST be one of the AdCP scopes (brand.json authorized_operator scopes plus 'adcp:brand_identity'). The bare token '*' covers every scope in every namespace.",
80
+ anyOf: [
81
+ {
82
+ type: "string",
83
+ const: "*"
84
+ },
85
+ {
86
+ allOf: [
87
+ {
88
+ $ref: "#/definitions/namespaced_token"
89
+ },
90
+ {
91
+ not: {
92
+ pattern: "^adcp:"
93
+ }
94
+ }
95
+ ]
96
+ },
97
+ {
98
+ type: "string",
99
+ enum: [
100
+ "adcp:all",
101
+ "adcp:media_buying",
102
+ "adcp:creative_generation",
103
+ "adcp:rights_clearance",
104
+ "adcp:governance",
105
+ "adcp:measurement",
106
+ "adcp:agent_operations",
107
+ "adcp:brand_identity"
108
+ ]
109
+ }
110
+ ]
111
+ },
112
+ grant_source: {
113
+ description: "Where the grantor publishes the grant being acknowledged. Tokens in the adcp namespace MUST be a grant source AdCP defines: 'adcp:adagents' (the grantor's /.well-known/adagents.json authorized_agents[]) or 'adcp:trust' (the grantor's /.well-known/trust.json grants[]).",
114
+ anyOf: [
115
+ {
116
+ allOf: [
117
+ {
118
+ $ref: "#/definitions/namespaced_token"
119
+ },
120
+ {
121
+ not: {
122
+ pattern: "^adcp:"
123
+ }
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ type: "string",
129
+ enum: ["adcp:adagents", "adcp:trust"]
130
+ }
131
+ ]
132
+ },
133
+ open_profiles: {
134
+ type: "object",
135
+ description: "Per-protocol data keyed by namespace. Consumers MUST ignore namespaces they do not implement. Nothing in profiles is key material or authority for another namespace.",
136
+ propertyNames: {
137
+ pattern: "^[a-z0-9-]+$"
138
+ },
139
+ additionalProperties: {
140
+ type: "object"
141
+ }
142
+ },
143
+ agent: {
144
+ type: "object",
145
+ description: "An agent this organization runs, identified by the canonical origin of `url`. One agent per origin. Its signing keys are published only in the key directory at that origin (`/.well-known/http-message-signatures-directory`, Web Bot Auth), never in this document.",
146
+ properties: {
147
+ url: {
148
+ $ref: "#/definitions/https_url",
149
+ description: "Agent endpoint URL, which may carry a path. Its host eTLD+1 MUST equal the eTLD+1 of the organization this record speaks for."
150
+ },
151
+ roles: {
152
+ type: "array",
153
+ description: "What this agent does, as namespaced roles.",
154
+ items: {
155
+ $ref: "#/definitions/role"
156
+ },
157
+ minItems: 1,
158
+ uniqueItems: true
159
+ },
160
+ protocols: {
161
+ type: "array",
162
+ description: "Transport protocols the endpoint speaks. Informational.",
163
+ items: {
164
+ type: "string",
165
+ enum: ["mcp", "a2a"]
166
+ },
167
+ uniqueItems: true
168
+ },
169
+ id: {
170
+ type: "string",
171
+ description: "Operator-chosen identifier for logging and routing. Not an identity input."
172
+ },
173
+ description: {
174
+ type: "string"
175
+ },
176
+ countries: {
177
+ type: "array",
178
+ description: "ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global.",
179
+ items: {
180
+ type: "string",
181
+ pattern: "^[A-Z]{2}$"
182
+ }
183
+ },
184
+ profiles: {
185
+ allOf: [
186
+ {
187
+ $ref: "#/definitions/open_profiles"
188
+ },
189
+ {
190
+ properties: {
191
+ adcp: {
192
+ type: "object",
193
+ description: "AdCP profile for an agent entry. Carries the rights-agent fields from brand.json brand_agent_entry.",
194
+ properties: {
195
+ available_uses: {
196
+ type: "array",
197
+ items: {
198
+ $ref: "/schemas/enums/right-use.json"
199
+ },
200
+ minItems: 1
201
+ },
202
+ right_types: {
203
+ type: "array",
204
+ items: {
205
+ $ref: "/schemas/enums/right-type.json"
206
+ },
207
+ minItems: 1
208
+ },
209
+ onboarding: {
210
+ $ref: "/schemas/core/buyer-onboarding-posture.json",
211
+ description: "For a buying agent (role adcp:buying): how it considers sellers. Overrides record_profiles.adcp.onboarding for this agent."
212
+ }
213
+ },
214
+ additionalProperties: false
215
+ }
216
+ }
217
+ }
218
+ ]
219
+ },
220
+ last_updated: {
221
+ type: "string",
222
+ format: "date-time"
223
+ }
224
+ },
225
+ required: ["url", "roles"],
226
+ additionalProperties: false
227
+ },
228
+ granted_agent: {
229
+ type: "object",
230
+ description: "An agent a grant is limited to, matched by canonical origin. Grants never carry keys.",
231
+ properties: {
232
+ url: {
233
+ $ref: "#/definitions/https_url"
234
+ }
235
+ },
236
+ required: ["url"],
237
+ additionalProperties: false
238
+ },
239
+ grant: {
240
+ type: "object",
241
+ description: "Authority this organization delegates: 'the grantee (optionally only these agents) may act for us, for these scopes, in these countries, during this window.' Non-transitive: a grantee never extends a grant it received. It MAY make its own grant to one intermediary for scopes it holds, and effective authority is the intersection along that chain (brands, countries, scopes, earliest valid_until); the intermediary cannot grant further. In the AdCP profile this is the demand-side grant (#6033, DR-0025): relying parties evaluate it at sync_accounts from the brand's own record. When this document is fetched successfully, brand.json authorized_operators[] is not consulted for the same grantor.",
242
+ properties: {
243
+ grantee: {
244
+ $ref: "#/definitions/domain",
245
+ description: "Domain of the organization receiving the grant. Its agents resolve to this domain through its own trust.json."
246
+ },
247
+ agents: {
248
+ type: "array",
249
+ description: "Optional narrowing to specific agents the grantee runs. When absent, any agent that resolves to the grantee acts under the grant.",
250
+ items: {
251
+ $ref: "#/definitions/granted_agent"
252
+ },
253
+ minItems: 1
254
+ },
255
+ scopes: {
256
+ type: "array",
257
+ items: {
258
+ $ref: "#/definitions/scope"
259
+ },
260
+ minItems: 1,
261
+ uniqueItems: true
262
+ },
263
+ countries: {
264
+ type: "array",
265
+ description: "ISO 3166-1 alpha-2 country codes where the grant applies. Omit for global.",
266
+ items: {
267
+ type: "string",
268
+ pattern: "^[A-Z]{2}$"
269
+ }
270
+ },
271
+ valid_from: {
272
+ type: "string",
273
+ format: "date-time",
274
+ description: "Consumers MUST ignore the grant before this time."
275
+ },
276
+ valid_until: {
277
+ type: "string",
278
+ format: "date-time",
279
+ description: "Consumers MUST treat the grant as inactive at or after this time, on every check."
280
+ },
281
+ profiles: {
282
+ allOf: [
283
+ {
284
+ $ref: "#/definitions/open_profiles"
285
+ },
286
+ {
287
+ properties: {
288
+ adcp: {
289
+ type: "object",
290
+ description: "AdCP profile for a grant.",
291
+ properties: {
292
+ brands: {
293
+ type: "array",
294
+ description: "Brand IDs from this organization's brand.json that the grant covers. ['*'] or omitted means every brand the grantor owns.",
295
+ items: {
296
+ type: "string",
297
+ pattern: "^([a-z0-9_]+|\\*)$"
298
+ },
299
+ minItems: 1
300
+ }
301
+ },
302
+ additionalProperties: false
303
+ }
304
+ }
305
+ }
306
+ ]
307
+ },
308
+ last_updated: {
309
+ type: "string",
310
+ format: "date-time"
311
+ }
312
+ },
313
+ required: ["grantee", "scopes"],
314
+ additionalProperties: false
315
+ },
316
+ acknowledgement: {
317
+ type: "object",
318
+ description: "This organization's acceptance of a grant another organization published: 'we accept the grant `grantor` gave to `agent_url`, as published via `via`.' Terms are read ONLY from the grantor's document and are never restated here. Not needed when the grantor has the same eTLD+1 as the host serving this document. In the AdCP profile with via 'adcp:adagents' this is intended to supersede brand.json properties[] entries whose relationship is direct, delegated, or ad_network in a future release; brand.json is unchanged in 3.3.",
319
+ properties: {
320
+ grantor: {
321
+ $ref: "#/definitions/domain",
322
+ description: "The organization that published the grant."
323
+ },
324
+ agent_url: {
325
+ $ref: "#/definitions/https_url",
326
+ description: "The granted agent. MUST match an agents[] entry in this same document by canonical origin; an acknowledgement for an agent this organization does not run is invalid and MUST be ignored."
327
+ },
328
+ via: {
329
+ $ref: "#/definitions/grant_source",
330
+ description: "Where the grant is published. For 'adcp:adagents', verifiers resolve https://{grantor}/.well-known/adagents.json (following authoritative_location and managed-network rules) and require an authorized_agents[] entry whose canonical url equals agent_url and that reaches the grantor under the reachable-publisher rule. One acknowledgement covers every entry for that agent URL, whatever its authorization_type. The adagents.json comparison is by canonical URL, as that file defines (see docs/reference/url-canonicalization.mdx), not by origin."
331
+ },
332
+ profiles: {
333
+ allOf: [
334
+ {
335
+ $ref: "#/definitions/open_profiles"
336
+ },
337
+ {
338
+ properties: {
339
+ adcp: {
340
+ type: "object",
341
+ description: "AdCP profile for an acknowledgement.",
342
+ properties: {
343
+ delegation_type: {
344
+ type: "string",
345
+ enum: ["direct", "delegated", "ad_network"],
346
+ description: "Optional operator-side assertion of the commercial relationship, for sellers.json-style cross-checking. When present it MUST equal the publisher's delegation_type; a mismatch fails the acknowledgement (state 'mismatch'). Omit to defer entirely to the publisher."
347
+ }
348
+ },
349
+ additionalProperties: false
350
+ }
351
+ }
352
+ }
353
+ ]
354
+ },
355
+ last_updated: {
356
+ type: "string",
357
+ format: "date-time"
358
+ }
359
+ },
360
+ required: ["grantor", "agent_url", "via"],
361
+ additionalProperties: false
362
+ },
363
+ record_profiles: {
364
+ allOf: [
365
+ {
366
+ $ref: "#/definitions/open_profiles"
367
+ },
368
+ {
369
+ properties: {
370
+ adcp: {
371
+ type: "object",
372
+ description: "AdCP profile for the whole record.",
373
+ properties: {
374
+ identity_relying_parties: {
375
+ type: "array",
376
+ description: "Verified-identity relying parties this organization operates (TMP Identity Match attestation provenance). Intended to move here from brand.json in a future release; brand.json is unchanged in 3.3. Experimental.",
377
+ items: {
378
+ $ref: "/schemas/core/identity-relying-party.json"
379
+ }
380
+ },
381
+ onboarding: {
382
+ $ref: "/schemas/core/buyer-onboarding-posture.json",
383
+ description: "Default buyer onboarding posture for every buying agent this record lists; an agent entry's profiles.adcp.onboarding overrides it."
384
+ }
385
+ },
386
+ additionalProperties: false
387
+ }
388
+ }
389
+ }
390
+ ]
391
+ }
392
+ },
393
+ oneOf: [
394
+ {
395
+ type: "object",
396
+ title: "Authoritative Location Redirect",
397
+ description: "Pointer for hosted records (a managed network, a platform, AAO hosting). The organization is still the host that served this pointer. Verifiers follow at most one hop, with zero HTTP redirects, and MUST NOT follow a second pointer. Hosts serving records on an organization's behalf MUST only serve records the organization controls.",
398
+ properties: {
399
+ $schema: {
400
+ type: "string"
401
+ },
402
+ authoritative_location: {
403
+ $ref: "#/definitions/https_url",
404
+ description: "HTTPS URL of the authoritative trust.json for this host."
405
+ },
406
+ last_updated: {
407
+ type: "string",
408
+ format: "date-time"
409
+ }
410
+ },
411
+ required: ["authoritative_location"],
412
+ additionalProperties: false
413
+ },
414
+ {
415
+ type: "object",
416
+ title: "Trust Record",
417
+ properties: {
418
+ $schema: {
419
+ type: "string"
420
+ },
421
+ version: {
422
+ type: "string"
423
+ },
424
+ last_updated: {
425
+ type: "string",
426
+ format: "date-time"
427
+ },
428
+ agents: {
429
+ type: "array",
430
+ description: "Agents this organization runs.",
431
+ items: {
432
+ $ref: "#/definitions/agent"
433
+ }
434
+ },
435
+ grants: {
436
+ type: "array",
437
+ description: "Authority this organization delegates to others.",
438
+ items: {
439
+ $ref: "#/definitions/grant"
440
+ }
441
+ },
442
+ exclusive_grants: {
443
+ type: "boolean",
444
+ default: false,
445
+ description: "When true, grants[] is exhaustive for every scope it names: relying parties MUST reject acts-for claims no active grant covers. When false or absent, an uncovered claim is at the relying party's discretion. A fetch failure is never equivalent to an absent grant; once a relying party has seen exclusive_grants: true for a host, it MUST fail closed on fetch failure."
446
+ },
447
+ acknowledgements: {
448
+ type: "array",
449
+ description: "Inline acknowledgements. Mutually exclusive with acknowledgements_url. Organizations acknowledging more than a few hundred grants SHOULD use acknowledgements_url so the key-resolution fetch stays small.",
450
+ items: {
451
+ $ref: "#/definitions/acknowledgement"
452
+ }
453
+ },
454
+ acknowledgements_url: {
455
+ $ref: "#/definitions/https_url",
456
+ description: "Same-host HTTPS URL of a trust-acknowledgements.json sub-document (untrusted input; see https_url). Fetched only by verifiers checking a grant relationship, never on the signature-verification path, under its own size and cache profile."
457
+ },
458
+ profiles: {
459
+ $ref: "#/definitions/record_profiles"
460
+ },
461
+ ext: {
462
+ type: "object",
463
+ description: "Vendor extensions, namespaced as ext.{vendor}. The top level is closed so it cannot become a catch-all. Never key material or authority.",
464
+ additionalProperties: {
465
+ type: "object"
466
+ }
467
+ }
468
+ },
469
+ anyOf: [
470
+ {
471
+ required: ["agents"]
472
+ },
473
+ {
474
+ required: ["grants"]
475
+ },
476
+ {
477
+ required: ["acknowledgements"]
478
+ },
479
+ {
480
+ required: ["acknowledgements_url"]
481
+ },
482
+ {
483
+ required: ["profiles"]
484
+ }
485
+ ],
486
+ not: {
487
+ required: ["acknowledgements", "acknowledgements_url"]
488
+ },
489
+ additionalProperties: false
490
+ }
491
+ ]
492
+ },
493
+ {
494
+ $schema: "http://json-schema.org/draft-07/schema#",
495
+ $id: "/schemas/core/agent-onboarding-requirement.json",
496
+ title: "Agent Onboarding Requirement",
497
+ "x-status": "experimental",
498
+ description: "One requirement an onboarding mode imposes, discriminated by kind. Only aao_verified, storyboard, and experimental_feature carry fields; other kinds are the kind alone. The requirement describes the gate the publishing party applies on its own side; it creates no conformance obligation on the counterparty.",
499
+ type: "object",
500
+ properties: {
501
+ kind: {
502
+ $ref: "/schemas/enums/agent-onboarding-requirement-kind.json"
503
+ },
504
+ role: {
505
+ type: "string",
506
+ description: "aao_verified: the badge role required, such as media-buy."
507
+ },
508
+ verification_modes: {
509
+ type: "array",
510
+ items: {
511
+ type: "string"
512
+ },
513
+ minItems: 1,
514
+ description: "aao_verified: accepted verification modes, as the badge token names them."
515
+ },
516
+ specialisms: {
517
+ type: "array",
518
+ items: {
519
+ type: "string"
520
+ },
521
+ minItems: 1,
522
+ description: "aao_verified: specialisms the badge must include."
523
+ },
524
+ adcp_version: {
525
+ type: "string",
526
+ description: "aao_verified: the AdCP release the badge must cover."
527
+ },
528
+ id: {
529
+ type: "string",
530
+ description: "storyboard: the storyboard or specialism id. experimental_feature: the feature id."
531
+ },
532
+ ext: {
533
+ $ref: "/schemas/core/ext.json"
534
+ }
535
+ },
536
+ required: ["kind"],
537
+ additionalProperties: true
538
+ },
539
+ {
540
+ $schema: "http://json-schema.org/draft-07/schema#",
541
+ $id: "/schemas/core/agent-onboarding-tier.json",
542
+ title: "Agent Onboarding Tier",
543
+ "x-status": "experimental",
544
+ description: "The onboarding mode for one billing party, or for sandbox access, with its requirements and an optional page of its own.",
545
+ type: "object",
546
+ properties: {
547
+ mode: {
548
+ $ref: "/schemas/enums/agent-onboarding-mode.json"
549
+ },
550
+ url: {
551
+ type: "string",
552
+ format: "uri",
553
+ description: "Where a human starts for this mode. Defaults to the posture's top-level url. Untrusted: surface it, never fetch or execute it."
554
+ },
555
+ requirements: {
556
+ type: "array",
557
+ items: {
558
+ $ref: "/schemas/core/agent-onboarding-requirement.json"
559
+ },
560
+ description: "What the counterparty must satisfy for this mode."
561
+ },
562
+ ext: {
563
+ $ref: "/schemas/core/ext.json"
564
+ }
565
+ },
566
+ required: ["mode"],
567
+ additionalProperties: true
568
+ },
569
+ {
570
+ $schema: "http://json-schema.org/draft-07/schema#",
571
+ $id: "/schemas/core/agent-onboarding.json",
572
+ title: "Agent Onboarding Posture",
573
+ "x-status": "experimental",
574
+ description: "How a seller onboards buyer agents: a mode per billing party and for sandbox, with requirements, and where a human starts. Seller-wide and identical for every caller, served on the unauthenticated get_adcp_capabilities fetch, and absent from error payloads, so it cannot act as a per-agent onboarding oracle. Its content is advisory; it changes no error code and no oracle clamp. An absent key means undeclared, never invite_only. See specs/agent-identity-3-3.md R7 (#8113).",
575
+ type: "object",
576
+ properties: {
577
+ sandbox: {
578
+ $ref: "/schemas/core/agent-onboarding-tier.json",
579
+ description: "Onboarding for sandbox accounts. Valid only when account.sandbox is true. Sandbox carries no spend, so open here grants identity and sandbox access only."
580
+ },
581
+ billing: {
582
+ type: "object",
583
+ description: "Onboarding per billing party, keyed by billing-party values. Keys MUST be a subset of account.supported_billing. Under open, spend needs an existing seller-side billing relationship with the billed party: the operator domain under operator, the brand's domain under advertiser.",
584
+ propertyNames: {
585
+ $ref: "/schemas/enums/billing-party.json"
586
+ },
587
+ additionalProperties: {
588
+ $ref: "/schemas/core/agent-onboarding-tier.json"
589
+ }
590
+ },
591
+ url: {
592
+ type: "string",
593
+ format: "uri",
594
+ description: "Where a human at the buyer starts when a mode has no url of its own. Untrusted: surface it, never fetch or execute it."
595
+ },
596
+ documentation_url: {
597
+ type: "string",
598
+ format: "uri",
599
+ description: "The seller's onboarding and integration documentation. Untrusted, like url."
600
+ },
601
+ message: {
602
+ type: "string",
603
+ description: "Human-readable summary of the process and what to have ready. The fallback whenever a reader does not understand a requirement."
604
+ },
605
+ ext: {
606
+ $ref: "/schemas/core/ext.json"
607
+ }
608
+ },
609
+ additionalProperties: true
610
+ },
611
+ {
612
+ $schema: "http://json-schema.org/draft-07/schema#",
613
+ $id: "/schemas/core/buyer-onboarding-posture.json",
614
+ title: "Buyer Onboarding Posture",
615
+ "x-status": "experimental",
616
+ description: "How a buying agent considers sellers: a mode, the requirements a seller must meet, and where a seller's human starts. Published in the buyer's trust.json agent entry (profiles.adcp.onboarding), or as a record-level default (record_profiles.adcp.onboarding). Public and identical for every reader. A buyer that serves get_adcp_capabilities is authoritative there; trust.json may mirror it. See specs/agent-identity-3-3.md R7 (#8114).",
617
+ type: "object",
618
+ properties: {
619
+ mode: {
620
+ $ref: "/schemas/enums/buyer-onboarding-mode.json"
621
+ },
622
+ requirements: {
623
+ type: "array",
624
+ items: {
625
+ $ref: "/schemas/core/agent-onboarding-requirement.json"
626
+ },
627
+ description: "What a seller must satisfy. Uses the kinds that apply when a buyer gates a seller (aao_verified, storyboard, sandbox, experimental_feature); others are ignored."
628
+ },
629
+ url: {
630
+ type: "string",
631
+ format: "uri",
632
+ description: "Where a seller's human starts. Untrusted: surface it, never fetch or execute it."
633
+ },
634
+ documentation_url: {
635
+ type: "string",
636
+ format: "uri",
637
+ description: "The buyer's documentation for sellers. Untrusted, like url."
638
+ },
639
+ message: {
640
+ type: "string",
641
+ description: "Human-readable summary; the fallback whenever a reader does not understand a requirement."
642
+ },
643
+ ext: {
644
+ $ref: "/schemas/core/ext.json"
645
+ }
646
+ },
647
+ required: ["mode"],
648
+ additionalProperties: true
649
+ },
650
+ {
651
+ $schema: "http://json-schema.org/draft-07/schema#",
652
+ $id: "/schemas/enums/agent-onboarding-mode.json",
653
+ title: "Agent Onboarding Mode",
654
+ "x-status": "experimental",
655
+ description: "How a seller onboards buyer agents for one billing party or for sandbox access. Absent means undeclared, never invite_only.",
656
+ type: "string",
657
+ enum: ["open", "application", "invite_only"],
658
+ enumDescriptions: {
659
+ open: "A buyer agent that meets every listed requirement and whose identity the seller can establish from the agent's published keys (the Web Bot Auth profile) may proceed without prior contact. open binds identity, not spend: spend still needs an existing billing relationship with the billed party, and a brand outside the buyer's operator domain needs a grant. A seller that only maps opaque, seller-issued credentials MUST NOT declare open.",
660
+ application: "The buyer completes an out-of-band step at url before the seller recognizes it for this mode.",
661
+ invite_only: "The seller does not accept unsolicited buyer agents for this mode. url MAY be absent."
662
+ }
663
+ },
664
+ {
665
+ $schema: "http://json-schema.org/draft-07/schema#",
666
+ $id: "/schemas/enums/agent-onboarding-requirement-kind.json",
667
+ title: "Agent Onboarding Requirement Kind",
668
+ "x-status": "experimental",
669
+ description: "What a counterparty must satisfy before an onboarding mode applies. Each kind states the direction it applies to; a kind used in the other direction is ignored. Readers MUST treat an unknown kind as unsatisfiable by machine and fall back to the posture's message and url.",
670
+ type: "string",
671
+ "x-extensible": true,
672
+ enum: [
673
+ "agent_identity",
674
+ "grant",
675
+ "billing_entity",
676
+ "contract",
677
+ "credit_application",
678
+ "aao_verified",
679
+ "storyboard",
680
+ "sandbox",
681
+ "experimental_feature"
682
+ ],
683
+ enumDescriptions: {
684
+ agent_identity: "Seller gating a buyer. The buyer agent's origin is listed in its operator's trust.json with the role the seller needs (adcp:buying).",
685
+ grant: "Seller gating a buyer. A demand-side grant authorizes the buyer's operator for the account's brand (DR-0025); implicit when the operator is the brand.",
686
+ billing_entity: "Seller gating a buyer. The buyer supplies a billing entity (core/business-entity.json) on sync_accounts.",
687
+ contract: "Seller gating a buyer. A signed agreement exists; details at url.",
688
+ credit_application: "Seller gating a buyer. A credit application is completed at url, or later through sync_accounts setup.url.",
689
+ aao_verified: "Buyer gating a seller. The seller holds an AgenticAdvertising.org Verified badge; role is required, and verification_modes, specialisms, and adcp_version narrow it.",
690
+ storyboard: "Buyer gating a seller. The seller passes the named storyboard or specialism (id).",
691
+ sandbox: "Buyer gating a seller. The seller declares account.sandbox: true.",
692
+ experimental_feature: "Buyer gating a seller. The seller lists the named feature id (id) in experimental_features."
693
+ }
694
+ },
695
+ {
696
+ $schema: "http://json-schema.org/draft-07/schema#",
697
+ $id: "/schemas/enums/buyer-onboarding-mode.json",
698
+ title: "Buyer Onboarding Mode",
699
+ "x-status": "experimental",
700
+ description: "How a buyer considers sellers for its plans. Distinct from the seller-side agent-onboarding-mode, whose open means something else. Absent means undeclared.",
701
+ type: "string",
702
+ enum: ["considers_unsolicited", "application", "invite_only"],
703
+ enumDescriptions: {
704
+ considers_unsolicited: "A seller that meets every listed requirement is in the buyer's consideration set without prior contact; the buyer discovers and calls it. Nothing is sent to the buyer.",
705
+ application: "The seller completes an out-of-band step at url before the buyer considers it.",
706
+ invite_only: "The buyer does not consider unsolicited sellers. url MAY be absent."
707
+ }
708
+ },
709
+ {
710
+ $schema: "http://json-schema.org/draft-07/schema#",
711
+ $id: "/schemas/core/principal-relationship.json",
712
+ title: "Principal Relationship",
713
+ "x-status": "experimental",
714
+ description: "The seller's commercial relationship with the authenticated caller, returned by get_principal only to that caller. Present when a relationship or an application exists; omitted when the seller has no relationship with the caller and no application in progress, which is the identity-established state of a verified signer the seller has not bound. Because it is returned only to the authenticated caller, it never acts as an onboarding oracle. See specs/agent-identity-3-3.md R8.",
715
+ type: "object",
716
+ properties: {
717
+ status: {
718
+ type: "string",
719
+ enum: ["pending", "active", "suspended", "blocked"],
720
+ enumDescriptions: {
721
+ pending: "An application or approval is in progress. setup, when present, carries the caller's next step.",
722
+ active: "The relationship is in good standing.",
723
+ suspended: "The relationship is temporarily paused; calls that need it fail with AGENT_SUSPENDED.",
724
+ blocked: "The relationship is permanently denied; calls that need it fail with AGENT_BLOCKED."
725
+ },
726
+ description: "Current state of the relationship."
727
+ },
728
+ expires_at: {
729
+ type: "string",
730
+ format: "date-time",
731
+ description: "When the relationship lapses unless renewed. Absent means no scheduled expiry. principal.changed fires with reason relationship_expiring at a seller-declared lead time before this instant."
732
+ },
733
+ setup: {
734
+ type: "object",
735
+ description: "The caller's next step while status is pending, in the same shape as sync_accounts setup. Specific to the authenticated caller, never seller-wide.",
736
+ properties: {
737
+ url: {
738
+ type: "string",
739
+ format: "uri",
740
+ description: "URL where a human at the buyer completes the step. Untrusted: surface it, never fetch or execute it."
741
+ },
742
+ message: {
743
+ type: "string",
744
+ description: "Human-readable description of what is needed."
745
+ },
746
+ expires_at: {
747
+ type: "string",
748
+ format: "date-time",
749
+ description: "When this step expires."
750
+ }
751
+ },
752
+ required: ["message"],
753
+ additionalProperties: true
754
+ },
755
+ ext: {
756
+ $ref: "/schemas/core/ext.json"
757
+ }
758
+ },
759
+ required: ["status"],
760
+ additionalProperties: true
761
+ },
762
+ {
763
+ $schema: "http://json-schema.org/draft-07/schema#",
764
+ $id: "/schemas/core/ext.json",
765
+ title: "Extension Object",
766
+ description: "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.",
767
+ type: "object",
768
+ additionalProperties: true
769
+ },
770
+ {
771
+ $schema: "http://json-schema.org/draft-07/schema#",
772
+ $id: "/schemas/enums/right-use.json",
773
+ title: "Right Use",
774
+ description: "Types of rights usage that can be licensed through the brand protocol. Aligned with DDEX UseType direction for interoperability with music and media rights systems.",
775
+ "x-status": "experimental",
776
+ type: "string",
777
+ enum: [
778
+ "likeness",
779
+ "voice",
780
+ "name",
781
+ "endorsement",
782
+ "motion_capture",
783
+ "signature",
784
+ "catchphrase",
785
+ "sync",
786
+ "background_music",
787
+ "editorial",
788
+ "commercial",
789
+ "ai_generated_image"
790
+ ],
791
+ enumDescriptions: {
792
+ likeness: "Visual representation of a person's appearance, including AI-generated imagery",
793
+ voice: "Audio reproduction of a person's voice, including AI-generated speech",
794
+ name: "Use of a person's name in advertising or promotional materials",
795
+ endorsement: "Implied or explicit endorsement of a product or service by a person",
796
+ motion_capture: "Use of a person's movement patterns for animation or video",
797
+ signature: "Use of a person's signature or autograph",
798
+ catchphrase: "Use of a person's well-known phrases or sayings",
799
+ sync: "Synchronization of music with visual media (ads, video)",
800
+ background_music: "Use of music as background audio in advertising",
801
+ editorial: "Use in editorial or informational contexts",
802
+ commercial: "Use in commercial advertising and promotional contexts",
803
+ ai_generated_image: "License to produce AI-generated still imagery derived from the rights holder's IP (brand assets, character designs, talent likeness). Distinct from likeness/voice by output modality \u2014 a get_rights query filtered on ai_generated_image returns rights whose pricing options cover image generation, regardless of the underlying IP category."
804
+ }
805
+ },
806
+ {
807
+ $schema: "http://json-schema.org/draft-07/schema#",
808
+ $id: "/schemas/enums/right-type.json",
809
+ title: "Right Type",
810
+ description: "Categories of intellectual property rights that can be licensed through the brand protocol.",
811
+ "x-status": "experimental",
812
+ type: "string",
813
+ enum: ["talent", "character", "brand_ip", "music", "stock_media"],
814
+ enumDescriptions: {
815
+ talent: "Rights to a real person's likeness, voice, name, or endorsement (athletes, celebrities, influencers)",
816
+ character: "Rights to fictional characters for advertising or co-branding",
817
+ brand_ip: "Rights to brand intellectual property (logos, trademarks, trade dress)",
818
+ music: "Rights to musical compositions or recordings (sync, background music)",
819
+ stock_media: "Rights to stock photography, video, or audio collections"
820
+ }
821
+ },
822
+ {
823
+ $schema: "http://json-schema.org/draft-07/schema#",
824
+ $id: "/schemas/core/identity-relying-party.json",
825
+ title: "Identity Relying Party",
826
+ type: "object",
827
+ description: "A verified-identity relying party an entity or brand operates. Used for attestation provenance in TMP Identity Match (the buyer checks a forwarded attestation's relying_party_id against the owner's published list). Issuer-agnostic; World ID is the first issuer.",
828
+ properties: {
829
+ issuer: {
830
+ $ref: "/schemas/core/brand-ref.json",
831
+ description: `Identity issuer / attestation authority, referenced as a vendor BrandRef (e.g. {"domain": "world.org"}) \u2014 the same vendor-reference shape AdCP uses for measurement and signals vendors. The issuer's canonical domain is the anchor; it need not host a brand.json, but if it does, that is where its verifier metadata (scheme versions, verify endpoint, JWKs) lives. Issuer-agnostic: World ID, ISO 18013-5 mDL, and W3C-VC issuers all reference by domain. The relying party is namespaced by the issuer \u2014 identity is the tuple (issuer.domain, issuer.brand_id, relying_party_id), mirroring (vendor.domain, vendor.brand_id, metric_id).`
832
+ },
833
+ scheme: {
834
+ type: "string",
835
+ description: 'Proof scheme and version, e.g. "world_id_v4".'
836
+ },
837
+ relying_party_id: {
838
+ type: "string",
839
+ "x-entity": "identity_relying_party",
840
+ description: "The relying-party id registered with the issuer (and, for on-chain issuers like World ID, with the issuer's registry). One entity may operate many relying parties (scope=entity vs scope=property); this is the attestation's audience / linkability boundary, not an entity identifier."
841
+ },
842
+ scope: {
843
+ type: "string",
844
+ enum: ["entity", "property"],
845
+ description: "Whether this relying_party_id is shared across the entity's properties (entity \u2192 a within-entity unique-human graph) or scoped to a single property (property \u2192 per-property pseudonyms, unlinkable across the entity)."
846
+ }
847
+ },
848
+ required: ["issuer", "relying_party_id"],
849
+ additionalProperties: false
850
+ },
851
+ {
852
+ $schema: "http://json-schema.org/draft-07/schema#",
853
+ $id: "/schemas/enums/billing-party.json",
854
+ title: "Billing Party",
855
+ description: "Which party the seller invoices for a buyer\u2013storefront account relationship. Determines the billing entity and invoicing flow, not a payment rail, clearing intermediary, or per-media-buy settlement route. AdCP does not perform in-protocol payment or settlement.",
856
+ type: "string",
857
+ enum: ["operator", "agent", "advertiser"],
858
+ enumDescriptions: {
859
+ operator: "Seller invoices the operator \u2014 agency or brand buying direct",
860
+ agent: "Agent consolidates billing across brands and is invoiced by the seller",
861
+ advertiser: "Seller invoices the advertiser directly, even when a different operator places orders on their behalf"
862
+ }
863
+ },
864
+ {
865
+ $schema: "http://json-schema.org/draft-07/schema#",
866
+ $id: "/schemas/core/brand-ref.json",
867
+ title: "Brand Reference",
868
+ description: "Reference to a brand by domain and optional brand_id. The domain hosts /.well-known/brand.json or is registered in the brand registry. For single-brand domains, brand_id can be omitted. For house-of-brands domains, brand_id identifies the specific brand. For creative production, brand.json is the canonical source of master brand identity (logo, palette, fonts, voice, and visual guidelines), subject only to the supported per-call fields in brand_kit_override. Catalogs supply product or item payload; catalog item asset groups, including property- or franchise-level logos, are item identity and do not override these master brand fields.",
869
+ type: "object",
870
+ properties: {
871
+ domain: {
872
+ type: "string",
873
+ description: "Domain where /.well-known/brand.json is hosted, or the brand's operating domain",
874
+ pattern: "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"
875
+ },
876
+ brand_id: {
877
+ $ref: "/schemas/core/brand-id.json",
878
+ description: "Brand identifier within the house portfolio. Optional for single-brand domains."
879
+ },
880
+ countries: {
881
+ type: "array",
882
+ items: {
883
+ type: "string",
884
+ pattern: "^[A-Z]{2}$"
885
+ },
886
+ minItems: 1,
887
+ uniqueItems: true,
888
+ description: "Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting."
889
+ },
890
+ industries: {
891
+ type: "array",
892
+ items: {
893
+ type: "string"
894
+ },
895
+ description: "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."
896
+ },
897
+ data_subject_contestation: {
898
+ type: "object",
899
+ description: "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 \u2192 house \u2192 missing.",
900
+ properties: {
901
+ url: {
902
+ type: "string",
903
+ format: "uri",
904
+ pattern: "^https://"
905
+ },
906
+ email: {
907
+ type: "string",
908
+ format: "email"
909
+ },
910
+ languages: {
911
+ type: "array",
912
+ items: {
913
+ type: "string"
914
+ }
915
+ }
916
+ },
917
+ anyOf: [
918
+ {
919
+ required: ["url"]
920
+ },
921
+ {
922
+ required: ["email"]
923
+ }
924
+ ],
925
+ additionalProperties: false
926
+ },
927
+ brand_kit_override: {
928
+ type: "object",
929
+ description: "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 \u2014 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` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**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 \u2014 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 \u2014 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.",
930
+ properties: {
931
+ logo: {
932
+ $ref: "/schemas/core/assets/image-asset.json",
933
+ description: "Override logo asset."
934
+ },
935
+ colors: {
936
+ type: "object",
937
+ description: "Override brand colors (hex strings).",
938
+ properties: {
939
+ primary: {
940
+ type: "string",
941
+ pattern: "^#[0-9a-fA-F]{6}$"
942
+ },
943
+ secondary: {
944
+ type: "string",
945
+ pattern: "^#[0-9a-fA-F]{6}$"
946
+ },
947
+ accent: {
948
+ type: "string",
949
+ pattern: "^#[0-9a-fA-F]{6}$"
950
+ }
951
+ },
952
+ additionalProperties: true
953
+ },
954
+ voice: {
955
+ type: "string",
956
+ description: "Override brand-voice description for surface-composed text/audio output."
957
+ },
958
+ tagline: {
959
+ type: "string",
960
+ description: "Override tagline."
961
+ }
962
+ },
963
+ additionalProperties: true
964
+ }
965
+ },
966
+ required: ["domain"],
967
+ additionalProperties: false,
968
+ examples: [
969
+ {
970
+ domain: "nova-brands.com",
971
+ brand_id: "spark"
972
+ },
973
+ {
974
+ domain: "nova-brands.com",
975
+ brand_id: "glow"
976
+ },
977
+ {
978
+ domain: "acme-corp.com"
979
+ },
980
+ {
981
+ domain: "nova-athletics.example",
982
+ countries: ["NL"]
983
+ }
984
+ ]
985
+ },
986
+ {
987
+ $schema: "http://json-schema.org/draft-07/schema#",
988
+ $id: "/schemas/core/brand-id.json",
989
+ title: "Brand ID",
990
+ description: "Identifier for a brand within a house portfolio. Must be lowercase alphanumeric with underscores only. The house chooses this identifier.",
991
+ type: "string",
992
+ pattern: "^[a-z0-9_]+$",
993
+ "x-entity": "advertiser_brand",
994
+ examples: ["tide", "cheerios", "air_jordan", "nike", "pampers"]
995
+ },
996
+ {
997
+ $schema: "http://json-schema.org/draft-07/schema#",
998
+ $id: "/schemas/core/assets/image-asset.json",
999
+ title: "Image Asset",
1000
+ description: "Image asset with URL and dimensions",
1001
+ type: "object",
1002
+ properties: {
1003
+ asset_type: {
1004
+ type: "string",
1005
+ const: "image",
1006
+ description: "Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."
1007
+ },
1008
+ url: {
1009
+ type: "string",
1010
+ format: "uri",
1011
+ description: "URL to the image asset"
1012
+ },
1013
+ width: {
1014
+ type: "integer",
1015
+ minimum: 1,
1016
+ description: "Width in pixels"
1017
+ },
1018
+ height: {
1019
+ type: "integer",
1020
+ minimum: 1,
1021
+ description: "Height in pixels"
1022
+ },
1023
+ file_size_bytes: {
1024
+ type: "integer",
1025
+ minimum: 1,
1026
+ description: "Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint."
1027
+ },
1028
+ pixel_ratio: {
1029
+ type: "number",
1030
+ exclusiveMinimum: 0,
1031
+ description: "Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields."
1032
+ },
1033
+ state_id: {
1034
+ type: "string",
1035
+ description: "Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots."
1036
+ },
1037
+ breakpoint_id: {
1038
+ type: "string",
1039
+ description: "Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots."
1040
+ },
1041
+ focal_point: {
1042
+ type: "array",
1043
+ items: {
1044
+ type: "number",
1045
+ minimum: 0,
1046
+ maximum: 1
1047
+ },
1048
+ minItems: 2,
1049
+ maxItems: 2,
1050
+ description: "Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults."
1051
+ },
1052
+ format: {
1053
+ type: "string",
1054
+ description: "Image file format (jpg, png, gif, webp, etc.)"
1055
+ },
1056
+ alt_text: {
1057
+ type: "string",
1058
+ description: "Alternative text for accessibility",
1059
+ "x-accessibility": true
1060
+ },
1061
+ provenance: {
1062
+ $ref: "/schemas/core/provenance.json",
1063
+ description: "Provenance metadata for this asset, overrides manifest-level provenance"
1064
+ }
1065
+ },
1066
+ required: ["asset_type", "url", "width", "height"],
1067
+ additionalProperties: true
1068
+ },
1069
+ {
1070
+ $schema: "http://json-schema.org/draft-07/schema#",
1071
+ $id: "/schemas/core/provenance.json",
1072
+ title: "Provenance",
1073
+ description: "Declares how content was produced, whether AI was involved, and what disclosure obligations apply. Attaches to creative manifests, individual assets, or content-standards artifacts. When present at multiple levels, the most specific provenance object replaces the inherited one entirely (no field-level merging). Provenance is a claim by the declaring party \u2014 receiving parties should verify claims independently via their own detection tools.",
1074
+ type: "object",
1075
+ properties: {
1076
+ digital_source_type: {
1077
+ $ref: "/schemas/enums/digital-source-type.json",
1078
+ description: "IPTC-aligned classification of AI involvement in producing this content"
1079
+ },
1080
+ synthetic_depiction: {
1081
+ type: "boolean",
1082
+ description: "Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`."
1083
+ },
1084
+ ai_tool: {
1085
+ type: "object",
1086
+ description: "AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.",
1087
+ properties: {
1088
+ name: {
1089
+ type: "string",
1090
+ description: "Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"
1091
+ },
1092
+ version: {
1093
+ type: "string",
1094
+ description: "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."
1095
+ },
1096
+ provider: {
1097
+ type: "string",
1098
+ description: "Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')"
1099
+ }
1100
+ },
1101
+ required: ["name"]
1102
+ },
1103
+ human_oversight: {
1104
+ type: "string",
1105
+ description: "Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 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`.",
1106
+ enum: ["none", "prompt_only", "selected", "edited", "directed"],
1107
+ enumDescriptions: {
1108
+ none: "Fully automated with no human involvement in generation",
1109
+ prompt_only: "Human provided the prompt or instructions but did not review outputs",
1110
+ selected: "Human selected from multiple AI-generated candidates",
1111
+ edited: "Human edited or refined AI-generated output",
1112
+ directed: "Human directed the creative process with AI as an assistive tool"
1113
+ }
1114
+ },
1115
+ declared_by: {
1116
+ type: "object",
1117
+ description: "Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.",
1118
+ properties: {
1119
+ agent_url: {
1120
+ type: "string",
1121
+ format: "uri",
1122
+ description: "URL of the agent or service that declared this provenance"
1123
+ },
1124
+ role: {
1125
+ type: "string",
1126
+ enum: ["creator", "advertiser", "agency", "platform", "tool"],
1127
+ description: "Role of the declaring party in the supply chain",
1128
+ enumDescriptions: {
1129
+ creator: "The party that created or generated the content",
1130
+ advertiser: "The brand or advertiser that owns the content",
1131
+ agency: "Agency acting on behalf of the advertiser",
1132
+ platform: "Ad platform or publisher that processed the content",
1133
+ tool: "Automated tool or service that attached provenance metadata"
1134
+ }
1135
+ }
1136
+ },
1137
+ required: ["role"]
1138
+ },
1139
+ declared_at: {
1140
+ type: "string",
1141
+ format: "date-time",
1142
+ description: "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."
1143
+ },
1144
+ created_time: {
1145
+ type: "string",
1146
+ format: "date-time",
1147
+ description: "When this content was created or generated (ISO 8601)"
1148
+ },
1149
+ c2pa: {
1150
+ type: "object",
1151
+ description: "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.",
1152
+ properties: {
1153
+ manifest_url: {
1154
+ type: "string",
1155
+ format: "uri",
1156
+ description: "URL to the C2PA manifest store for this content"
1157
+ }
1158
+ },
1159
+ required: ["manifest_url"]
1160
+ },
1161
+ embedded_provenance: {
1162
+ type: "array",
1163
+ description: "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`).",
1164
+ minItems: 1,
1165
+ items: {
1166
+ type: "object",
1167
+ properties: {
1168
+ method: {
1169
+ $ref: "/schemas/enums/embedded-provenance-method.json",
1170
+ description: "How provenance data is carried within the content"
1171
+ },
1172
+ standard: {
1173
+ type: "string",
1174
+ description: "Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)"
1175
+ },
1176
+ provider: {
1177
+ type: "string",
1178
+ description: "Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."
1179
+ },
1180
+ verify_agent: {
1181
+ type: "object",
1182
+ description: "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 \u2014 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).",
1183
+ properties: {
1184
+ agent_url: {
1185
+ type: "string",
1186
+ format: "uri",
1187
+ pattern: "^https://",
1188
+ description: "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."
1189
+ },
1190
+ feature_id: {
1191
+ type: "string",
1192
+ description: "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."
1193
+ }
1194
+ },
1195
+ required: ["agent_url"],
1196
+ additionalProperties: false
1197
+ },
1198
+ embedded_at: {
1199
+ type: "string",
1200
+ format: "date-time",
1201
+ description: "When the provenance data was embedded (ISO 8601)"
1202
+ }
1203
+ },
1204
+ required: ["method", "provider"]
1205
+ }
1206
+ },
1207
+ watermarks: {
1208
+ type: "array",
1209
+ description: "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`).",
1210
+ minItems: 1,
1211
+ items: {
1212
+ type: "object",
1213
+ properties: {
1214
+ media_type: {
1215
+ $ref: "/schemas/enums/watermark-media-type.json",
1216
+ description: "Media category of the watermarked content"
1217
+ },
1218
+ provider: {
1219
+ type: "string",
1220
+ description: "Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."
1221
+ },
1222
+ verify_agent: {
1223
+ type: "object",
1224
+ description: "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 \u2014 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).",
1225
+ properties: {
1226
+ agent_url: {
1227
+ type: "string",
1228
+ format: "uri",
1229
+ pattern: "^https://",
1230
+ description: "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."
1231
+ },
1232
+ feature_id: {
1233
+ type: "string",
1234
+ description: "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."
1235
+ }
1236
+ },
1237
+ required: ["agent_url"],
1238
+ additionalProperties: false
1239
+ },
1240
+ c2pa_action: {
1241
+ $ref: "/schemas/enums/c2pa-watermark-action.json",
1242
+ description: "C2PA action classification for this watermark"
1243
+ },
1244
+ embedded_at: {
1245
+ type: "string",
1246
+ format: "date-time",
1247
+ description: "When the watermark was applied (ISO 8601)"
1248
+ }
1249
+ },
1250
+ required: ["media_type", "provider"]
1251
+ }
1252
+ },
1253
+ disclosure: {
1254
+ type: "object",
1255
+ description: "Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.",
1256
+ properties: {
1257
+ required: {
1258
+ type: "boolean",
1259
+ description: "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 \u2014 useful as a routing and audit input \u2014 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."
1260
+ },
1261
+ jurisdictions: {
1262
+ type: "array",
1263
+ description: "Jurisdictions where disclosure obligations apply",
1264
+ items: {
1265
+ type: "object",
1266
+ properties: {
1267
+ country: {
1268
+ type: "string",
1269
+ description: "ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"
1270
+ },
1271
+ region: {
1272
+ type: "string",
1273
+ description: "Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)"
1274
+ },
1275
+ regulation: {
1276
+ type: "string",
1277
+ description: "Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"
1278
+ },
1279
+ label_text: {
1280
+ type: "string",
1281
+ description: "Required disclosure label text for this jurisdiction, in the local language"
1282
+ },
1283
+ render_guidance: {
1284
+ type: "object",
1285
+ description: "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.",
1286
+ minProperties: 1,
1287
+ properties: {
1288
+ persistence: {
1289
+ $ref: "/schemas/enums/disclosure-persistence.json",
1290
+ description: "How long the disclosure must persist during content playback or display"
1291
+ },
1292
+ min_duration_ms: {
1293
+ type: "integer",
1294
+ minimum: 1,
1295
+ description: "Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 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."
1296
+ },
1297
+ positions: {
1298
+ type: "array",
1299
+ description: "Preferred disclosure positions in priority order. The first position a format supports should be used.",
1300
+ items: {
1301
+ $ref: "/schemas/enums/disclosure-position.json"
1302
+ },
1303
+ minItems: 1,
1304
+ uniqueItems: true
1305
+ },
1306
+ ext: {
1307
+ $ref: "/schemas/core/ext.json"
1308
+ }
1309
+ }
1310
+ }
1311
+ },
1312
+ required: ["country", "regulation"]
1313
+ },
1314
+ minItems: 1
1315
+ }
1316
+ },
1317
+ required: ["required"]
1318
+ },
1319
+ verification: {
1320
+ type: "array",
1321
+ description: "Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 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.",
1322
+ minItems: 1,
1323
+ items: {
1324
+ type: "object",
1325
+ properties: {
1326
+ verified_by: {
1327
+ type: "string",
1328
+ description: "Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"
1329
+ },
1330
+ verified_time: {
1331
+ type: "string",
1332
+ format: "date-time",
1333
+ description: "When the verification was performed (ISO 8601)"
1334
+ },
1335
+ result: {
1336
+ type: "string",
1337
+ enum: ["authentic", "ai_generated", "ai_modified", "inconclusive"],
1338
+ description: "Verification outcome"
1339
+ },
1340
+ confidence: {
1341
+ type: "number",
1342
+ minimum: 0,
1343
+ maximum: 1,
1344
+ description: "Confidence score of the verification result (0.0 to 1.0)"
1345
+ },
1346
+ details_url: {
1347
+ type: "string",
1348
+ format: "uri",
1349
+ description: "URL to the full verification report"
1350
+ }
1351
+ },
1352
+ required: ["verified_by", "result"]
1353
+ }
1354
+ },
1355
+ ext: {
1356
+ $ref: "/schemas/core/ext.json"
1357
+ }
1358
+ }
1359
+ },
1360
+ {
1361
+ $schema: "http://json-schema.org/draft-07/schema#",
1362
+ $id: "/schemas/enums/digital-source-type.json",
1363
+ title: "Digital Source Type",
1364
+ description: "Classification of AI involvement in content creation, aligned with IPTC digitalsourcetype vocabulary. Used in provenance metadata to declare how a creative asset, artifact, or individual asset was produced.",
1365
+ type: "string",
1366
+ enum: [
1367
+ "digital_capture",
1368
+ "digital_creation",
1369
+ "trained_algorithmic_media",
1370
+ "composite_with_trained_algorithmic_media",
1371
+ "algorithmic_media",
1372
+ "composite_capture",
1373
+ "composite_synthetic",
1374
+ "human_edits",
1375
+ "data_driven_media"
1376
+ ],
1377
+ enumDescriptions: {
1378
+ digital_capture: "Captured by a digital device (camera, scanner, screen recording) with no AI involvement",
1379
+ digital_creation: "Created by a human using digital tools (Photoshop, Illustrator, After Effects) without AI generation",
1380
+ trained_algorithmic_media: "Generated entirely by a trained AI model (DALL-E, Midjourney, Stable Diffusion, Sora)",
1381
+ composite_with_trained_algorithmic_media: "Human-created content combined with AI-generated elements (e.g., photo with AI background)",
1382
+ algorithmic_media: "Produced by deterministic algorithms without machine learning (procedural generation, rule-based systems)",
1383
+ composite_capture: "Multiple digital captures composited together without AI",
1384
+ composite_synthetic: "Composite of multiple elements where at least one is AI-generated (e.g., stock photo composited with AI-generated background)",
1385
+ human_edits: "Content augmented, corrected, or enhanced by humans using non-generative tools",
1386
+ data_driven_media: "Assembled from structured data feeds (DCO templates, product catalogs, weather-triggered variants)"
1387
+ }
1388
+ },
1389
+ {
1390
+ $schema: "http://json-schema.org/draft-07/schema#",
1391
+ $id: "/schemas/enums/embedded-provenance-method.json",
1392
+ title: "Embedded Provenance Method",
1393
+ description: "How provenance data is carried within the content stream. Distinguishes between format-level manifest embedding (where the manifest travels inside the file container) and provenance markers (where invisible markers in the content itself encode or reference a provenance record). Both survive operations that strip sidecar metadata, but provenance markers additionally survive content-level transformations such as copy-paste, reformatting, and CMS re-encoding.",
1394
+ type: "string",
1395
+ enum: ["manifest_wrapper", "provenance_markers"],
1396
+ enumDescriptions: {
1397
+ manifest_wrapper: "A provenance manifest embedded in the file container per format-specific rules (e.g., JUMBF box in JPEG, C2PATextManifestWrapper in plaintext per C2PA Section A.7). The manifest travels with the file but is tied to the file's byte structure.",
1398
+ provenance_markers: "Invisible markers embedded within the content stream that encode or reference a provenance record. Designed to survive reformatting, copy-paste, CMS ingestion, and ad-server transcoding that breaks file-level bindings."
1399
+ }
1400
+ },
1401
+ {
1402
+ $schema: "http://json-schema.org/draft-07/schema#",
1403
+ $id: "/schemas/enums/watermark-media-type.json",
1404
+ title: "Watermark Media Type",
1405
+ description: "Media category of a content watermark. Identifies what kind of content the watermark is applied to, which determines the detection and verification methods required.",
1406
+ type: "string",
1407
+ enum: ["audio", "image", "video", "text"],
1408
+ enumDescriptions: {
1409
+ audio: "Watermark applied to audio content (e.g., spread-spectrum, echo hiding)",
1410
+ image: "Watermark applied to image content (e.g., spatial domain, frequency domain)",
1411
+ video: "Watermark applied to video content (e.g., per-frame image watermarking, temporal watermarking)",
1412
+ text: "Watermark applied to text content (e.g., synonym substitution, structural modification)"
1413
+ }
1414
+ },
1415
+ {
1416
+ $schema: "http://json-schema.org/draft-07/schema#",
1417
+ $id: "/schemas/enums/c2pa-watermark-action.json",
1418
+ title: "C2PA Watermark Action",
1419
+ description: "C2PA action classification for a content watermark. Distinguishes watermarks that are cryptographically linked to a C2PA manifest (bound) from watermarks that exist independently (unbound). Aligns with the c2pa.watermarked.* action family in the C2PA action taxonomy.",
1420
+ type: "string",
1421
+ enum: ["c2pa.watermarked.bound", "c2pa.watermarked.unbound"],
1422
+ enumDescriptions: {
1423
+ "c2pa.watermarked.bound": "Watermark linked to a C2PA manifest for this asset. The watermark and manifest are mutually reinforcing: the manifest references the watermark, and the watermark can be used to locate the manifest.",
1424
+ "c2pa.watermarked.unbound": "Watermark independent of any C2PA manifest. Applied before any provenance signing event (e.g., by the AI generator at creation time) or in pipelines where no manifest is present."
1425
+ }
1426
+ },
1427
+ {
1428
+ $schema: "http://json-schema.org/draft-07/schema#",
1429
+ $id: "/schemas/enums/disclosure-persistence.json",
1430
+ title: "Disclosure Persistence",
1431
+ description: "How long a disclosure must persist during content playback or display. Different jurisdictions and regulations require different persistence behaviors for AI-generated content labels. When multiple sources specify persistence for the same jurisdiction (e.g., brief and provenance), the most restrictive mode applies: continuous > initial > flexible.",
1432
+ type: "string",
1433
+ enum: ["continuous", "initial", "flexible"],
1434
+ enumDescriptions: {
1435
+ continuous: "Disclosure must remain visible or audible throughout the entire content display duration. For video and audio, this means the full playback duration. For static formats (display, DOOH), this means the full display slot. For DOOH specifically, 'content duration' means the ad's display slot within the rotation, not the screen's full rotation cycle.",
1436
+ initial: "Disclosure must appear at the start of content for a minimum duration before it may be removed. Pair with min_duration_ms in render_guidance or creative brief to specify the required duration.",
1437
+ flexible: "Disclosure presence is sufficient; placement timing and duration are at the publisher's discretion"
1438
+ }
1439
+ },
1440
+ {
1441
+ $schema: "http://json-schema.org/draft-07/schema#",
1442
+ $id: "/schemas/enums/disclosure-position.json",
1443
+ title: "Disclosure Position",
1444
+ description: "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.",
1445
+ type: "string",
1446
+ enum: ["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]
1447
+ }
1448
+ ];